aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore3
-rw-r--r--.gitlab-ci.yml14
-rw-r--r--basicConfig/default_config.properties43
-rw-r--r--basicConfig/properties/messages.properties82
-rw-r--r--basicConfig/properties/messages_de.properties75
-rw-r--r--basicConfig/templates/countrySelection.html52
-rw-r--r--basicConfig/templates/countrySelection_example.html179
-rw-r--r--basicConfig/templates/eidas_node_forward.html2
-rw-r--r--basicConfig/templates/error_message.html46
-rw-r--r--basicConfig/templates/language_selection.html12
-rw-r--r--basicConfig/templates/other_login_method.html153
-rw-r--r--basicConfig/templates/pvp2_post_binding.html4
-rw-r--r--basicConfig/templates/residency.html285
-rw-r--r--basicConfig/webcontent/autocommit.js5
-rw-r--r--basicConfig/webcontent/css/css_country.css320
-rw-r--r--basicConfig/webcontent/css/css_error.css26
-rw-r--r--basicConfig/webcontent/img/ajax-loader.gifbin0 -> 673 bytes
-rw-r--r--basicConfig/webcontent/js/jquery-3.6.0.min.js2
-rw-r--r--build_reporting/pom.xml15
-rw-r--r--connector/pom.xml34
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java21
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java4
-rw-r--r--connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java9
-rw-r--r--connector/src/main/resources/application.properties42
-rw-r--r--connector/src/main/resources/properties/messages.properties3
-rw-r--r--connector/src/main/resources/properties/messages_de.properties3
-rw-r--r--connector/src/main/resources/properties/status_messages_en.properties3
-rw-r--r--connector/src/main/resources/specific_eIDAS_connector.beans.xml60
-rw-r--r--connector/src/main/resources/templates/countrySelection.html501
-rw-r--r--connector/src/main/resources/templates/eidas_node_forward.html36
-rw-r--r--connector/src/main/resources/templates/error_message.html20
-rw-r--r--connector/src/main/resources/templates/other_login_method.html90
-rw-r--r--connector/src/main/resources/templates/pvp2_post_binding.html4
-rw-r--r--connector/src/main/resources/templates/residency.html251
-rw-r--r--connector/src/main/webapp/css/basic.css4
-rw-r--r--connector/src/main/webapp/img/ajax-loader.gifbin0 -> 673 bytes
-rw-r--r--connector/src/main/webapp/js/jquery-3.6.0.min.js2
-rw-r--r--connector/src/main/webapp/js/js_country.js42
-rw-r--r--connector/src/test/java/at/asitplus/eidas/specific/connector/test/FullStartUpAndProcessTest.java303
-rw-r--r--connector/src/test/java/at/asitplus/eidas/specific/connector/test/config/MsConnectorMessageSourceTest.java71
-rw-r--r--connector/src/test/java/at/asitplus/eidas/specific/connector/test/saml2/Pvp2SProfileEndPointTest.java178
-rw-r--r--connector/src/test/resources/config/junit_config_1_springboot.properties58
-rw-r--r--connector/src/test/resources/config/junit_config_2_springboot.properties57
-rw-r--r--connector/src/test/resources/config/keys/junit_test.jksbin0 -> 8410 bytes
-rw-r--r--connector/src/test/resources/config/properties/messages.properties36
-rw-r--r--connector/src/test/resources/config/properties/messages_de.properties33
-rw-r--r--connector/src/test/resources/config/templates/countrySelection.html461
-rw-r--r--connector/src/test/resources/config/templates/countrySelection_example.html210
-rw-r--r--connector/src/test/resources/config/templates/eidas_node_forward.html2
-rw-r--r--connector/src/test/resources/config/templates/error.html53
-rw-r--r--connector/src/test/resources/config/templates/error_message.html20
-rw-r--r--connector/src/test/resources/config/templates/other_login_method.html90
-rw-r--r--connector/src/test/resources/config/templates/pvp2_post_binding.html4
-rw-r--r--connector/src/test/resources/config/templates/residency.html251
-rw-r--r--connector/src/test/resources/config/webcontent/autocommit.js5
-rw-r--r--connector/src/test/resources/config/webcontent/css/css_country.css293
-rw-r--r--connector/src/test/resources/config/webcontent/css/css_error.css26
-rw-r--r--connector/src/test/resources/config/webcontent/img/ajax-loader.gifbin0 -> 673 bytes
-rw-r--r--connector/src/test/resources/config/webcontent/js/jquery-3.6.0.js10881
-rw-r--r--connector/src/test/resources/config/webcontent/js/js_country.js58
-rw-r--r--connector/src/test/resources/spring/SpringTest_connector.beans.xml17
-rw-r--r--infos/Handbuch_MS-eIDAS-Node.docxbin44039 -> 47601 bytes
-rw-r--r--infos/history.txt17
-rw-r--r--infos/readme_1.3.0.md62
-rw-r--r--licenses/IAIK-LICENSE.txt108
-rw-r--r--licenses/SIC_LICENSE.txt197
-rw-r--r--modules/authmodule-eIDAS-v2/checks/spotbugs-exclude.xml8
-rw-r--r--modules/authmodule-eIDAS-v2/pom.xml145
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java234
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasAuthenticationSpringResourceProvider.java6
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java199
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java857
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/IErnpClient.java114
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrClient.java479
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrService.java (renamed from modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrService.java)4
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/IZmrClient.java113
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrAddressSoapClient.java286
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java874
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/config/EidasConnectorMessageSource.java21
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/controller/AdresssucheController.java195
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MatchedPersonResult.java45
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java54
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SelectedLoginMethod.java5
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java108
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleMobileSignatureData.java57
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java81
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ErnpRestCommunicationException.java29
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java44
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java94
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ZmrCommunicationException.java38
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java169
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java56
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java82
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/INationalEidProcessor.java16
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java53
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthConstants.java102
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthEventConstants.java7
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthMetadataConfiguration.java463
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthRequestBuilderConfiguration.java300
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthMetadataController.java122
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthSignalController.java95
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthCredentialProvider.java132
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthHealthCheck.java80
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthMetadataProvider.java169
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/CcSpecificEidProcessingService.java4
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/ICcSpecificEidProcessingService.java10
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java447
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrClient.java540
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/AlternativeSearchTask.java246
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java537
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java105
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAustrianResidenceGuiTask.java105
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java288
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateMobilePhoneSignatureRequestTask.java145
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java112
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java211
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java236
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseAlternativeTask.java195
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java118
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java403
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java128
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java262
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/LoggingHandler.java24
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/MatchingTaskUtils.java192
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/VersionHolder.java40
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml87
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml118
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth_ref_impl_config.beans.xml39
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/messages/eidas_connector_message.properties33
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/templates/eidas_node_forward.html2
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkRequest.xml58
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkResponse.xml12422
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseRequest.xml59
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseResponse.xml92
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienRequest.xml52
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienResponse.xml478
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlRequest.xml60
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlResponse.xml311
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Messages.xsd50
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Service.wsdl62
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext.xsd150
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext_pvp.xsd152
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Messages.xsd27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Service.xsd40
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AbfrageMuster.xsd140
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AkademischerGradFelder.xsd61
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Blaettern.xsd56
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/DokumentFelder.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/EingebundenProxy.xsd28
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Entity.xsd135
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoFachlich.xsd103
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoTechnisch.xsd103
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/MeldungFelder.xsd283
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonDataZMR.xsd741
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonExport.xsd107
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonFelder.xsd70
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/SimpleTypes.xsd173
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/W3C-XMLDSig.xsd274
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Workflow.xsd200
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/Adresssuche.xsd128
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/ZMRProxy.xsd33
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/ernp_client/openapi.json1940
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.1.WSDL939
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.WSDL901
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR_v4.0.wsdl441
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp1.xsd133
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp19.xsd133
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr.xsd388
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_ecdsa.xsd30
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_persondata.xsd54
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_pvp_sec.xsd10
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-schemas.xml54
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-wsdl.xml10
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0.xsd443
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_xmldsig.xsd31
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/soapenv.xsd125
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenrequest.xml22
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenresponse.xml194
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternrequest.xml27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternresponse.xml195
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionrequest.xml32
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionresponse.xml82
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucherequest.xml32
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucheresponse.xml81
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe1.xml33
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe2.xml27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe1.xml76
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe2.xml200
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenrequest.xml26
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenresponse.xml83
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfragerequest.xml31
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfrageresponse.xml68
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichrequest.xml26
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichresponse.xml91
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfragerequest.xml31
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfrageresponse.xml45
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest1.xml30
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest2.xml23
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse1.xml50
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse2.xml91
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfragerequest.xml35
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfrageresponse.xml213
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftrequest.xml44
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftresponse.xml75
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungrequest.xml26
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungresponse.xml72
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/blaetternrequest.xml27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/wehrpflichtigeAbfragenRequst.xml31
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/natuerlicheperson.xml30
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest1.xml40
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest2.xml42
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse1.xml85
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse2.xml110
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenrequest.xml56
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenresponse.xml118
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternrequest.xml27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternresponse.xml210
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckrequest.xml23
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckresponse.xml51
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragerequest.xml37
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfrageresponse.xml209
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternrequest.xml27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternresponse.xml210
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucherequest.xml37
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucheresponse.xml209
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennenrequest.xml37
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennensucherequest.xml21
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrenrequest.xml37
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrensucherequest.xml22
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenrequest.xml40
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenresponse.xml77
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenrequest.xml48
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenresponse.xml79
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenrequest.xml60
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenresponse.xml124
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungrequest.xml25
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungresponse.xml64
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Messages.xsd215
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Service.wsdl62
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext.xsd150
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext_pvp.xsd152
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Auswertungen.xsd200
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/BasTabelleAbfrage.xsd193
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Benutzereinstellungen.xsd102
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/GeschaeftsprozesseAuflisten.xsd64
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Messages.xsd27
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Organisationseinstellungen.xsd151
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Service.xsd40
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AbfrageMuster.xsd140
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AkademischerGradFelder.xsd61
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Blaettern.xsd56
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/DokumentFelder.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/EingebundenProxy.xsd28
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Entity.xsd135
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoFachlich.xsd103
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoTechnisch.xsd103
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/MeldungFelder.xsd283
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonDataZMR.xsd741
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonExport.xsd107
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonFelder.xsd70
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Protokollierung.xsd496
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/SimpleTypes.xsd173
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/W3C-XMLDSig.xsd274
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Workflow.xsd200
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/gis-schnittstelle.xsd171
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/pvp1.xsd174
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/secext.xsd150
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/soapenv.xsd129
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AblaufendeAuskunftssperrenSuche.xsd76
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adoption.xsd63
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adresssuche.xsd128
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Anwendungsintegration.xsd97
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AnwendungsintegrationWiederholung.xsd117
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AuskunftssperreAendern.xsd55
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAendern.xsd93
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAnlegen.xsd60
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoFreigeben.xsd69
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Avisosuche.xsd124
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BKMeldeauskunft.xsd69
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BPKPruefung.xsd76
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Behoerdenabfrage.xsd126
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BehoerdenattributeAendern.xsd68
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Bestandsaenderungen.xsd140
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerAnfrage.xsd131
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Businesspartnerabfrage.xsd94
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerabfrageErweitert.xsd67
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Datenabgleich.xsd280
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ErnpAbfrage.xsd191
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Fremdenabfrage.xsd108
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISAdressabfrage.xsd79
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISSuche.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gemeindeeinstellungen.xsd71
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gerichtskommissaerabfrage.xsd93
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GleichsetzungstabelleWarten.xsd185
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Hauseigentuemerabfrage.xsd117
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/IAPPersonenabfrage.xsd120
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldeauskunft.xsd102
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldebestaetigung.xsd127
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldebestaetigungenAnfordern.xsd55
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldungHistKorrigieren.xsd112
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ORFGISAnforderung.xsd65
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheMindestsicherung.xsd88
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheSteuerfahndung.xsd91
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAendern.xsd78
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAnlegen.xsd67
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonExport.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonKorrigieren.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonTrennen.xsd75
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonZusammenfuehren.xsd75
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonenIndex.xsd73
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenabfrage.xsd139
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenlisten.xsd131
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personensuche.xsd255
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZAuswertung.xsd82
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZBearbeiten.xsd71
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZREinzelabfrage.xsd85
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonenbindung.xsd84
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonensuche.xsd75
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRSammelabfrage.xsd54
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Sperrliste.xsd129
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Storno.xsd146
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SzrAbfrage.xsd59
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/TechnischeAnsicht.xsd132
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Ummeldeserviceabfrage.xsd79
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WehrpflichtigeAbfragen.xsd99
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAbmelden.xsd68
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAnmelden.xsd68
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzKorrigieren.xsd73
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzUmmelden.xsd126
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRDatenauszug.xsd32
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRProxy.xsd96
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZmrBuergerService.xsd373
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Zuzugsbestaetigung.xsd105
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/AkademischerGrad.xsd84
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Auskunftssperre.xsd95
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Aviso.xsd176
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Behoerdenattribute.xsd67
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPAnschrift.xsd73
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPPerson.xsd114
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd107
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd.svntmp106
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Meldung.xsd189
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Person.xsd233
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Qualifikationskennzeichen.xsd75
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Reisedokument.xsd82
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Staatsangehoerigkeit.xsd73
-rw-r--r--modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Standarddokument.xsd74
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java131
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java294
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientProductionTest.java486
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientTest.java1085
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientProductionTest.java140
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientTest.java (renamed from modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java)253
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrAddressSearchClientProductionTest.java169
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientProductionTest.java478
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java1242
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/config/EidasConnectorMessageSourceTest.java43
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyAuthConfigMap.java144
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyOA.java304
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyPendingRequest.java8
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/IAhSpConfiguration.java152
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/DeSpecificDetailSearchProcessorTest.java105
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/ItSpecificDetailSearchProcessorTes.java84
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaAuthSignalControllerTest.java197
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthHealthCheckTest.java130
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataControllerTest.java136
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderFirstTest.java239
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderSecondTest.java66
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientCredentialProviderTest.java414
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java1042
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java379
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java350
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateNewErnpEntryTaskTest.java198
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAustrianResidenceGuiTaskTest.java172
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateMobilePhoneSignatureRequestTaskTest.java282
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateOtherLoginMethodGuiTaskTest.java293
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java939
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java683
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskRegisterTest.java339
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskTest.java320
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAuthnResponseTaskTest.java254
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java69
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveMobilePhoneSignatureResponseTaskTest.java502
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveOtherLoginMethodGuiResponseTaskTest.java154
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java55
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java47
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java7
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java2
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java221
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_lazy.xml24
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml3
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_ccSearchProcessor_test.xml17
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml37
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties57
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1_springboot.properties143
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties7
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_3.properties7
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties7
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_de_attributes.properties7
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/keys/junit_test.jksbin0 -> 8410 bytes
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/config/keys/teststore.jksbin0 -> 2028 bytes
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID.xml52
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID_deprecated_bpk_encoding.xml52
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_wrong_destination_endpoint.xml56
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_classpath_entityid.xml50
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error.xml46
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_empty_subcode.xml46
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_userstop.xml46
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_without_subcode.xml45
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_req.json30
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_resp.json60
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_req.json19
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_resp.json62
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_req.json17
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_resp.json60
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_req.json20
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_resp.json62
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_req.json30
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_resp.json60
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_req.json19
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_resp.json62
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_req.json14
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_resp.json69
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_req.json30
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_resp.json62
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_req.json18
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_resp.json44
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_multi_resp.json84
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_req.json18
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_empty_resp.json1
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_handbook_example.json85
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/error_resp.json12
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_classpath_entity.xml146
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig.xml46
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig2.xml46
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_notvalid.xml84
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_valid_wrong_alg.xml74
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/pvp_postbinding_template.html3
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/sp_metadata_junit.xml66
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/empty_zmr_result.xml39
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/no_bpk_zp.xml290
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp.xml290
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_historicIncluded.xml389
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne.xml488
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne_2.xml465
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-2_search_with_mds_resp.xml181
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml185
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-6_kitt_update_resp.xml146
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml336
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml221
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-10_kitt_update_resp.xml123
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml208
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-6_kitt_update_resp.xml123
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml300
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/keystore/junit_test.jksbin0 -> 8410 bytes
-rw-r--r--modules/authmodule-eIDAS-v2/src/test/resources/keystore/pvp.p12bin0 -> 5494 bytes
-rw-r--r--modules/core_common_lib/pom.xml20
-rw-r--r--modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/MsEidasNodeConstants.java29
-rw-r--r--modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/gui/config/StaticResourceConfiguration.java (renamed from modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/config/StaticResourceConfiguration.java)2
-rw-r--r--modules/core_common_lib/src/main/resources/common_gui.beans.xml3
-rw-r--r--modules/core_common_webapp/pom.xml2
-rw-r--r--modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/provider/StatusMessageProvider.java8
-rw-r--r--modules/core_common_webapp/src/main/resources/specific_eIDAS_core.beans.xml2
-rw-r--r--modules/core_common_webapp/src/test/resources/spring/SpringTest_core.beans.xml2
-rw-r--r--modules/pom.xml2
-rw-r--r--pom.xml98
466 files changed, 80829 insertions, 4225 deletions
diff --git a/.gitignore b/.gitignore
index 9be35422..bfa6e4b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,3 +12,6 @@ target
.metadata
*.iml
notCommit
+.idea
+connector/ignite
+ignite/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 22f45cd1..9dd8d862 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -20,8 +20,8 @@ include:
default:
tags:
- - docker
-
+ - docker
+
stages:
- assemble
- test
@@ -37,9 +37,10 @@ assemble:
except:
- tags
script: |
- mvn $MAVEN_CLI_OPTS generate-sources compile test
+ mkdir ./target
+ mvn $MAVEN_CLI_OPTS --log-file ./target/mvn_build.log generate-sources compile test
after_script:
- - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION
+ - awk -F"," '{ instructions += $4 + $5; covered += $5 } END { print covered, "/", instructions, " instructions covered"; print 100*covered/instructions, "% covered" }' $JACOCO_CSV_LOCATION
coverage: '/([0-9]{1,3}.[0-9]*).%.covered/'
artifacts:
when: always
@@ -48,6 +49,7 @@ assemble:
paths:
- $JACOCO_CSV_LOCATION
- $JACOCO_XML_LOCATION
+ - "**/target/mvn_build.log"
buildDistributionPackage:
@@ -64,7 +66,7 @@ buildDistributionPackage:
name: "${CI_PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}"
when: always
reports:
- dotenv: variables.env
+ dotenv: variables.env
paths:
- $PROJECT_RELEASE_PACKAGE
@@ -85,4 +87,4 @@ release:
name: "${CI_PROJECT_NAME}-${CI_COMMIT_SHORT_SHA}-release"
expire_in: never
paths:
- - $PROJECT_RELEASE_PACKAGE
+ - $PROJECT_RELEASE_PACKAGE
diff --git a/basicConfig/default_config.properties b/basicConfig/default_config.properties
index 2ea12b17..63f28373 100644
--- a/basicConfig/default_config.properties
+++ b/basicConfig/default_config.properties
@@ -17,26 +17,52 @@ eidas.ms.revisionlog.logIPAddressOfUser=true
eidas.ms.core.pendingrequestid.digist.secret=pendingReqIdSecret
-## eIDAS Ref. Implementation connector ###
+#############################################
+#### eIDAS Ref. Implementation connector ####
eidas.ms.auth.eIDAS.eid.testidentity.default=false
+## eIDAS Request configuration
+eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs=Austria
+
eidas.ms.auth.eIDAS.node_v2.entityId=ownSpecificConnector
eidas.ms.auth.eIDAS.node_v2.forward.endpoint=
+
+#############################################
+#### eIDAS identity-matching ######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=pkcs12
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/....
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=
+eidas.ms.auth.eIDAS.zmrclient.ssl.key.alias=
+eidas.ms.auth.eIDAS.zmrclient.ssl.key.password=
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=
+
+# ERnP communication
+eidas.ms.auth.eIDAS.ernpclient.endpoint=
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=pkcs12
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=keys/....
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=
+eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=
+
+
+#############################################
+#### SZR communication ######
eidas.ms.auth.eIDAS.szrclient.useTestService=true
eidas.ms.auth.eIDAS.szrclient.endpoint.prod=
eidas.ms.auth.eIDAS.szrclient.endpoint.test=http://localhost:1234/demoszr
eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.type=pkcs12
eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.path=keys/.....
eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.password=
-eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.path=
-eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.password=
-
-## eIDAS Request configuration
-eidas.ms.auth.eIDAS.node_v2.staticProviderNameForPublicSPs=Austria
+eidas.ms.auth.eIDAS.szrclient.ssl.key.alias=
+eidas.ms.auth.eIDAS.szrclient.ssl.key.password=
-## E-AuthBlock configuration
+#############################################
+#### IDA-AuthBlock configuration ######
eidas.ms.auth.eIDAS.authblock.keystore.type=jks
eidas.ms.auth.eIDAS.authblock.keystore.path=keys/teststore.jks
eidas.ms.auth.eIDAS.authblock.keystore.password=f/+saJBc3a}*/T^s
@@ -44,7 +70,8 @@ eidas.ms.auth.eIDAS.authblock.key.alias=connectorkeypair
eidas.ms.auth.eIDAS.authblock.key.password=f/+saJBc3a}*/T^s
-## PVP2 S-Profile end-point configuration
+#################################################
+#### PVP2 S-Profile end-point configuration ####
eidas.ms.pvp2.keystore.type=jks
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
diff --git a/basicConfig/properties/messages.properties b/basicConfig/properties/messages.properties
index 0420d8b9..f5bba0d5 100644
--- a/basicConfig/properties/messages.properties
+++ b/basicConfig/properties/messages.properties
@@ -18,6 +18,7 @@ gui.countryselection.header1=Federal Ministry of Internal Affairs
gui.countryselection.header2=Austrian Central eIDAS Node
gui.countryselection.header3=Operated by Federal Ministry of Internal Affairs
gui.countryselection.header.selection=Select your country
+gui.countryselection.cancel=Cancel
gui.countryselection.cancle=Cancel
gui.countryselection.notsupportedinfo=If you cannot find your country in this list then your electronic identity (eID) is not yet supported.
@@ -31,6 +32,17 @@ gui.countryselection.infos.general.part.4=, which regulates the mutual cross-bor
gui.countryselection.infos.general.part.5=After selecting your home country on this page, you are forwarded to the familiar login environment of the selected member state. There, you can login with your eID as usual. After successful completion of the login process, you are automatically forwarded and logged in to the online service, from which you have been redirected to this page. During your first login, your eID data is also registered in the
gui.countryselection.infos.general.part.6=This ensures that you will also be successfully and uniquely identified in subsequent logins at Austrian online services.
+gui.matching.otherloginmethod.header=Assignment of your login information
+gui.matching.otherloginmethod.info.text=Your login information could not be clearly integrated into the Austrian eID system. Further information is required for an unique integration.
+gui.matching.otherloginmethod.ida=You have an ID Austria
+gui.matching.otherloginmethod.eidas=You can provide additional information via eIDAS
+gui.matching.otherloginmethod.residence=Have you ever lived in Austria?
+gui.matching.otherloginmethod.addmeasnew=Add me as new entity in Austrian eID system
+
+gui.matching.otherloginmethod.error.title=Matching of further information failed:
+gui.matching.otherloginmethod.error.msg=No identity match with additional information. Use another option or provide more information.
+
+
gui.countryselection.country.be=Belgium
gui.countryselection.country.be.logo.alt=Belgium-eID
gui.countryselection.country.hr=Croatia
@@ -86,15 +98,79 @@ gui.countryselection.country.ro=Romania
gui.countryselection.country.ro.logo.alt=Romania-eID
gui.countryselection.country.sk=Slovakia
gui.countryselection.country.sk.logo.alt=Slovakia-eID
-gui.countryselection.country.sw=Sweden
-gui.countryselection.country.sw.logo.alt=Sweden-eID
+gui.countryselection.country.se=Sweden
+gui.countryselection.country.se.logo.alt=Sweden-eID
gui.countryselection.country.uk=United Kingdom
gui.countryselection.country.uk.logo.alt=United Kingdom-eID
+gui.countryselection.country.ie=Ireland
+gui.countryselection.country.ie.logo.alt=Ireland-eID
+gui.countryselection.country.sw=Sweden
+gui.countryselection.country.sw.logo.alt=Sweden-eID
+
gui.countryselection.country.testcountry=TestCountry
gui.countryselection.country.testcountry.logo.alt=Testcountry-eID
+gui.countryselection.country.eu.validation=EC Validation-Service
+gui.countryselection.country.eu.logo.alt=EC Validation-Service
+
gui.countryselection.mode.prod=Production
gui.countryselection.mode.qs=QS
gui.countryselection.mode.test=Test
-gui.countryselection.mode.dev=Development \ No newline at end of file
+gui.countryselection.mode.dev=Development
+
+##Other Login Methods page
+gui.otherlogin.title=eIDAS-Login Other Login Methods
+gui.otherlogin.header.selection=Personal data not found
+
+gui.otherlogin.info.first=Your personal data from the conducted EU login could not be clearly assigned to any register entry in the registers of the Austrian administration. This may be due to a missing register entry of your personal data, or an incorrect match of your login data and your register entry stored in the registers.
+gui.otherlogin.info.second=The following describes options to achieve a correct assignment:
+gui.otherlogin.info.list.1=If you have an Austrian Mobile-Phone Signature (or ID Austria) or an alternative possibility of an EU login, please log in again using one of these options. For this purpose, please use the corresponding button for “ID Austria” or “Alternative EU-Login”.
+gui.otherlogin.info.list.2=If you do not have either of the two additional registration options mentioned above, please continue with the button “No alternative login”.
+
+gui.otherlogin.button.hs=ID Austria
+gui.otherlogin.button.eidas=Alternative EU-Login
+gui.otherlogin.button.none=No alternative login
+gui.otherlogin.button.inserternp=Create new register entry
+gui.otherlogin.cancel=Cancel
+
+gui.otherlogin.inserternp.header.selection=Re-registration
+gui.otherlogin.inserternp.first=Your personal data could not be clearly assigned to any entry in the registers of the Austrian administration.
+gui.otherlogin.inserternp.second=Allow the re-registration of your personal data in the registers of the Austrian administration to complete the registration process successfully.
+gui.otherlogin.inserternp.third.prefix=Attention: If you think you already have an entry in the registers of the Austrian administration, it is recommended not to allow your data to be entered again at this point in order to avoid double entries. In this case, please contact
+gui.otherlogin.inserternp.third.postfix=, to arrange a manual assignment of your personal data.
+
+
+module.eidasauth.matching.21=Matching be using residence information failed by missing input information. Add all required information.
+module.eidasauth.matching.22=Can not find an unique match by using residence information. Provide more or other data, use another method for matching.
+module.eidasauth.matching.23=Matching be using ID Austria was canceled. Use another method for matching.
+module.eidasauth.matching.24=Matching be using ID Austria not possible. Use another method for matching.
+module.eidasauth.matching.25=Matching be using alternative eIDAS authentication not possible. Provide more or other data, or use another method for matching.
+module.eidasauth.matching.29=Matching be using other information failed. Provide more or other data, or use another method for matching.
+
+
+##Austrian Residency page
+gui.residency.title=Austrian Residency
+gui.residency.header.selection=Search for Austrian residence
+gui.residency.header.help=You can search for the address that you have been registered at in the past. Please enter a \
+ postcode, municipality or village first to start the search.
+
+gui.residency.info.first=If you have a current or former registered residence in Austria, an assignment to your existing register entry can be made by entering the residence data. Please use the form below to enter your residence details.
+gui.residency.info.second=First, please enter a postal code, municipality or locality and subsequently start the search for your home address using the "Search" button. Afterwards, you will be interactively supported in completing the address of residence, where you just have to follow the instructions on the form. You can restart the search process at any time by clicking the button "Delete". If all residence data has been filled in completely via the search function, please continue with the button "Continue".
+gui.residency.info.third=If you do not have a current or former place of residence in Austria, please continue with the button "No residence available".
+
+gui.residency.header.inputinvalid=Be sure to enter a value for Municipality or Village
+gui.residency.cancel=Cancel
+gui.residency.back=No residence available
+gui.residency.search=Search
+gui.residency.clear=Clear
+gui.residency.proceed=Continue
+gui.residency.updated=Updated your input
+gui.residency.found=Found {0} results, click on one result to refine your search
+gui.residency.unique=Unique result found, please proceed
+gui.residency.error=Error on Backend Call
+gui.residency.input.postleitzahl=Postcode
+gui.residency.input.municipality=Municipality
+gui.residency.input.village=Village
+gui.residency.input.street=Street
+gui.residency.input.number=Number
diff --git a/basicConfig/properties/messages_de.properties b/basicConfig/properties/messages_de.properties
index 989b8d9c..7b47efe7 100644
--- a/basicConfig/properties/messages_de.properties
+++ b/basicConfig/properties/messages_de.properties
@@ -18,6 +18,7 @@ gui.countryselection.header1=Bundesministerium für Inneres
gui.countryselection.header2=Zentraler eIDAS Knoten der Republik Österreich
gui.countryselection.header3=Betrieben durch das Bundesministerium für Inneres
gui.countryselection.header.selection=Wählen Sie Ihr Land
+gui.countryselection.cancel=Abbrechen
gui.countryselection.cancle=Abbrechen
gui.countryselection.notsupportedinfo=Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken, dann wird Ihre elektronische Identität (eID) leider noch nicht unterstützt.
@@ -32,6 +33,17 @@ gui.countryselection.infos.general.part.5=Nachdem Sie auf dieser Seite einen Mit
gui.countryselection.infos.general.part.6=eingetragen. Damit wird sichergestellt, dass Sie auch im Rahmen zukünftiger Anmeldeprozesse zu österreichischen Online-Anwendungen erfolgreich und eindeutig identifiziert werden können.
+gui.matching.otherloginmethod.header=Assignment of your login information
+gui.matching.otherloginmethod.info.text=Ihre Identität konnte nicht eindeutig in das österreichische eID System integriert werden. Für eine eindeutige Integration werden weitere Informationen benötigt.
+gui.matching.otherloginmethod.ida=Sie besitzen einen ID Austria
+gui.matching.otherloginmethod.eidas=Sie können weitere Attribute via eIDAS bereitstellen
+gui.matching.otherloginmethod.residence=Sie haben bereits einmal in Österreichg gelebt?
+gui.matching.otherloginmethod.addmeasnew=Neuregistrierung im österreichischen eID System
+
+gui.matching.otherloginmethod.error.title=Erweitertes Personenmatching fehlgeschlagen:
+gui.matching.otherloginmethod.error.msg=Ihre Identität konnte nicht eindeutig zugeordnet werden. Wählen Sie eine andere Option oder stellen zusätzliche Informationen bereit.
+
+
gui.countryselection.country.be=Belgien
gui.countryselection.country.be.logo.alt=Belgische-eID
gui.countryselection.country.hr=Kroatien
@@ -85,16 +97,75 @@ gui.countryselection.country.ro=Romänien
gui.countryselection.country.ro.logo.alt=Romänische-eID
gui.countryselection.country.sk=Slovakei
gui.countryselection.country.sk.logo.alt=Slovakische-eID
-gui.countryselection.country.sw=Schweden
-gui.countryselection.country.sw.logo.alt=Schwedische-eID
+gui.countryselection.country.se=Schweden
+gui.countryselection.country.se.logo.alt=Schwedische-eID
gui.countryselection.country.uk=Großbritanien
gui.countryselection.country.uk.logo.alt=Britische-eID
+gui.countryselection.country.ie=Irland
+gui.countryselection.country.ie.logo.alt=Irische-eID
+gui.countryselection.country.sw=Schweden
+gui.countryselection.country.sw.logo.alt=Schwedische-eID
+
gui.countryselection.country.testcountry=Testland
gui.countryselection.country.testcountry.logo.alt=Testland-eID
+gui.countryselection.country.eu.validation=EC Validierungsservice
+gui.countryselection.country.eu.logo.alt=EC Validierungsservice
gui.countryselection.mode.prod=Produktion
gui.countryselection.mode.qs=Qualitätsicherung
gui.countryselection.mode.test=Test
gui.countryselection.mode.dev=Development
+##Other Login Methods page
+gui.otherlogin.title=eIDAS-Login Alternative Anmeldemethoden
+gui.otherlogin.header.selection=Personendaten nicht gefunden
+gui.otherlogin.button.hs=Handy-Signatur
+gui.otherlogin.button.eidas=Alternativer eIDAS Login
+gui.otherlogin.button.none=Keine alternative Anmeldemöglichkeit
+gui.otherlogin.button.inserternp=Eine neue österreichische Identity auf Basis meiner eIDAS Daten erzeugen
+gui.otherlogin.cancel=Abbrechen
+
+gui.otherlogin.info.first=Ihre Personendaten aus dem eben erfolgten EU-Login konnten in den Registern der österreichischen Verwaltung keinem Registereintrag eindeutig zugeordnet werden. Das kann daran liegen, dass Sie in den Registern bisher nicht eingetragen sind, oder ihre aktuellen Anmeldedaten nicht vollständig mit den in den Registern hinterlegten Daten zu Ihrer Person übereinstimmen.
+gui.otherlogin.info.second=Sie haben folgende Möglichkeiten, um eine korrekte Zuordnung zu erreichen:
+gui.otherlogin.info.list.1=Wenn Sie über eine österreichische Handy-Signatur (oder ID Austria) oder über eine alternative Möglichkeit eines EU-Logins verfügen, melden Sie sich mit diesen bitte erneut an. Verwenden Sie dazu bitte die entsprechende Schaltfläche „Handy-Signatur“ oder „Alternativer EU-Login“.
+gui.otherlogin.info.list.2=Verfügen Sie über keine der beiden oben genannten zusätzlichen Anmeldemöglichkeiten, setzen Sie bitte über die Schaltfläche „Keine alternative Anmeldemöglichkeit“ fort
+
+gui.otherlogin.inserternp.header.selection=Neueintragung
+gui.otherlogin.inserternp.first=Ihre Personendaten konnten in den Registern der österreichischen Verwaltung keinem Eintrag eindeutig zugeordnet werden.
+gui.otherlogin.inserternp.second=Erlauben Sie die Neueintragung ihrer Personendaten in den Registern der österreichischen Verwaltung, um den Anmeldevorgang erfolgreich abzuschließen.
+gui.otherlogin.inserternp.third.prefix=Achtung: Wenn Sie der Meinung sind, in den Registern der österreichischen Verwaltung bereits einen Eintrag zu haben, wird empfohlen, an dieser Stelle keine Neueintragung Ihrer Daten zu erlauben, um doppelte Einträge zu verhindern. Kontaktieren Sie in diesem Fall bitte
+gui.otherlogin.inserternp.third.postfix=, um eine manuelle Zuordnung der Daten zu veranlassen.
+
+module.eidasauth.matching.21=Das Matching auf Basis eine Wohnanschrift in Österreich schlug fehl. Es wurden nicht alle erforderlichen Parameter für eine Suche mittels Wohnanschrift eingegeben.
+module.eidasauth.matching.22=Das Matching auf Basis eine Wohnanschrift in Österreich schlug fehl. Matching auf Basis einer bestanden oder bestehenden Wohnanschrift konnte nicht durchgeführt werden.
+module.eidasauth.matching.23=Matching auf Basis eines ID Autria wurde abgebrochen. Nutzen Sie eine andere Matchingmethode.
+module.eidasauth.matching.24=Matching auf Basis eines ID Autria schlug fehl. Nutzen Sie eine andere Matchingmethode.
+module.eidasauth.matching.25=Matching auf Basis einer alternativen eIDAS Anmeldung schlug fehl. Stellen Sie weitere Informationen bereit oder nutzen Sie eine andere Matchingmethode.
+
+
+##Austrian Residency page
+gui.residency.title=Österreichischer Wohnsitz
+gui.residency.header.selection=Suche nach Österreichischem Wohnsitz
+gui.residency.header.help=Hier können Sie nach einem Wohnsitze in Österreich suchen. Bitte geben Sie zuerst eine \
+ Postleitzahl, Gemeinde oder Ortschaft ein um die Suche zu starten.
+
+gui.residency.info.first=Haben Sie einen aktuellen oder ehemaligen gemeldeten Wohnsitz in Österreich, kann eine Zuordnung zu Ihrem bestehenden Registereintrag über Eingabe der Wohnsitzdaten erfolgen. Bitte benutzen Sie das untenstehende Formular, um Ihre Wohnsitzdaten einzugeben.
+gui.residency.info.second=Bitte geben Sie dazu zuerst eine Postleitzahl, Gemeinde oder Ortschaft ein und starten Sie die Suche Ihrer Wohnsitzadresse dann über die Schaltfläche „Suche“. Sie werden in weiterer Folge bei der Vervollständigung der Wohnsitzadresse interaktiv unterstützt. Folgen Sie dazu den Anweisungen im Formular. Über die Schaltfläche „Löschen“ können Sie den Suchvorgang jederzeit neu starten. Wurden alle Wohnsitzdaten über die Suchfunktion vollständig befüllt, setzen Sie bitte über die Schaltfläche „Fortfahren“ fort.
+gui.residency.info.third=Haben sie keinen aktuellen oder ehemaligen Wohnsitz in Österreich, setzen Sie bitte über die Schaltfläche „Kein Wohnsitz vorhanden“ fort.
+
+gui.residency.header.inputinvalid=Bitte geben Sie einen Wert für Gemeinde oder Ortschaft ein
+gui.residency.cancel=Abbrechen
+gui.residency.back=Kein Wohnsitz vorhanden
+gui.residency.search=Suche
+gui.residency.clear=Löschen
+gui.residency.proceed=Fortfahren
+gui.residency.updated=Eingabe aktualisiert
+gui.residency.found={0} Ergebnisse gefunden, klicken Sie auf ein Ergebnis um die Suche zu verfeinern
+gui.residency.unique=Eindeutiges Ergebnis gefunden, bitte fortfahren
+gui.residency.error=Fehler bei Addresssuche
+gui.residency.input.postleitzahl=PLZ
+gui.residency.input.municipality=Gemeinde
+gui.residency.input.village=Ortschaft
+gui.residency.input.street=Straße
+gui.residency.input.number=Nummer
diff --git a/basicConfig/templates/countrySelection.html b/basicConfig/templates/countrySelection.html
index 7fbc9464..bfa30669 100644
--- a/basicConfig/templates/countrySelection.html
+++ b/basicConfig/templates/countrySelection.html
@@ -2,11 +2,11 @@
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
+ th:with="lang=${#locale.language}" th:lang="${lang}">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="$contextPath/static/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
<title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
<script type="text/javascript">
</script>
@@ -17,17 +17,17 @@ body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
-div.header {
+div.header {
background-color: #e9ecef;
padding-top: 28px;
padding-left: 137px;
padding-right: 137px;
padding-bottom: 12px;
}
-div.titlebar {
+div.titlebar {
padding: 0px;
}
-div.titlebar div {
+div.titlebar div {
}
.hidden {
display: none;
@@ -40,7 +40,7 @@ ul.nav_oben {
}
li {
display: inline-block;
-}
+}
div.header a {
text-decoration: none;
color: black;
@@ -55,7 +55,7 @@ a {
padding-bottom: 20px;
}
@media only screen and (min-width: 1000px) {
- div.header {
+ div.header {
padding-left: 137px;
padding-right: 137px;
}
@@ -69,7 +69,7 @@ a {
}
}
@media only screen and (max-width: 999px) {
- div.header {
+ div.header {
padding-left: 1em;
padding-right: 1em;
}
@@ -114,10 +114,10 @@ footer {
font-size: 80%;
}
#countries {
- padding-bottom: 40px;
+ padding-bottom: 40px;
}
#country {
- padding-bottom: 20px;
+ padding-bottom: 20px;
}
input[type=submit] {
width: inherit;
@@ -131,7 +131,7 @@ form {
/* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
if (!Element.prototype.matches)
- Element.prototype.matches = Element.prototype.msMatchesSelector ||
+ Element.prototype.matches = Element.prototype.msMatchesSelector ||
Element.prototype.webkitMatchesSelector;
if (!Element.prototype.closest)
@@ -141,7 +141,7 @@ if (!Element.prototype.closest)
do {
if (el.matches(s)) return el;
el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
+ } while (el !== null && el.nodeType === 1);
return null;
};
@@ -149,7 +149,7 @@ if (!Element.prototype.closest)
function clickCountryFlag(element) {
if (!element) return false;
- var form = element.closest("form");
+ var form = element.closest("form");
if (!form) return false;
@@ -188,43 +188,43 @@ function clickCountryFlag(element) {
<h1 th:text="#{gui.countryselection.header.selection}"> Wählen Sie Ihr Land / Select your country </h1>
<div id="country">
- <!-- Active countries -->
+ <!-- Active countries -->
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
<a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
<input type="submit" role="button" value="Deutschland / Germany" th:attr="value=#{gui.countryselection.country.de}" />
- <input type="hidden" name="selectedCountry" value="XX">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
+ <input type="hidden" name="selectedCountry" value="XX">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
</form>
-
+
</div>
<!-- Abbrechen Button -->
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancle}">
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancel}">
<input type="hidden" name="stopAuthProcess" value="true" >
<input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
</form>
- <p th:text="#{gui.countryselection.notsupportedinfo}" >Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken ... </p>
-
+ <p th:text="#{gui.countryselection.notsupportedinfo}" >Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken ... </p>
+
<h2 th:text="#{gui.countryselection.infos.general.header}" > Information zur Anmeldung über Europäische eIDs </h2>
<p>
- <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
- <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}" > Bundesministerium für Inneres </a>
+ <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}" > Bundesministerium für Inneres </a>
<span th:text="#{gui.countryselection.infos.general.part.2}"> second part </span>
</p>
-
+
<p>
<span th:text="#{gui.countryselection.infos.general.part.3}"> third part </span>
- <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank" th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
+ <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank" th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
<span th:text="#{gui.countryselection.infos.general.part.4}"> fourth part </span>
</p>
<p
<span th:text="#{gui.countryselection.infos.general.part.5}"> fived part </span>
<a href="https://www.dsb.gv.at/-/das-erganzungsregister-fur-naturliche-personen-ernp-" target="_blank" th:text="#{gui.countryselection.infos.general.link.2}" ></a>
- <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
+ <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
</p>
</div>
diff --git a/basicConfig/templates/countrySelection_example.html b/basicConfig/templates/countrySelection_example.html
index 3b7c2d50..abbe0491 100644
--- a/basicConfig/templates/countrySelection_example.html
+++ b/basicConfig/templates/countrySelection_example.html
@@ -3,12 +3,12 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
-
+
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="$contextPath/static/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <script type="text/javascript" src="$contextPath/static/js/js_country.js" th:attr="src=@{/static/js/js_country.js}"></script>
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../webcontent/js/js_country.js" th:attr="src=@{/static/js/js_country.js}"></script>
<title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
</head>
@@ -17,194 +17,195 @@
<div class="languageselection" th:include="language_selection :: selectlanguage">
LanguageSelectionBlock
</div>
-
+
<h2 th:text="#{gui.countryselection.header.selection}"> Select your country </h2>
<div id="country">
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/germany-eu_.png" alt="Germany-eID"
th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
<input type="submit" role="button" value="Deutschland / Germany" th:attr="value=#{gui.countryselection.country.de}" />
- <input type="hidden" name="selectedCountry" value="DE">
+ <input type="hidden" name="selectedCountry" value="DE">
<input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
<option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
<option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
<option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
</select>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
th:attr="src=@{img/countries/Belgium-EU_gray.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
- <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
+ <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Bulgaria-EU_gray.png" alt="Bulgaria-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Bulgaria-EU_gray.png" alt="Bulgaria-eID"
th:attr="src=@{/img/countries/Bulgaria-EU_gray.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
- <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
+ <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
th:attr="src=@{/img/countries/Croatia-EU_gray.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
- <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
+ <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
- th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
- <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
+ th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
+ <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/CzechRepublic-EU_gray.png" alt="CzechRepublic-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/CzechRepublic-EU_gray.png" alt="CzechRepublic-eID"
th:attr="src=@{/img/countries/CzechRepublic-EU_gray.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
- <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
+ <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
th:attr="src=@{/img/countries/Denmark-EU_gray.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
- <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
+ <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
th:attr="src=@{/img/countries/Estonia-EU_gray.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
<input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Finland-EU_gray.png" alt="Finland-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Finland-EU_gray.png" alt="Finland-eID"
th:attr="src=@{/img/countries/Finland-EU_gray.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
<input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/France-EU_gray.png" alt="France-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/France-EU_gray.png" alt="France-eID"
th:attr="src=@{/img/countries/France-EU_gray.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
<input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Greece-EU_gray.png" alt="Greece-eID"
- th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
- <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Greece-EU_gray.png" alt="Greece-eID"
+ th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
+ <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
- th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
+ th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
<input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
th:attr="src=@{/img/countries/Ireland-EU_gray.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
<input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Italy-EU_gray.png" alt="Italy-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Italy-EU_gray.png" alt="Italy-eID"
th:attr="src=@{/img/countries/Italy-EU_gray.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
<input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
<option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
<option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
<option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
</select>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
th:attr="src=@{/img/countries/Latvia-EU_gray.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
- <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
+ <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Luxembourg-EU_gray.png" alt="Luxembourg-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Luxembourg-EU_gray.png" alt="Luxembourg-eID"
th:attr="src=@{/img/countries/Luxembourg-EU_gray.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
<input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Malta-EU_gray.png" alt="Malta-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Malta-EU_gray.png" alt="Malta-eID"
th:attr="src=@{/img/countries/Malta-EU_gray.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
<input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Poland-EU_gray.png" alt="Poland-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Poland-EU_gray.png" alt="Poland-eID"
th:attr="src=@{/img/countries/Poland-EU_gray.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
<input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
- th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
- <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
+ <a><img class="countryimage" src="../webcontent/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
+ th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
+ <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Romania-EU_gray.png" alt="Romania-eID"
- th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
- <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Romania-EU_gray.png" alt="Romania-eID"
+ th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
+ <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Slovakia-EU_gray.png" alt="Slovakia-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Slovakia-EU_gray.png" alt="Slovakia-eID"
th:attr="src=@{/img/countries/Slovakia-EU_gray.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
- <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
+ <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
th:attr="src=@{/img/countries/Slovenia-EU_gray.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
- <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
+ <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Spain-EU_gray.png" alt="Spain-eID"
+ <a><img class="countryimage" src="../webcontent/img/countries/Spain-EU_gray.png" alt="Spain-eID"
th:attr="src=@{/img/countries/Spain-EU_gray.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
- <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
<option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
<option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
<option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
</select>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
th:attr="src=@{/img/countries/Sweden-EU_gray.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
- <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
+ <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/TheNetherlands-EU_gray.jpg" alt="TheNetherlands-eID"
- th:attr="src=@{/img/countries/TheNetherlands-EU_gray.jpg},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
- <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
+ <a><img class="countryimage" src="../webcontent/img/countries/TheNetherlands-EU_gray.png"
+ alt="TheNetherlands-eID"
+ th:attr="src=@{/img/countries/TheNetherlands-EU_gray.png},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
+ <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
</form>
-
+
<form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/UnitedKingdom-EU_gray.png" alt="UnitedKingdom-eID"
+ <a><img disabled class="countryimage" src="../webcontent/img/countries/UnitedKingdom-EU_gray.png" alt="UnitedKingdom-eID"
th:attr="src=@{/img/countries/UnitedKingdom-EU_gray.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
<input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}" disabled>
</form>
-
+
</div>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancle}">
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancel}">
<input type="hidden" name="stopAuthProcess" value="true" >
<input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
</form>
-
+
</div>
</body>
</html>
diff --git a/basicConfig/templates/eidas_node_forward.html b/basicConfig/templates/eidas_node_forward.html
index 186937d7..6dffa34b 100644
--- a/basicConfig/templates/eidas_node_forward.html
+++ b/basicConfig/templates/eidas_node_forward.html
@@ -4,7 +4,7 @@
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
<head>
- <script src="$contextPath/autocommit.js"
+ <script src="../webcontent/autocommit.js"
th:attr="src=@{/autocommit.js}"></script>
</head>
<body>
diff --git a/basicConfig/templates/error_message.html b/basicConfig/templates/error_message.html
index b1367962..d8c3de56 100644
--- a/basicConfig/templates/error_message.html
+++ b/basicConfig/templates/error_message.html
@@ -3,21 +3,41 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
-
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link rel="stylesheet" href="$contextPath/css/css_error.css" th:href="@{/css/css_error.css}" />
-
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <link rel="stylesheet" href="../webcontent/css/css_error.css" th:href="@{/css/css_error.css}" />
+
<title th:text="#{gui.errorpage.msg.title}">An error arise ... </title>
</head>
<body>
- <div id="page">
- <div id="page1" class="case selected-case" role="main">
- <h2 class="OA_header" role="heading">Authentication error arise</h2>
-
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+ <div id="page1" class="case selected-case" role="main">
<div class="hell" role="application" >
<h2 class="OA_header" role="heading" th:text="#{gui.errorpage.msg.title}">Error Header</h2>
-
+
<div id="alert_area" class="hell" role="application" >
<p th:text="#{gui.errorpage.msg.information}">Error Information</p>
<br/>
@@ -25,8 +45,14 @@
<p><b th:text="#{gui.errorpage.msg.errormsg}">Msg :</b > <span th:text="${#messages.msgWithParams('__${errorCode}__', '__${errorParams}__')}"></span></p>
</div>
</div>
-
+
</div>
- </div>
+
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
</body>
</html>
diff --git a/basicConfig/templates/language_selection.html b/basicConfig/templates/language_selection.html
index a268eb17..8d34c73b 100644
--- a/basicConfig/templates/language_selection.html
+++ b/basicConfig/templates/language_selection.html
@@ -3,13 +3,13 @@
xmlns:th="http://www.thymeleaf.org">
<body>
-
+
<div th:fragment="selectlanguage">
- <a th:href="@{|${submitEndpoint}?pendingid=${pendingid}|(lang='de')}" th:text="#{gui.general.language.selection.de}">Spache1</a>
+ <a th:href="@{|${submitEndpoint}?lang=de|(pendingid=${pendingid})}" th:text="#{gui.general.language.selection.de}">Spache1</a>
<span>&nbsp; &nbsp; </span>
- <a th:href="@{|${submitEndpoint}?pendingid=${pendingid}|(lang='en')}" th:text="#{gui.general.language.selection.en}">Spache2</a>
+ <a th:href="@{|${submitEndpoint}?lang=en|(pendingid=${pendingid})}" th:text="#{gui.general.language.selection.en}">Spache2</a>
</div>
-
+
</body>
-
-</html> \ No newline at end of file
+
+</html>
diff --git a/basicConfig/templates/other_login_method.html b/basicConfig/templates/other_login_method.html
new file mode 100644
index 00000000..120b0ecd
--- /dev/null
+++ b/basicConfig/templates/other_login_method.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <title th:text="#{gui.otherlogin.title}">eIDAS-Login Other Login Methods</title>
+ <style>
+ .block {
+ width: 100%;
+ }
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 20em;
+ }
+ </style>
+</head>
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <div th:if="${createNewErnpEntry != null} and ${createNewErnpEntry}">
+
+ <div class="mainDescription">
+ <h3 th:text="#{gui.otherlogin.inserternp.header.selection}"> Generate new ERnP entry</h3>
+
+ <p th:text="#{gui.otherlogin.inserternp.first}"> Insert ERnP first block </p>
+ <p th:text="#{gui.otherlogin.inserternp.second}"> Insert ERnP second block </p>
+ <p>
+ <span th:text="#{gui.otherlogin.inserternp.third.prefix}"> Insert ERnP third block / part 1 </span>
+ <span>&nbsp;<a href="mailto:BMI-IKT-eIDAS-Betrieb@bmi.gv.at"> BMI-IKT-eIDAS-Betrieb@bmi.gv.at </a></span>
+ <span th:text="#{gui.otherlogin.inserternp.third.postfix}"> Insert ERnP third block / part 3 </span>
+ </p>
+ </div>
+
+ <div id="insertErnp" class="block">
+ <form class="block,singleButton" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Keine weitere HS / eIDAS"
+ th:text="#{gui.otherlogin.button.inserternp}">D
+ </button>
+ <input type="hidden" name="loginSelection" value="ADD_ME_AS_NEW">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <div id="stopMatching" class="block">
+ <!-- Abbrechen Button -->
+ <form class="block,singleButton" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.otherlogin.cancel}"></button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+ </div>
+
+ </div>
+
+ <div th:unless="${createNewErnpEntry!= null} and ${createNewErnpEntry}">
+
+ <div class="mainDescription">
+ <h3 th:text="#{gui.otherlogin.header.selection}"> No person data found</h3>
+
+ <p th:text="#{gui.otherlogin.info.first}"> Info text after MDS search with one or more results</p>
+ <p th:text="#{gui.otherlogin.info.second}"> Prefix for option list</p>
+ <ul>
+ <li th:text="#{gui.otherlogin.info.list.1}"> ID Austria or alterantive eIDAS Login </li>
+ <li th:text="#{gui.otherlogin.info.list.2}"> Search with Address </li>
+ </ul>
+ </div>
+
+ <div id="matchingError"
+ th:if="${advancedMatchingFailed != null} and ${advancedMatchingFailed}">
+ <p th:if="${advancedMatchingFailedReason != null}"
+ th:text="#{${advancedMatchingFailedReason}}">Detailed
+ </p>
+ <p th:unless="${advancedMatchingFailedReason != null}"
+ th:text="#{module.eidasauth.matching.29}">Generell
+ </p>
+ </div>
+
+
+ <div id="otherlogin" class="block">
+ <div id="selectOtherMethodArea" class="block">
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button class="primaryButton" type="submit" role="button" value="Handy-Signatur / Mobile Signature"
+ th:text="#{gui.otherlogin.button.hs}">A
+ </button>
+ <input type="hidden" name="loginSelection" value="MOBILE_PHONE_SIGNATURE_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button class="primaryButton" type="submit" role="button" value="Andere eIDAS ID"
+ th:text="#{gui.otherlogin.button.eidas}">B
+ </button>
+ <input type="hidden" name="loginSelection" value="EIDAS_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button class="primaryButton" type="submit" role="button" value="Keine weitere HS / eIDAS"
+ th:text="#{gui.otherlogin.button.none}">C
+ </button>
+ <input type="hidden" name="loginSelection" value="NO_OTHER_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <div id="stopMatching" class="block">
+ <!-- Abbrechen Button -->
+ <form class="block,singleButton" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.otherlogin.cancel}"></button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+ </div>
+ </div>
+
+ </div>
+ </div>
+ <footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+ </footer>
+</body>
+</html>
diff --git a/basicConfig/templates/pvp2_post_binding.html b/basicConfig/templates/pvp2_post_binding.html
index 90858237..06b9b494 100644
--- a/basicConfig/templates/pvp2_post_binding.html
+++ b/basicConfig/templates/pvp2_post_binding.html
@@ -6,7 +6,7 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
- <script src="$contextPath/autocommit.js"></script>
+ <script src="/autocommit.js"></script>
</head>
<body>
<noscript>
@@ -21,7 +21,7 @@
<form action="${action}" method="post" target="_parent">
<div>
- #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
+ #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
#if($SAMLRequest) <input type="hidden" name="SAMLRequest" value="${SAMLRequest}" /> #end
#if($SAMLResponse) <input type="hidden" name="SAMLResponse" value="${SAMLResponse}" /> #end
</div>
diff --git a/basicConfig/templates/residency.html b/basicConfig/templates/residency.html
new file mode 100644
index 00000000..26812ec0
--- /dev/null
+++ b/basicConfig/templates/residency.html
@@ -0,0 +1,285 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../webcontent/js/jquery-3.6.0.js"
+ th:attr="src=@{/static/js/jquery-3.6.0.min.js}"></script>
+ <title th:text="#{gui.residency.title}">Österreichischer Wohnsitz</title>
+ <script type="text/javascript" th:inline="javascript">
+ $(document).ready(function () {
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ $("#loading").hide();
+ $.ajaxSetup({
+ beforeSend: function () {
+ $("#loading").show();
+ },
+ complete: function () {
+ $("#loading").hide();
+ }
+ });
+ $("#inputForm input[type='text']").keyup(function (event) {
+ if (event.keyCode === 13) {
+ $("#buttonSearch").click();
+ }
+ });
+ });
+
+ function search() {
+ let updatedText = /*[[#{gui.residency.updated}]]*/ 'Updated text';
+ let errorText = /*[[#{gui.residency.error}]]*/ 'Error';
+ let foundText = /*[[#{gui.residency.found}]]*/ 'Found {0}';
+ let uniqueText = /*[[#{gui.residency.unique}]]*/ 'Unique';
+ let invalidInputText = /*[[#{gui.residency.header.inputinvalid}]]*/ 'Invalid';
+ if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputPostleitzahl").val().trim() &&
+ !$("#inputForm #inputVillage").val().trim()) {
+ $("#textResult").show().text(invalidInputText);
+ return;
+ }
+ $.ajax({
+ type: "POST",
+ url: "[(${wizardEndpoint})]",
+ data: $("#inputForm").serialize()
+ }).done(function (data, textStatus, jqXHR) {
+ if (data["resultCount"] === 1) {
+ $("#textResult").show().text(uniqueText);
+ $("#tableResult tbody").empty();
+ $("#tableResult").hide();
+ $("#inputForm #inputPostleitzahl").val(data["results"][0]["postleitzahl"]);
+ $("#inputForm #inputMunicipality").val(data["results"][0]["municipality"]);
+ $("#inputForm #inputVillage").val(data["results"][0]["village"]);
+ $("#inputForm #inputStreet").val(data["results"][0]["street"]);
+ $("#inputForm #inputNumber").val(data["results"][0]["number"]);
+ return;
+ }
+ $("#textResult").show().text(foundText.replace("{0}", data["resultCount"]));
+ $("#tableResult").show();
+ $("#tableResult tbody").empty();
+ $.each(data.results, function (i, output) {
+ $("#tableResult tbody")
+ .append($("<tr>")
+ .append($("<td>").text(output["postleitzahl"] !== null ? output["postleitzahl"] : "").css("text-align", "right"))
+ .append($("<td>").text(output["municipality"] !== null ? output["municipality"] : ""))
+ .append($("<td>").text(output["village"] !== null ? output["village"] : ""))
+ .append($("<td>").text(output["street"] !== null ? output["street"] : ""))
+ .append($("<td>").text(output["number"] !== null ? output["number"] : "").css("text-align", "right"))
+ .css("cursor", "pointer").click(function () {
+ $("#inputForm #inputPostleitzahl").val($(this).children("td:nth-child(1)").text());
+ $("#inputForm #inputMunicipality").val($(this).children("td:nth-child(2)").text());
+ $("#inputForm #inputVillage").val($(this).children("td:nth-child(3)").text());
+ $("#inputForm #inputStreet").val($(this).children("td:nth-child(4)").text());
+ $("#inputForm #inputNumber").val($(this).children("td:nth-child(5)").text());
+ $("#textResult").show().text(updatedText);
+ search();
+ })
+ );
+ })
+ if (data.results.length === 0) {
+ $("#tableResult").hide();
+ }
+ }).fail(function (jqXHR, textStatus, errorThrown) {
+ $("#textResult").show().text(errorText);
+ })
+ }
+
+ function clearInput() {
+ $("#inputForm #inputPostleitzahl").val("");
+ $("#inputForm #inputMunicipality").val("");
+ $("#inputForm #inputVillage").val("");
+ $("#inputForm #inputStreet").val("");
+ $("#inputForm #inputNumber").val("");
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ }
+ </script>
+ <style>
+ #residency label {
+ width: 10em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #residency input {
+ width: 15em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #result {
+ margin-bottom: 4em;
+ }
+
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 12em;
+ }
+
+ .block {
+ width: 80%;
+ justify-content: left;
+ }
+
+ #tableResult td, #tableResult th {
+ padding: 1em 0.5em;
+ }
+
+ #tableResult a {
+ text-decoration: underline;
+ }
+
+ #tableResult {
+ border-collapse: collapse;
+ }
+
+ #tableResult tr {
+ border-bottom: 1px solid black;
+ }
+ </style>
+</head>
+
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <div class="mainDescription">
+ <h3 th:text="#{gui.residency.header.selection}">Search your Austrian Residency </h3>
+
+ <p th:text="#{gui.residency.info.first}"> Info text for matching by address </p>
+ <p th:text="#{gui.residency.info.second}"> HowTo search by address </p>
+ </div>
+
+ <div id="matchingError"
+ th:if="${advancedMatchingFailed != null} and ${advancedMatchingFailed}">
+ <p th:if="${advancedMatchingFailedReason != null}"
+ th:text="#{${advancedMatchingFailedReason}}">Detailed
+ </p>
+ <p th:unless="${advancedMatchingFailedReason != null}"
+ th:text="#{module.eidasauth.matching.29}">Generell
+ </p>
+ </div>
+
+ <div id="residency">
+ <form id="inputForm" method="post" action="$contextPath$submitEndpoint"
+ th:attr="action=@{${submitEndpoint}}">
+ <div><p th:text="#{gui.residency.header.help}">Please enter a postcode, municipality or village first</p>
+ </div>
+ <div>
+ <label for="inputPostleitzahl" th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</label>
+ <input type="text" id="inputPostleitzahl" name="postleitzahl" value=""/>
+ </div>
+ <div>
+ <label for="inputMunicipality" th:text="#{gui.residency.input.municipality}">Municipality</label>
+ <input type="text" id="inputMunicipality" name="municipality" value=""/>
+ </div>
+ <div>
+ <label for="inputVillage" th:text="#{gui.residency.input.village}">Village</label>
+ <input type="text" id="inputVillage" name="village" value=""/>
+ </div>
+ <div>
+ <label for="inputStreet" th:text="#{gui.residency.input.street}">Street</label>
+ <input type="text" id="inputStreet" name="street" value=""/>
+ </div>
+ <div>
+ <label for="inputNumber" th:text="#{gui.residency.input.number}">Number</label>
+ <input type="text" id="inputNumber" name="number" value=""/>
+ </div>
+ <div class="block">
+ <button type="button" id="buttonSearch" onclick="search()" th:text="#{gui.residency.search}">
+ Search
+ </button>
+ <button type="button" id="buttonClear" onclick="clearInput()" th:text="#{gui.residency.clear}">
+ Clear
+ </button>
+
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" id="buttonProceed" value="Proceed" th:text="#{gui.residency.proceed}">Proceed</button>
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+ </div>
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+
+ <div id="backOrReturn" class="block">
+
+ <p th:text="#{gui.residency.info.third}"> Alternativ infos and back </p>
+ <br>
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Back" th:text="#{gui.residency.back}">Back</button>
+ <input type="hidden" name="noResidence" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+ <!--form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.residency.cancel}">Cancel</button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form-->
+
+ </div>
+
+ <div>
+ <img id="loading" src="../webcontent/img/ajax-loader.gif"
+ th:attr="src=@{/static/img/ajax-loader.gif}" style="display: none"/>
+ </div>
+
+ <div id="result">
+ <div>
+ <p><span id="textResult" style="display: none"></span></p>
+ </div>
+ <table id="tableResult" style="display: none">
+ <thead>
+ <tr>
+ <th th:text="#{gui.residency.input.postleitzahl}" style="text-align: right">Postcode</th>
+ <th th:text="#{gui.residency.input.municipality}">Municipality</th>
+ <th th:text="#{gui.residency.input.village}">Village</th>
+ <th th:text="#{gui.residency.input.street}">Street</th>
+ <th th:text="#{gui.residency.input.number}" style="text-align: right">Number</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+ </div>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
+</body>
+</html>
diff --git a/basicConfig/webcontent/autocommit.js b/basicConfig/webcontent/autocommit.js
new file mode 100644
index 00000000..d21a5651
--- /dev/null
+++ b/basicConfig/webcontent/autocommit.js
@@ -0,0 +1,5 @@
+function autoCommmit() {
+ document.forms[0].submit();
+}
+
+document.addEventListener('DOMContentLoaded', autoCommmit); \ No newline at end of file
diff --git a/basicConfig/webcontent/css/css_country.css b/basicConfig/webcontent/css/css_country.css
index 4091955f..e193126c 100644
--- a/basicConfig/webcontent/css/css_country.css
+++ b/basicConfig/webcontent/css/css_country.css
@@ -1,137 +1,185 @@
@charset "utf-8";
- body {
- background-image: none;
- margin: 0px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- }
- #page {
- padding-top: 2%;
- padding-left: 10%;
- }
-
- #country {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- align-items: center;
- }
-
- .block {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- cursor: pointer;
- text-decoration: none;
- padding-right:2%;
- width: 250px;
- }
-
- .countryimage {
- width:50px;
- height:50px;
- padding-right: 2%;
- padding-bottom: 4%;
- }
-
- input[type=button], input[type=submit], input[type=reset] {
- display:flex;
- background-color:transparent;
- border:none;
- color: black;
- text-decoration: none;
- cursor: pointer;
- }
- #testEnvironment {
- border: none;
- color: black;
- padding: 10px 20px;
- text-decoration: none;
- margin: 4px 2px;
- height: 3%;
- display: inline-block;
- vertical-align: middle;
- width: 40%;
- }
- #button{
- background-color: transparent;
- border:none;
- }
- div.header {
- background-color: #e9ecef;
- padding-top: 28px;
- padding-left: 137px;
- padding-right: 137px;
- padding-bottom: 12px;
- }
- div.titlebar {
- padding: 0px;
- }
- div.titlebar div {
- }
- .hidden {
- display: none;
- }
- ul.nav_oben {
- padding: 0px;
- margin: 0px;
- text-align: right;
- text-transform: uppercase;
- }
- li {
- display: inline-block;
- }
- div.header a {
- text-decoration: none;
- color: black;
- }
- a {
- text-decoration: none;
- color: #a22c1c;
- }
- .content {
- padding-left: 137px;
- padding-right: 137px;
- }
- div.subtitle h1 {
- padding: 0px;
- margin: 0px;
- font-size: 130%;
- align: right;
- }
- div.subtitle h2 {
- padding: 0px;
- margin: 0px;
- font-size: 115%;
- }
- footer {
- position: fixed;
- left: 0;
- padding-left: 137px;
- padding-right: 137px;
- padding-top: 1em;
- bottom: 0;
- width: 100%;
- height: 2em;
- background-color: rgb(162,44,28);
- color: white;
- }
- .float {
- float: left;
- }
- .floatright {
- float: right;
- }
- .copyright {
- width: 66%;
- font-size: 80%;
- }
- #countries,#country {
- padding-bottom: 40px;
- }
- input[type=submit] {
- width: inherit;
- /* text-align: left; */
- }
- form {
- justify-content: center;
- } \ No newline at end of file
+body {
+ background-image: none;
+ margin: 0px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+#page {
+ padding-top: 2%;
+ padding-left: 10%;
+}
+
+#country {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+#matchingError {
+ border: 2px solid rgb(162, 44, 28);
+ padding: 1em;
+ width: 80%;
+ margin-top: 2em;
+ margin-bottom: 2em;
+}
+
+.block {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ cursor: pointer;
+ text-decoration: none;
+ padding-right: 2%;
+ width: 250px;
+ justify-content: center;
+}
+
+.countryimage {
+ width: 50px;
+ height: 50px;
+ padding-right: 2%;
+ padding-bottom: 4%;
+}
+
+input[type=button], input[type=submit], input[type=reset] {
+ display: flex;
+ background-color: transparent;
+ border: none;
+ color: black;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+#testEnvironment {
+ border: none;
+ color: black;
+ padding: 10px 20px;
+ text-decoration: none;
+ margin: 4px 2px;
+ height: 3%;
+ display: inline-block;
+ vertical-align: middle;
+ width: 40%;
+}
+
+#button {
+ background-color: transparent;
+ border: none;
+}
+
+.primaryButton {
+ height: 4em;
+}
+
+.singleButton {
+ padding-left: 2em;
+}
+
+.mainDescription {
+ width: 80%;
+}
+
+
+div.mainDescription li {
+ display: list-item;
+
+}
+
+div.header {
+ background-color: #e9ecef;
+ padding-top: 28px;
+ padding-left: 137px;
+ padding-right: 137px;
+ padding-bottom: 12px;
+}
+
+div.titlebar {
+ padding: 0px;
+}
+
+div.titlebar div {
+}
+
+.hidden {
+ display: none;
+}
+
+ul.nav_oben {
+ padding: 0px;
+ margin: 0px;
+ text-align: right;
+ text-transform: uppercase;
+}
+
+li {
+ display: inline-block;
+}
+
+div.header a {
+ text-decoration: none;
+ color: black;
+}
+
+a {
+ text-decoration: none;
+ color: #a22c1c;
+}
+
+.content {
+ padding-left: 137px;
+ padding-right: 137px;
+}
+
+div.subtitle h1 {
+ padding: 0px;
+ margin: 0px;
+ font-size: 130%;
+ align: right;
+}
+
+div.subtitle h2 {
+ padding: 0px;
+ margin: 0px;
+ font-size: 115%;
+}
+
+footer {
+ position: fixed;
+ left: 0;
+ padding-left: 137px;
+ padding-right: 137px;
+ padding-top: 1em;
+ bottom: 0;
+ width: 100%;
+ height: 2em;
+ background-color: rgb(162, 44, 28);
+ color: white;
+}
+
+.float {
+ float: left;
+}
+
+.floatright {
+ float: right;
+}
+
+.copyright {
+ width: 66%;
+ font-size: 80%;
+}
+
+#countries, #country {
+ padding-bottom: 40px;
+}
+
+input[type=submit] {
+ width: inherit;
+ /* text-align: left; */
+}
+
+form {
+ justify-content: center;
+}
diff --git a/basicConfig/webcontent/css/css_error.css b/basicConfig/webcontent/css/css_error.css
new file mode 100644
index 00000000..d772df43
--- /dev/null
+++ b/basicConfig/webcontent/css/css_error.css
@@ -0,0 +1,26 @@
+@charset "utf-8";
+ body {
+ padding-left: 5%;
+ background-color: #F9F9F9;
+ }
+ #page {
+ padding-top: 2%;
+ padding-right: 10%;
+ padding-left: 5%;
+ }
+
+ .OA_header {
+ font-size: 2.1em;
+ padding-top:1%;
+ margin-bottom: 1%;
+ margin-top: 1%;
+
+ }
+
+ #alert_area {
+ float:left;
+ width: 100%;
+ }
+
+
+
diff --git a/basicConfig/webcontent/img/ajax-loader.gif b/basicConfig/webcontent/img/ajax-loader.gif
new file mode 100644
index 00000000..f2a1bc0c
--- /dev/null
+++ b/basicConfig/webcontent/img/ajax-loader.gif
Binary files differ
diff --git a/basicConfig/webcontent/js/jquery-3.6.0.min.js b/basicConfig/webcontent/js/jquery-3.6.0.min.js
new file mode 100644
index 00000000..c4c6022f
--- /dev/null
+++ b/basicConfig/webcontent/js/jquery-3.6.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/build_reporting/pom.xml b/build_reporting/pom.xml
index 05473715..9b3464e3 100644
--- a/build_reporting/pom.xml
+++ b/build_reporting/pom.xml
@@ -6,7 +6,7 @@
<parent>
<groupId>at.asitplus.eidas</groupId>
<artifactId>ms_specific</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<artifactId>build_reporting</artifactId>
<packaging>pom</packaging>
@@ -53,6 +53,19 @@
<!-- exclude coverage data of integration tests -->
<dataFileExclude>**/target/jacoco-it.exec</dataFileExclude>
</dataFileExcludes>
+ <excludes>
+ <exclude>**/org/w3/_2000/_09/*</exclude>
+ <exclude>**/org/w3/_2001/_04/*</exclude>
+ <exclude>**/szrservices/*</exclude>
+ <exclude>**/generated/cxf/*</exclude>
+ <exclude>**at/gv/bmi/namespace/*</exclude>
+ <exclude>**at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ernp/*</exclude>
+ <exclude>**at/gv/bmi/namespace/*</exclude>
+ <exclude>**at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ernp/*</exclude>
+ <exclude>**at/gv/e_government/reference/namespace/*</exclude>
+ <exclude>**org/w3/_2000/_09/*</exclude>
+ <exclude>**org/xmlsoap/schemas/ws/*</exclude>
+ </excludes>
</configuration>
</execution>
</executions>
diff --git a/connector/pom.xml b/connector/pom.xml
index 9ffc4969..571cca64 100644
--- a/connector/pom.xml
+++ b/connector/pom.xml
@@ -6,7 +6,7 @@
<parent>
<groupId>at.asitplus.eidas</groupId>
<artifactId>ms_specific</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<groupId>at.asitplus.eidas.ms_specific</groupId>
@@ -57,7 +57,16 @@
<artifactId>authmodule-eIDAS-v2</artifactId>
</dependency>
- <!-- Third party libs -->
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_sp</artifactId>
+ </dependency>
+
+ <!-- Third party libs -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
@@ -134,7 +143,7 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
- </dependency>
+ </dependency>
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf_core_utils</artifactId>
@@ -146,12 +155,7 @@
<artifactId>eaaf-core</artifactId>
<scope>test</scope>
<type>test-jar</type>
- </dependency>
- <dependency>
- <groupId>at.gv.egiz.eaaf</groupId>
- <artifactId>eaaf_module_pvp2_sp</artifactId>
- <scope>test</scope>
- </dependency>
+ </dependency>
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf_module_pvp2_sp</artifactId>
@@ -180,7 +184,7 @@
<groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf-springboot-utils</artifactId>
<scope>test</scope>
- </dependency>
+ </dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>mockwebserver</artifactId>
@@ -204,7 +208,7 @@
<scope>test</scope>
</dependency>
</dependencies>
-
+
<profiles>
<profile>
<id>default</id>
@@ -214,7 +218,7 @@
<name>default</name>
</property>
</activation>
- <dependencies>
+ <dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
@@ -232,12 +236,12 @@
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf-springboot-utils</artifactId>
- </dependency>
+ </dependency>
</dependencies>
</profile>
-
+
</profiles>
-
+
<build>
<finalName>ms_connector</finalName>
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java
new file mode 100644
index 00000000..59df6375
--- /dev/null
+++ b/connector/src/main/java/at/asitplus/eidas/specific/connector/config/MsConnectorMessageSource.java
@@ -0,0 +1,21 @@
+package at.asitplus.eidas.specific.connector.config;
+
+import java.util.Arrays;
+import java.util.List;
+
+import at.gv.egiz.eaaf.core.api.logging.IMessageSourceLocation;
+
+/**
+ * Inject eIDAS Connector specific messages into Spring based message-source.
+ *
+ * @author tlenz
+ *
+ */
+public class MsConnectorMessageSource implements IMessageSourceLocation {
+
+ @Override
+ public List<String> getMessageSourceLocation() {
+ return Arrays.asList("classpath:/properties/messages");
+ }
+
+}
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java
index e649fd3a..f360185b 100644
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java
+++ b/connector/src/main/java/at/asitplus/eidas/specific/connector/controller/ProcessEngineSignalController.java
@@ -46,7 +46,9 @@ import at.gv.egiz.eaaf.core.impl.idp.controller.AbstractProcessEngineSignalContr
public class ProcessEngineSignalController extends AbstractProcessEngineSignalController {
@RequestMapping(value = {
- MsEidasNodeConstants.ENDPOINT_COUNTRYSELECTION
+ MsEidasNodeConstants.ENDPOINT_COUNTRYSELECTION,
+ MsEidasNodeConstants.ENDPOINT_OTHER_LOGIN_METHOD_SELECTION,
+ MsEidasNodeConstants.ENDPOINT_RESIDENCY_INPUT
},
method = { RequestMethod.POST, RequestMethod.GET })
public void performGenericAuthenticationProcess(HttpServletRequest req, HttpServletResponse resp)
diff --git a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java b/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java
index e87979fb..57a4c19a 100644
--- a/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java
+++ b/connector/src/main/java/at/asitplus/eidas/specific/connector/processes/tasks/GenerateCountrySelectionFrameTask.java
@@ -38,7 +38,7 @@ import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
-import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
/**
* Create country-selection page.
@@ -47,7 +47,7 @@ import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
*
*/
@Component("GenerateCountrySelectionFrameTask")
-public class GenerateCountrySelectionFrameTask extends AbstractAuthServletTask {
+public class GenerateCountrySelectionFrameTask extends AbstractLocaleAuthServletTask {
@Autowired
ISpringMvcGuiFormBuilder guiBuilder;
@@ -56,9 +56,8 @@ public class GenerateCountrySelectionFrameTask extends AbstractAuthServletTask {
@Override
- public void execute(ExecutionContext executionContext, HttpServletRequest request,
- HttpServletResponse response)
- throws TaskExecutionException {
+ public void executeWithLocale(ExecutionContext executionContext, HttpServletRequest request,
+ HttpServletResponse response) throws TaskExecutionException {
try {
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.STARTING_COUNTRY_SELECTION);
diff --git a/connector/src/main/resources/application.properties b/connector/src/main/resources/application.properties
index 73a258d7..b4cb3bab 100644
--- a/connector/src/main/resources/application.properties
+++ b/connector/src/main/resources/application.properties
@@ -77,8 +77,13 @@ eidas.ms.auth.eIDAS.node_v2.loa.requested.minimum=http://eidas.europa.eu/LoA/hig
#eidas.ms.auth.eIDAS.szrclient.useTestService=true
#eidas.ms.auth.eIDAS.szrclient.endpoint.prod=
#eidas.ms.auth.eIDAS.szrclient.endpoint.test=http://localhost:1234/demoszr
+#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.type=jks
#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.path=keys/junit.jks
#eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.password=password
+#eidas.ms.auth.eIDAS.szrclient.ssl.key.alias=
+#eidas.ms.auth.eIDAS.szrclient.ssl.key.password=
+
+#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.type=
#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.path=
#eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.password=
eidas.ms.auth.eIDAS.szrclient.timeout.connection=15
@@ -98,6 +103,43 @@ eidas.ms.auth.eIDAS.szrclient.eidasbind.mds.inject=false
#eidas.ms.auth.eIDAS.authblock.key.password=f/+saJBc3a}*/T^s
+
+#### matching######
+# ZMR communication
+#eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demozmr
+#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=jks
+#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/junit.jks
+#eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=password
+#eidas.ms.auth.eIDAS.zmrclient.ssl.key.alias=
+#eidas.ms.auth.eIDAS.zmrclient.ssl.key.password=
+
+#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.type=
+#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path=
+#eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password=
+
+eidas.ms.auth.eIDAS.zmrclient.timeout.connection=15
+eidas.ms.auth.eIDAS.zmrclient.timeout.response=30
+
+#eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=PERS_AENDERN
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.text=KITT for eIDAS Matching
+eidas.ms.auth.eIDAS.zmrclient.debug.logfullmessages=false
+
+
+# ERnP communication
+#eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
+#eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
+#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
+#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=../keystore/junit_test.jks
+#eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
+#eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
+#eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
+eidas.ms.client.http.connection.timeout.request=15
+eidas.ms.client.http.connection.timeout.socket=30
+
+
+
+
#Raw eIDAS Id data storage
eidas.ms.auth.eIDAS.szrclient.workarounds.eidmapping.revisionlog.active=true
eidas.ms.auth.eIDAS.szrclient.workarounds.use.getidentitylink.for.ida=true
diff --git a/connector/src/main/resources/properties/messages.properties b/connector/src/main/resources/properties/messages.properties
index cc60cd6e..a2aaf95d 100644
--- a/connector/src/main/resources/properties/messages.properties
+++ b/connector/src/main/resources/properties/messages.properties
@@ -47,8 +47,11 @@ gui.countryselection.country.is=Iceland
gui.countryselection.country.is.logo.alt=Iceland-eID
gui.countryselection.country.it=Italy
gui.countryselection.country.it.logo.alt=Italy-eID
+<<<<<<< HEAD
gui.countryselection.country.li=Lichtenstein
gui.countryselection.country.li.logo.alt=Lichtensteinische-eID
+=======
+>>>>>>> 1ad67c91820de1c7f2b2541f8e39752baac197d2
gui.countryselection.country.lt=Lithuania
gui.countryselection.country.lt.logo.alt=Lithuania-eID
gui.countryselection.country.lv=Latvia
diff --git a/connector/src/main/resources/properties/messages_de.properties b/connector/src/main/resources/properties/messages_de.properties
index 6f470ea0..187b7b37 100644
--- a/connector/src/main/resources/properties/messages_de.properties
+++ b/connector/src/main/resources/properties/messages_de.properties
@@ -48,8 +48,11 @@ gui.countryselection.country.is=Island
gui.countryselection.country.is.logo.alt=Isländische-eID
gui.countryselection.country.it=Italien
gui.countryselection.country.it.logo.alt=Italienische-eID
+<<<<<<< HEAD
gui.countryselection.country.li=Lichtenstein
gui.countryselection.country.li.logo.alt=Lichtensteinische-eID
+=======
+>>>>>>> 1ad67c91820de1c7f2b2541f8e39752baac197d2
gui.countryselection.country.lt=Litauen
gui.countryselection.country.lt.logo.alt=Litauische-eID
gui.countryselection.country.lv=Lettland
diff --git a/connector/src/main/resources/properties/status_messages_en.properties b/connector/src/main/resources/properties/status_messages_en.properties
index 80228a47..f07a8705 100644
--- a/connector/src/main/resources/properties/status_messages_en.properties
+++ b/connector/src/main/resources/properties/status_messages_en.properties
@@ -5,7 +5,8 @@ eidas.03=No CitizenCountry available. Can not start eIDAS authentication process
eidas.04=Request contains no sessionToken. Authentication process stops
eidas.05=Received eIDAS response-message is not valid. Reason: {0}
eidas.06=LoA from eIDAS response-message {0} does not match to requested LoA
-eidas.07=eIDAS Response attribute-validation FAILED. Attribute:{0} Reason: {1}
+eidas.07=eIDAS Response attribute-validation FAILED. Attribute:{0} Reason: {1}.
+
config.01=No configuration-file parameter found. Maybe Java SystemD parameter is missing
config.03=Can not load configuration from path {0} (See logs for more details)
diff --git a/connector/src/main/resources/specific_eIDAS_connector.beans.xml b/connector/src/main/resources/specific_eIDAS_connector.beans.xml
index 42fa6360..9861a7c6 100644
--- a/connector/src/main/resources/specific_eIDAS_connector.beans.xml
+++ b/connector/src/main/resources/specific_eIDAS_connector.beans.xml
@@ -11,73 +11,65 @@
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
+
<import resource="specific_eIDAS_core.beans.xml"/>
+ <bean id="msConnectorMessageSource"
+ class="at.asitplus.eidas.specific.connector.config.MsConnectorMessageSource" />
+
<bean id="processEngineSignalController"
- class="at.asitplus.eidas.specific.connector.controller.ProcessEngineSignalController" />
+ class="at.asitplus.eidas.specific.connector.controller.ProcessEngineSignalController" />
<bean id="saml2MetadataGeneration"
class="at.asitplus.eidas.specific.connector.health.Saml2MetadataHealthIndicator">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
</bean>
<bean id="PVPEndPointConfiguration"
- class="at.asitplus.eidas.specific.connector.config.PvpEndPointConfiguration" />
+ class="at.asitplus.eidas.specific.connector.config.PvpEndPointConfiguration" />
<bean id="PVPEndPointCredentialProvider"
- class="at.asitplus.eidas.specific.connector.provider.PvpEndPointCredentialProvider" />
+ class="at.asitplus.eidas.specific.connector.provider.PvpEndPointCredentialProvider" />
<bean id="PVPMetadataConfigurationFactory"
- class="at.asitplus.eidas.specific.connector.provider.PvpMetadataConfigurationFactory" />
+ class="at.asitplus.eidas.specific.connector.provider.PvpMetadataConfigurationFactory" />
<bean id="pvp2SProfileEndpoint"
- class="at.asitplus.eidas.specific.connector.controller.Pvp2SProfileEndpoint">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
- <property name="metadataProvider">
- <ref bean="PVPMetadataProvider" />
- </property>
+ class="at.asitplus.eidas.specific.connector.controller.Pvp2SProfileEndpoint">
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
+ <property name="metadataProvider" ref="PVPMetadataProvider" />
</bean>
<bean id="AuthnRequestValidator"
- class="at.asitplus.eidas.specific.connector.verification.AuthnRequestValidator" />
+ class="at.asitplus.eidas.specific.connector.verification.AuthnRequestValidator" />
- <bean id="SAMLVerificationEngine"
- class="at.gv.egiz.eaaf.modules.pvp2.impl.verification.SamlVerificationEngine" />
+ <!-- bean id="SAMLVerificationEngine"
+ class="at.gv.egiz.eaaf.modules.pvp2.impl.verification.SamlVerificationEngine" /-->
<bean id="pvpMetadataService"
- class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.MetadataAction">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
+ class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.MetadataAction">
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
</bean>
<bean id="PVPAuthenticationRequestAction"
- class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.AuthenticationAction">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
- <property name="metadataProvider">
- <ref bean="PVPMetadataProvider" />
- </property>
+ class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.AuthenticationAction">
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
+ <property name="metadataProvider" ref="PVPMetadataProvider" />
</bean>
<bean id="PVPMetadataProvider"
- class="at.asitplus.eidas.specific.connector.provider.PvpMetadataProvider" />
+ class="at.asitplus.eidas.specific.connector.provider.PvpMetadataProvider" />
<bean id="PVPSubjectNameGenerator"
- class="at.asitplus.eidas.specific.connector.builder.PvpSubjectNameGenerator" />
+ class="at.asitplus.eidas.specific.connector.builder.PvpSubjectNameGenerator" />
<!-- Tasks -->
<bean id="GenerateCountrySelectionFrameTask"
- class="at.asitplus.eidas.specific.connector.processes.tasks.GenerateCountrySelectionFrameTask"
- scope="prototype" />
+ class="at.asitplus.eidas.specific.connector.processes.tasks.GenerateCountrySelectionFrameTask"
+ scope="prototype" />
<bean id="EvaluateCountrySelectionTask"
- class="at.asitplus.eidas.specific.connector.processes.tasks.EvaluateCountrySelectionTask"
- scope="prototype" />
+ class="at.asitplus.eidas.specific.connector.processes.tasks.EvaluateCountrySelectionTask"
+ scope="prototype" />
</beans> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/countrySelection.html b/connector/src/main/resources/templates/countrySelection.html
index 3937b464..14457210 100644
--- a/connector/src/main/resources/templates/countrySelection.html
+++ b/connector/src/main/resources/templates/countrySelection.html
@@ -3,254 +3,267 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
-
<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="$contextPath/static/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <script type="text/javascript" src="$contextPath/static/js/js_country.js" th:attr="src=@{/static/static/js/js_country.js}"></script>
- <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../../webapp/js/js_country.js"
+ th:attr="src=@{/static/js/js_country.js}"></script>
+ <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
</head>
-
<body>
- <div id="page">
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
-
- <h2 th:text="#{gui.countryselection.header.selection}"> Select your country </h2>
- <div id="country">
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Belgium-EU.png" alt="Belgium-eID"
- th:attr="src=@{img/countries/Belgium-EU.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
- <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
- <input type="hidden" name="selectedCountry" value="BE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Bulgaria-EU.png" alt="Bulgaria-eID"
- th:attr="src=@{img/countries/Bulgaria-EU.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
- <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" >
- <input type="hidden" name="selectedCountry" value="BG">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Croatia-EU.png" alt="Croatia-eID"
- th:attr="src=@{img/countries/Croatia-EU.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
- <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
- <input type="hidden" name="selectedCountry" value="HR">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Cyprus-EU.png" alt="Cyprus-eID"
- th:attr="src=@{img/countries/Cyprus-EU.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
- <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}">
- <input type="hidden" name="selectedCountry" value="CY">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/CzechRepublic-EU.png" alt="CzechRepublic-eID"
- th:attr="src=@{img/countries/CzechRepublic-EU.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
- <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
- <input type="hidden" name="selectedCountry" value="CZ">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Denmark-EU.png" alt="Denmark-eID"
- th:attr="src=@{img/countries/Denmark-EU.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
- <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}">
- <input type="hidden" name="selectedCountry" value="DK">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
- th:attr="src=@{img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
- <input type="submit" role="button" value="Deutschland / Germany" th:attr="value=#{gui.countryselection.country.de}" />
- <input type="hidden" name="selectedCountry" value="DE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Estonia-EU.png" alt="Estonia-eID"
- th:attr="src=@{img/countries/Estonia-EU.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
- <input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
- <input type="hidden" name="selectedCountry" value="EE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Finland-EU.png" alt="Finland-eID"
- th:attr="src=@{img/countries/Finland-EU.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
- <input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}">
- <input type="hidden" name="selectedCountry" value="FI">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/France-EU.png" alt="France-eID"
- th:attr="src=@{img/countries/France-EU.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
- <input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}">
- <input type="hidden" name="selectedCountry" value="FR">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Greece-EU.png" alt="Greece-eID"
- th:attr="src=@{img/countries/Greece-EU.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
- <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}">
- <input type="hidden" name="selectedCountry" value="GR">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Hungary-EU.png" alt="Hungary-eID"
- th:attr="src=@{img/countries/Hungary-EU.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
- <input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}">
- <input type="hidden" name="selectedCountry" value="HU">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Ireland-EU.png" alt="Ireland-eID"
- th:attr="src=@{img/countries/Iceland.png},alt=#{gui.countryselection.country.is.logo.alt}"/></a>
- <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.is}"/>
- <input type="hidden" name="selectedCountry" value="IS">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Ireland-EU.png" alt="Ireland-eID"
- th:attr="src=@{img/countries/Ireland-EU.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
- <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}">
- <input type="hidden" name="selectedCountry" value="IE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Italy-EU.png" alt="Italy-eID"
- th:attr="src=@{img/countries/Italy-EU.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
- <input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
- <input type="hidden" name="selectedCountry" value="IT">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Latvia-EU.png" alt="Latvia-eID"
- th:attr="src=@{img/countries/Latvia-EU.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
- <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}">
- <input type="hidden" name="selectedCountry" value="LV">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Luxembourg-EU.png" alt="Luxembourg-eID"
- th:attr="src=@{img/countries/Luxembourg-EU.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
- <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}">
- <input type="hidden" name="selectedCountry" value="LT">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Luxembourg-EU.png" alt="Luxembourg-eID"
- th:attr="src=@{img/countries/Luxembourg-EU.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
- <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}">
- <input type="hidden" name="selectedCountry" value="LU">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Malta-EU.png" alt="Malta-eID"
- th:attr="src=@{img/countries/Malta-EU.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
- <input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}">
- <input type="hidden" name="selectedCountry" value="MT">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/TheNetherlands-EU_.png" alt="Netherlands-eID"
- th:attr="src=@{img/countries/TheNetherlands-EU_.png},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
- <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
- <input type="hidden" name="selectedCountry" value="NL">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Poland-EU.png" alt="Poland-eID"
- th:attr="src=@{img/countries/Poland-EU.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
- <input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
- <input type="hidden" name="selectedCountry" value="PL">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Portugal-EU.png" alt="Portugal-eID"
- th:attr="src=@{img/countries/Portugal-EU.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
- <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
- <input type="hidden" name="selectedCountry" value="PT">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Romania-EU.png" alt="Romania-eID"
- th:attr="src=@{img/countries/Romania-EU.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
- <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}">
- <input type="hidden" name="selectedCountry" value="RO">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Slovakia-EU.png" alt="Slovakia-eID"
- th:attr="src=@{img/countries/Slovakia-EU.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
- <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}">
- <input type="hidden" name="selectedCountry" value="SK">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Slovenia-EU.png" alt="Slovenia-eID"
- th:attr="src=@{img/countries/Slovenia-EU.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
- <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
- <input type="hidden" name="selectedCountry" value="SI">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Spain-EU.png" alt="Spain-eID"
- th:attr="src=@{img/countries/Spain-EU.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
- <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
- <input type="hidden" name="selectedCountry" value="ES">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/Sweden-EU.png" alt="Sweden-eID"
- th:attr="src=@{img/countries/Sweden-EU.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
- <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}">
- <input type="hidden" name="selectedCountry" value="SE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint">
- <a><img class="countryimage" src="$contextPath/img/countries/UnitedKingdom-EU.png" alt="UnitedKingdom-eID"
- th:attr="src=@{img/countries/UnitedKingdom-EU.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
- <input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}">
- <input type="hidden" name="selectedCountry" value="UK">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancle}">
- <input type="hidden" name="stopAuthProcess" value="true" >
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
- </form>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
</div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li><a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}"> Startseite
+ BMI </a></li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
</div>
+
+ <h1 th:text="#{gui.countryselection.header.selection}"> Wählen Sie Ihr Land / Select your country </h1>
+
+ <div id="country">
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/germany-eu_.png" alt="Germany-eID"
+ th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
+ <input type="submit" role="button" value="Deutschland / Germany"
+ th:attr="value=#{gui.countryselection.country.de}"/>
+ <input type="hidden" name="selectedCountry" value="DE">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
+ th:attr="src=@{img/countries/Belgium-EU_gray.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
+ <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Bulgaria-EU_gray.png"
+ alt="Bulgaria-eID"
+ th:attr="src=@{/img/countries/Bulgaria-EU_gray.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
+ <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
+ th:attr="src=@{/img/countries/Croatia-EU_gray.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
+ <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
+ th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
+ <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/CzechRepublic-EU_gray.png"
+ alt="CzechRepublic-eID"
+ th:attr="src=@{/img/countries/CzechRepublic-EU_gray.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
+ <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
+ th:attr="src=@{/img/countries/Denmark-EU_gray.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
+ <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
+ th:attr="src=@{/img/countries/Estonia-EU_gray.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
+ <input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Finland-EU_gray.png" alt="Finland-eID"
+ th:attr="src=@{/img/countries/Finland-EU_gray.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
+ <input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/France-EU_gray.png" alt="France-eID"
+ th:attr="src=@{/img/countries/France-EU_gray.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
+ <input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Greece-EU_gray.png" alt="Greece-eID"
+ th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
+ <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
+ th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
+ <input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
+ th:attr="src=@{/img/countries/Ireland-EU_gray.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
+ <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Italy-EU_gray.png" alt="Italy-eID"
+ th:attr="src=@{/img/countries/Italy-EU_gray.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
+ <input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
+ th:attr="src=@{/img/countries/Latvia-EU_gray.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
+ <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Luxembourg-EU_gray.png"
+ alt="Luxembourg-eID"
+ th:attr="src=@{/img/countries/Luxembourg-EU_gray.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
+ <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Malta-EU_gray.png" alt="Malta-eID"
+ th:attr="src=@{/img/countries/Malta-EU_gray.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
+ <input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Poland-EU_gray.png" alt="Poland-eID"
+ th:attr="src=@{/img/countries/Poland-EU_gray.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
+ <input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
+ th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
+ <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Romania-EU_gray.png" alt="Romania-eID"
+ th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
+ <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Slovakia-EU_gray.png"
+ alt="Slovakia-eID"
+ th:attr="src=@{/img/countries/Slovakia-EU_gray.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
+ <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
+ th:attr="src=@{/img/countries/Slovenia-EU_gray.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
+ <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/Spain-EU_gray.png" alt="Spain-eID"
+ th:attr="src=@{/img/countries/Spain-EU_gray.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
+ <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
+ th:attr="src=@{/img/countries/Sweden-EU_gray.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
+ <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="../../webapp/img/countries/TheNetherlands-EU_gray.jpg"
+ alt="TheNetherlands-eID"
+ th:attr="src=@{/img/countries/TheNetherlands-EU_gray.jpg},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
+ <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="../../webapp/img/countries/UnitedKingdom-EU_gray.png"
+ alt="UnitedKingdom-eID"
+ th:attr="src=@{/img/countries/UnitedKingdom-EU_gray.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
+ <input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}" disabled>
+ </form>
+
+ </div>
+
+ <!-- Abbrechen Button -->
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel"
+ th:attr="value=#{gui.countryselection.cancel}">
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+ <p th:text="#{gui.countryselection.notsupportedinfo}">Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken
+ ... </p>
+
+ <h2 th:text="#{gui.countryselection.infos.general.header}"> Information zur Anmeldung über Europäische eIDs </h2>
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}"> Bundesministerium
+ für Inneres </a>
+ <span th:text="#{gui.countryselection.infos.general.part.2}"> second part </span>
+ </p>
+
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.3}"> third part </span>
+ <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank"
+ th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
+ <span th:text="#{gui.countryselection.infos.general.part.4}"> fourth part </span>
+ </p>
+
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.5}"> fived part </span>
+ <a href="https://www.dsb.gv.at/-/das-erganzungsregister-fur-naturliche-personen-ernp-" target="_blank"
+ th:text="#{gui.countryselection.infos.general.link.2}"></a>
+ <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
+ </p>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
</body>
</html>
diff --git a/connector/src/main/resources/templates/eidas_node_forward.html b/connector/src/main/resources/templates/eidas_node_forward.html
new file mode 100644
index 00000000..3cd30d36
--- /dev/null
+++ b/connector/src/main/resources/templates/eidas_node_forward.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <script src="../../webapp/autocommit.js"
+ th:attr="src=@{/autocommit.js}"></script>
+</head>
+<body>
+ <noscript>
+ <p>
+ <strong>Note:</strong> Since your browser does not support
+ JavaScript, you must press the Continue button once to proceed.
+ </p>
+ </noscript>
+
+ <div id="alert">Your login is being processed. Thank you for
+ waiting.</div>
+
+ <form action="${endPoint}" method="post" target="_parent"
+ th:attr="action=@{${endPoint}}">
+ <div>
+ <input type="hidden" name="${tokenName}" value="${tokenValue}"
+ th:attr="value=${tokenValue},name=${tokenName}" />
+ </div>
+ <noscript>
+ <div>
+ <p>Your browser does not support JavaScript. Click the button to continuing the process .</p>
+ <input type="submit" value="Continue" />
+ </div>
+ </noscript>
+ </form>
+
+</body>
+</html> \ No newline at end of file
diff --git a/connector/src/main/resources/templates/error_message.html b/connector/src/main/resources/templates/error_message.html
index 86f9d29d..c5f1ebb3 100644
--- a/connector/src/main/resources/templates/error_message.html
+++ b/connector/src/main/resources/templates/error_message.html
@@ -3,10 +3,10 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
-
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link rel="stylesheet" href="$contextPath/css/css_error.css" th:href="@{/css/css_error.css}" />
-
+ <link rel="stylesheet" href="../../webapp/css/css_error.css" th:href="@{/css/css_error.css}" />
+
<title th:text="#{gui.errorpage.msg.title}">An error arise ... </title>
</head>
@@ -14,21 +14,21 @@
<div id="page">
<div id="page1" class="case selected-case" role="main">
<h2 class="OA_header" role="heading">Authentication error arise</h2>
-
+
<div class="hell" role="application" >
<h2 class="OA_header" role="heading" th:text="#{gui.errorpage.msg.title}">Error Header</h2>
-
+
<div id="alert_area" class="hell" role="application" >
<p th:text="#{gui.errorpage.msg.information}">Error Information</p>
<br/>
- <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
+ <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
<p><b th:text="#{gui.errorpage.msg.errormsg}">Msg :</b > <span th:text="${#messages.msgWithParams('__${errorCode}__', '__${errorParams}__')}"></span></p>
- </div>
- <!-- errorMsg -->
- </div>
+ </div>
+ <!-- errorMsg -->
+ </div>
<div th:if="${stacktrace}">
- <p><b th:text="#{gui.errorpage.msg.stacktrace}">fullError</b> <span th:text="${stacktrace}"></span></p>
+ <p><b th:text="#{gui.errorpage.msg.stacktrace}">fullError</b> <span th:text="${stacktrace}"></span></p>
</div>
</div>
diff --git a/connector/src/main/resources/templates/other_login_method.html b/connector/src/main/resources/templates/other_login_method.html
new file mode 100644
index 00000000..e5f03712
--- /dev/null
+++ b/connector/src/main/resources/templates/other_login_method.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <title th:text="#{gui.otherlogin.title}">eIDAS-Login Other Login Methods</title>
+ <style>
+ .block {
+ width: 100%;
+ }
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 20em;
+ }
+ </style>
+</head>
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <h1 th:text="#{gui.otherlogin.header.selection}"> Select an alternative login method </h1>
+
+ <div id="otherlogin" class="block">
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Handy-Signatur / Mobile Signature"
+ th:text="#{gui.otherlogin.hs}">A
+ </button>
+ <input type="hidden" name="loginSelection" value="MOBILE_PHONE_SIGNATURE_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Andere eIDAS ID" th:text="#{gui.otherlogin.eidas}">B
+ </button>
+ <input type="hidden" name="loginSelection" value="EIDAS_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Keine weitere HS / eIDAS"
+ th:text="#{gui.otherlogin.none}">C
+ </button>
+ <input type="hidden" name="loginSelection" value="NO_OTHER_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <!-- Abbrechen Button -->
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.otherlogin.cancel}"></button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
+</body>
+</html>
diff --git a/connector/src/main/resources/templates/pvp2_post_binding.html b/connector/src/main/resources/templates/pvp2_post_binding.html
index 90858237..06b9b494 100644
--- a/connector/src/main/resources/templates/pvp2_post_binding.html
+++ b/connector/src/main/resources/templates/pvp2_post_binding.html
@@ -6,7 +6,7 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
- <script src="$contextPath/autocommit.js"></script>
+ <script src="/autocommit.js"></script>
</head>
<body>
<noscript>
@@ -21,7 +21,7 @@
<form action="${action}" method="post" target="_parent">
<div>
- #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
+ #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
#if($SAMLRequest) <input type="hidden" name="SAMLRequest" value="${SAMLRequest}" /> #end
#if($SAMLResponse) <input type="hidden" name="SAMLResponse" value="${SAMLResponse}" /> #end
</div>
diff --git a/connector/src/main/resources/templates/residency.html b/connector/src/main/resources/templates/residency.html
new file mode 100644
index 00000000..6e266449
--- /dev/null
+++ b/connector/src/main/resources/templates/residency.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../../webapp/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../../webapp/js/jquery-3.6.0.js"
+ th:attr="src=@{/static/js/jquery-3.6.0.min.js}"></script>
+ <title th:text="#{gui.residency.title}">Österreichischer Wohnsitz</title>
+ <script type="text/javascript" th:inline="javascript">
+ $(document).ready(function () {
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ $("#loading").hide();
+ $.ajaxSetup({
+ beforeSend: function () {
+ $("#loading").show();
+ },
+ complete: function () {
+ $("#loading").hide();
+ }
+ });
+ $("#inputForm input[type='text']").keyup(function (event) {
+ if (event.keyCode === 13) {
+ $("#buttonSearch").click();
+ }
+ });
+ });
+
+ function search() {
+ let updatedText = /*[[#{gui.residency.updated}]]*/ 'Updated text';
+ let errorText = /*[[#{gui.residency.error}]]*/ 'Error';
+ let foundText = /*[[#{gui.residency.found}]]*/ 'Found {0}';
+ let uniqueText = /*[[#{gui.residency.unique}]]*/ 'Unique';
+ let invalidInputText = /*[[#{gui.residency.header.inputinvalid}]]*/ 'Invalid';
+ if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputPostleitzahl").val().trim() &&
+ !$("#inputForm #inputVillage").val().trim()) {
+ $("#textResult").show().text(invalidInputText);
+ return;
+ }
+ $.ajax({
+ type: "POST",
+ url: "http://localhost:8080/ms_connector/residency/search",
+ data: $("#inputForm").serialize()
+ }).done(function (data, textStatus, jqXHR) {
+ if (data["resultCount"] === 1) {
+ $("#textResult").show().text(uniqueText);
+ $("#tableResult tbody").empty();
+ $("#tableResult").hide();
+ $("#inputForm #inputPostleitzahl").val(data["results"][0]["postleitzahl"]);
+ $("#inputForm #inputMunicipality").val(data["results"][0]["municipality"]);
+ $("#inputForm #inputVillage").val(data["results"][0]["village"]);
+ $("#inputForm #inputStreet").val(data["results"][0]["street"]);
+ $("#inputForm #inputNumber").val(data["results"][0]["number"]);
+ return;
+ }
+ $("#textResult").show().text(foundText.replace("{0}", data["resultCount"]));
+ $("#tableResult").show();
+ $("#tableResult tbody").empty();
+ $.each(data.results, function (i, output) {
+ $("#tableResult tbody")
+ .append($("<tr>")
+ .append($("<td>").text(output["postleitzahl"] !== null ? output["postleitzahl"] : "").css("text-align", "right"))
+ .append($("<td>").text(output["municipality"] !== null ? output["municipality"] : ""))
+ .append($("<td>").text(output["village"] !== null ? output["village"] : ""))
+ .append($("<td>").text(output["street"] !== null ? output["street"] : ""))
+ .append($("<td>").text(output["number"] !== null ? output["number"] : "").css("text-align", "right"))
+ .css("cursor", "pointer").click(function () {
+ $("#inputForm #inputPostleitzahl").val($(this).children("td:nth-child(1)").text());
+ $("#inputForm #inputMunicipality").val($(this).children("td:nth-child(2)").text());
+ $("#inputForm #inputVillage").val($(this).children("td:nth-child(3)").text());
+ $("#inputForm #inputStreet").val($(this).children("td:nth-child(4)").text());
+ $("#inputForm #inputNumber").val($(this).children("td:nth-child(5)").text());
+ $("#textResult").show().text(updatedText);
+ search();
+ })
+ );
+ })
+ if (data.results.length === 0) {
+ $("#tableResult").hide();
+ }
+ }).fail(function (jqXHR, textStatus, errorThrown) {
+ $("#textResult").show().text(errorText);
+ })
+ }
+
+ function clearInput() {
+ $("#inputForm #inputMunicipality").val("");
+ $("#inputForm #inputVillage").val("");
+ $("#inputForm #inputStreet").val("");
+ $("#inputForm #inputNumber").val("");
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ }
+ </script>
+ <style>
+ #residency label {
+ width: 10em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #residency input {
+ width: 15em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #result {
+ margin-bottom: 4em;
+ }
+
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 8em;
+ }
+
+ .block {
+ width: 100%;
+ }
+
+ #tableResult td, #tableResult th {
+ padding: 1em 0.5em;
+ }
+
+ #tableResult a {
+ text-decoration: underline;
+ }
+
+ #tableResult {
+ border-collapse: collapse;
+ }
+
+ #tableResult tr {
+ border-bottom: 1px solid black;
+ }
+ </style>
+</head>
+
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <h1 th:text="#{gui.residency.header.selection}">Search your Austrian Residency</h1>
+
+ <div id="residency">
+ <form id="inputForm" method="post" action="$contextPath$submitEndpoint"
+ th:attr="action=@{${submitEndpoint}}">
+ <div><p th:text="#{gui.residency.header.help}">Please enter a postcode, municipality or village first</p>
+ </div>
+ <div>
+ <label for="inputPostleitzahl" th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</label>
+ <input type="text" id="inputPostleitzahl" name="postleitzahl" value=""/>
+ </div>
+ <div>
+ <label for="inputMunicipality" th:text="#{gui.residency.input.municipality}">Municipality</label>
+ <input type="text" id="inputMunicipality" name="municipality" value=""/>
+ </div>
+ <div>
+ <label for="inputVillage" th:text="#{gui.residency.input.village}">Village</label>
+ <input type="text" id="inputVillage" name="village" value=""/>
+ </div>
+ <div>
+ <label for="inputStreet" th:text="#{gui.residency.input.street}">Street</label>
+ <input type="text" id="inputStreet" name="street" value=""/>
+ </div>
+ <div>
+ <label for="inputNumber" th:text="#{gui.residency.input.number}">Number</label>
+ <input type="text" id="inputNumber" name="number" value=""/>
+ </div>
+ <div class="block">
+ <button type="button" id="buttonSearch" onclick="search()" th:text="#{gui.residency.search}">
+ Search
+ </button>
+ <button type="button" id="buttonClear" onclick="clearInput()" th:text="#{gui.residency.clear}">
+ Clear
+ </button>
+ <button type="button" id="buttonProceed" th:text="#{gui.residency.proceed}">Proceed</button>
+ </div>
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.residency.cancel}">Cancel</button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+ <div>
+ <img id="loading" src="../../webapp/img/ajax-loader.gif"
+ th:attr="src=@{/static/img/ajax-loader.gif}" style="display: none"/>
+ </div>
+
+ <div id="result">
+ <div>
+ <p><span id="textResult" style="display: none"></span></p>
+ </div>
+ <table id="tableResult" style="display: none">
+ <thead>
+ <tr>
+ <th th:text="#{gui.residency.input.postleitzahl}" style="text-align: right">Postcode</th>
+ <th th:text="#{gui.residency.input.municipality}">Municipality</th>
+ <th th:text="#{gui.residency.input.village}">Village</th>
+ <th th:text="#{gui.residency.input.street}">Street</th>
+ <th th:text="#{gui.residency.input.number}" style="text-align: right">Number</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+ </div>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
+</body>
+</html>
diff --git a/connector/src/main/webapp/css/basic.css b/connector/src/main/webapp/css/basic.css
deleted file mode 100644
index 4bec163a..00000000
--- a/connector/src/main/webapp/css/basic.css
+++ /dev/null
@@ -1,4 +0,0 @@
-@charset "utf-8";
- .bgTrans {
- background-color:transparent
- } \ No newline at end of file
diff --git a/connector/src/main/webapp/img/ajax-loader.gif b/connector/src/main/webapp/img/ajax-loader.gif
new file mode 100644
index 00000000..f2a1bc0c
--- /dev/null
+++ b/connector/src/main/webapp/img/ajax-loader.gif
Binary files differ
diff --git a/connector/src/main/webapp/js/jquery-3.6.0.min.js b/connector/src/main/webapp/js/jquery-3.6.0.min.js
new file mode 100644
index 00000000..c4c6022f
--- /dev/null
+++ b/connector/src/main/webapp/js/jquery-3.6.0.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/connector/src/main/webapp/js/js_country.js b/connector/src/main/webapp/js/js_country.js
new file mode 100644
index 00000000..5dcea90e
--- /dev/null
+++ b/connector/src/main/webapp/js/js_country.js
@@ -0,0 +1,42 @@
+function clickCountryFlag(element) {
+ if (!element) return false;
+
+ var form = element.target.closest("form");
+
+ if (!form) return false;
+
+ form.submit();
+ return false;
+}
+
+
+/* Set JS events by EventListener to prevent problems with CSP*/
+document.addEventListener("DOMContentLoaded", function(event) {
+
+ /* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
+ if (!Element.prototype.matches)
+ Element.prototype.matches = Element.prototype.msMatchesSelector ||
+ Element.prototype.webkitMatchesSelector;
+
+ if (!Element.prototype.closest)
+ Element.prototype.closest = function(s) {
+ var el = this;
+ if (!document.documentElement.contains(el)) return null;
+ do {
+ if (el.matches(s)) return el;
+ el = el.parentElement || el.parentNode;
+ } while (el !== null && el.nodeType === 1);
+ return null;
+ };
+
+ /* set Click events by EventListener to prevent JavaScript in HTML which can be a problem with CSP*/
+ var allFlags = document.getElementsByClassName("countryimage");
+ for (i=0;i<allFlags.length;i++) {
+ if(allFlags[i].getAttribute("disabled") == null) {
+ allFlags[i].closest("a").addEventListener('click', clickCountryFlag, false);
+ }
+ }
+});
+
+
+
diff --git a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/FullStartUpAndProcessTest.java b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/FullStartUpAndProcessTest.java
index c2b87aa4..b9525de5 100644
--- a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/FullStartUpAndProcessTest.java
+++ b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/FullStartUpAndProcessTest.java
@@ -1,12 +1,13 @@
package at.asitplus.eidas.specific.connector.test;
import static org.mockito.ArgumentMatchers.any;
-import static org.powermock.api.mockito.PowerMockito.when;
+import static org.mockito.Mockito.when;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
+import java.math.BigInteger;
import java.net.URISyntaxException;
import java.time.Instant;
import java.util.Map;
@@ -63,11 +64,25 @@ import at.asitplus.eidas.specific.connector.test.saml2.Pvp2SProfileEndPointTest;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasSignalServlet;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.WorkflowInfoServer;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.NatuerlichePersonErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.NatuerlichePersonErgebnisType.PersonenName;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonErgebnisSatzType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenResponse;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.Personendaten;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonensuchergebnisType;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.IdentificationType;
import at.gv.egiz.components.spring.api.SpringBootApplicationContextInitializer;
+import at.gv.egiz.eaaf.core.api.IStatusMessenger;
import at.gv.egiz.eaaf.core.api.data.EaafConstants;
import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
import at.gv.egiz.eaaf.core.impl.idp.controller.ProtocolFinalizationController;
+import at.gv.egiz.eaaf.core.impl.logging.LogMessageProviderFactory;
import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
import at.gv.egiz.eaaf.core.impl.utils.Random;
import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
@@ -85,9 +100,12 @@ import eu.eidas.auth.commons.tx.BinaryLightToken;
import eu.eidas.specificcommunication.SpecificCommunicationDefinitionBeanNames;
import eu.eidas.specificcommunication.exception.SpecificCommunicationException;
import eu.eidas.specificcommunication.protocol.SpecificCommunicationService;
+import lombok.SneakyThrows;
import lombok.val;
import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
import net.shibboleth.utilities.java.support.xml.XMLParserException;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
import szrservices.GetIdentityLinkEidasResponse;
import szrservices.PersonInfoType;
import szrservices.SZR;
@@ -99,7 +117,7 @@ import szrservices.SignContentResponseType;
@SpringBootTest
@ContextConfiguration(initializers = {
org.springframework.boot.context.config.DelegatingApplicationContextInitializer.class,
- SpringBootApplicationContextInitializer.class
+ SpringBootApplicationContextInitializer.class
})
@TestPropertySource(locations = { "file:src/test/resources/config/junit_config_1_springboot.properties" })
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
@@ -107,32 +125,40 @@ import szrservices.SignContentResponseType;
public class FullStartUpAndProcessTest {
private static final String FINAL_REDIRECT = "http://localhost/public/secure/finalizeAuthProtocol?pendingid=";
-
+
@Autowired private WebApplicationContext wac;
@Autowired private PvpEndPointCredentialProvider credentialProvider;
@Autowired private PvpMetadataProvider metadataProvider;
@Autowired private ResourceLoader resourceLoader;
@Autowired private EidasAttributeRegistry attrRegistry;
-
+
@Autowired private Pvp2SProfileEndpoint sProfile;
@Autowired private ProcessEngineSignalController signal;
@Autowired private EidasSignalServlet eidasSignal;
@Autowired private ProtocolFinalizationController finalize;
-
+
+ @Autowired private IStatusMessenger messager;
+
@Rule
public final SoapServiceRule soap = SoapServiceRule.newInstance();
-
+
private SZR szrMock;
+ private ServicePort zmrClient;
+
+ private static MockWebServer mockWebServer;
private String cc;
private String givenName;
private String familyName;
private String dateOfBirth;
private String personalId;
+ private String pseudonym;
private String vsz;
private String eidasBind;
-
-
+
+
+
+
/**
* jUnit class initializer.
* @throws InterruptedException In case of an error
@@ -141,10 +167,11 @@ public class FullStartUpAndProcessTest {
*
*/
@BeforeClass
- public static void classInitializer() throws InterruptedException, InitializationException, ComponentInitializationException {
+ @SneakyThrows
+ public static void classInitializer() {
final String current = new java.io.File(".").toURI().toString();
System.clearProperty("eidas.ms.configuration");
-
+
//eIDAS Ref. Impl. properties
System.setProperty("EIDAS_CONFIG_REPOSITORY", current.substring("file:".length())
+ "../basicConfig/eIDAS/");
@@ -152,27 +179,34 @@ public class FullStartUpAndProcessTest {
+ "../basicConfig/eIDAS/");
System.setProperty("SPECIFIC_PROXY_SERVICE_CONFIG_REPOSITORY", current.substring("file:".length())
+ "../basicConfig/eIDAS/");
-
+
EaafOpenSaml3xInitializer.eaafInitialize();
+
+ // start ERnP mockup WebServer
+ mockWebServer = new MockWebServer();
+ mockWebServer.start(1718);
}
-
+
/**
* Test shut-down.
*
* @throws Exception In case of an error
*/
@AfterClass
- public static void closeIgniteNode() throws Exception {
+ @SneakyThrows
+ public static void closeIgniteNode() {
System.out.println("Closiong Ignite Node ... ");
Ignition.stopAll(true);
-
//set Ignite-node holder to 'null' because static holders are shared between different tests
final Field field = IgniteInstanceInitializerSpecificCommunication.class.getDeclaredField("instance");
field.setAccessible(true);
field.set(null, null);
+ // shut-down ERnP mock-up WebServer
+ mockWebServer.shutdown();
+
}
/**
@@ -188,27 +222,30 @@ public class FullStartUpAndProcessTest {
for (FilterRegistrationBean<?> filter : filters.values()) {
if (filter.isEnabled()) {
builder.addFilter(filter.getFilter(), "/*");
-
+
}
}
+ LogMessageProviderFactory.setStatusMessager(messager);
+
szrMock = soap.mock(SZR.class, "http://localhost:1234/demoszr");
-
-
-
+ zmrClient = soap.mock(ServicePort.class, "http://localhost:1234/demozmr");
+
+
cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
- personalId = cc + "/AT/" + RandomStringUtils.randomNumeric(64);
+ pseudonym = RandomStringUtils.randomNumeric(64);
+ personalId = cc + "/AT/" + pseudonym;
familyName = RandomStringUtils.randomAlphabetic(10);
givenName = RandomStringUtils.randomAlphabetic(10);
dateOfBirth = "2015-10-12";
-
+
vsz = RandomStringUtils.randomNumeric(10);
eidasBind = RandomStringUtils.randomAlphanumeric(50);
-
+
}
-
+
@Test
- public void userStopProcess() throws UnsupportedEncodingException, XMLParserException, UnmarshallingException,
+ public void userStopProcess() throws UnsupportedEncodingException, XMLParserException, UnmarshallingException,
TransformerException, IOException, MarshallingException, ComponentInitializationException, EaafException {
//start authentication process by sending a SAML2 Authn-Request
MockHttpServletRequest saml2Req = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
@@ -216,74 +253,74 @@ public class FullStartUpAndProcessTest {
MockHttpServletResponse selectCountryResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(saml2Req, selectCountryResp));
-
- // send SAML2 AuthnRequest
+
+ // send SAML2 AuthnRequest
sProfile.pvpIdpPostRequest(saml2Req, selectCountryResp);
-
+
//check country-selection response
Assert.assertEquals("no country-selection page", 200, selectCountryResp.getStatus());
Assert.assertEquals("cc-selection page", "text/html;charset=UTF-8", selectCountryResp.getContentType());
String selectionPage = selectCountryResp.getContentAsString();
Assert.assertNotNull("selectionPage is null", selectionPage);
Assert.assertFalse("selectionPage is empty", selectionPage.isEmpty());
-
- String pendingReqId = extractRequestToken(selectionPage,
- "<input type=\"hidden\" name=\"pendingid\" value=\"");
+
+ String pendingReqId = extractRequestToken(selectionPage,
+ "<input type=\"hidden\" name=\"pendingid\" value=\"");
Assert.assertFalse("PendingReqId", pendingReqId.isEmpty());
-
-
+
+
// set-up user-stop request
MockHttpServletRequest userStopReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
userStopReq.setParameter("pendingid", pendingReqId);
userStopReq.setParameter(EaafConstants.PARAM_HTTP_STOP_PROCESS, "true");
-
+
MockHttpServletResponse finalizeResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(userStopReq, finalizeResp));
-
+
// send user-stop request
signal.performGenericAuthenticationProcess(userStopReq, finalizeResp);
-
+
//validate state
Assert.assertEquals("forward to finalization", 302, finalizeResp.getStatus());
Assert.assertNotNull("missing redirect header", finalizeResp.getHeader("Location"));
Assert.assertTrue("wrong redirect header", finalizeResp.getHeader("Location").startsWith(FINAL_REDIRECT));
String finalPendingReqId = finalizeResp.getHeader("Location").substring(FINAL_REDIRECT.length());
Assert.assertFalse("final pendingRequestId", finalPendingReqId.isEmpty());
-
+
//set-up finalization request
MockHttpServletRequest finalizationReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
finalizationReq.setParameter("pendingid", finalPendingReqId);
-
+
MockHttpServletResponse saml2Resp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(finalizationReq, saml2Resp));
-
+
// exexcute finalization step
finalize.finalizeAuthProtocol(finalizationReq, saml2Resp);
-
+
//validate state
Assert.assertEquals("forward to finalization", 200, saml2Resp.getStatus());
Assert.assertEquals("forward to eIDAS Node page", "text/html;charset=UTF-8", saml2Resp.getContentType());
String saml2RespPage = saml2Resp.getContentAsString();
Assert.assertNotNull("selectionPage is null", saml2RespPage);
Assert.assertFalse("selectionPage is empty", saml2RespPage.isEmpty());
-
+
//validate SAML2 response
- String saml2RespB64 = extractRequestToken(saml2RespPage,
+ String saml2RespB64 = extractRequestToken(saml2RespPage,
"<input type=\"hidden\" name=\"SAMLResponse\" value=\"");
Assert.assertNotNull("SAML2 response", saml2RespB64);
-
+
StatusResponseType saml2 = (StatusResponseType) XMLObjectSupport.unmarshallFromInputStream(
- XMLObjectProviderRegistrySupport.getParserPool(),
+ XMLObjectProviderRegistrySupport.getParserPool(),
new ByteArrayInputStream(Base64Utils.decodeFromString(saml2RespB64)));
- Assert.assertEquals("SAML2 status", "urn:oasis:names:tc:SAML:2.0:status:Responder",
+ Assert.assertEquals("SAML2 status", "urn:oasis:names:tc:SAML:2.0:status:Responder",
saml2.getStatus().getStatusCode().getValue());
- Assert.assertEquals("ms-connector status", "1005",
+ Assert.assertEquals("ms-connector status", "1005",
saml2.getStatus().getStatusCode().getStatusCode().getValue());
-
+
}
-
+
@Test
public void fullSuccessProcess() throws EaafException, Exception {
//start authentication process by sending a SAML2 Authn-Request
@@ -292,151 +329,201 @@ public class FullStartUpAndProcessTest {
MockHttpServletResponse selectCountryResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(saml2Req, selectCountryResp));
-
- // send SAML2 AuthnRequest
+
+ // send SAML2 AuthnRequest
sProfile.pvpIdpPostRequest(saml2Req, selectCountryResp);
-
+
//check country-selection response
Assert.assertEquals("no country-selection page", 200, selectCountryResp.getStatus());
Assert.assertEquals("cc-selection page", "text/html;charset=UTF-8", selectCountryResp.getContentType());
String selectionPage = selectCountryResp.getContentAsString();
Assert.assertNotNull("selectionPage is null", selectionPage);
Assert.assertFalse("selectionPage is empty", selectionPage.isEmpty());
-
- String pendingReqId = extractRequestToken(selectionPage,
- "<input type=\"hidden\" name=\"pendingid\" value=\"");
+
+ String pendingReqId = extractRequestToken(selectionPage,
+ "<input type=\"hidden\" name=\"pendingid\" value=\"");
Assert.assertFalse("PendingReqId", pendingReqId.isEmpty());
-
-
+
+
// set-up country-selection request
MockHttpServletRequest selectCountryReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
selectCountryReq.setParameter("pendingid", pendingReqId);
selectCountryReq.setParameter("selectedCountry", cc);
-
+
MockHttpServletResponse forwardEidasNodeResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(selectCountryReq, forwardEidasNodeResp));
-
+
// send country-selection request
signal.performGenericAuthenticationProcess(selectCountryReq, forwardEidasNodeResp);
-
+
//check forward to eIDAS node response
Assert.assertEquals("forward to eIDAS Node", 200, forwardEidasNodeResp.getStatus());
Assert.assertEquals("forward to eIDAS Node page", "text/html;charset=UTF-8", forwardEidasNodeResp.getContentType());
String forwardPage = forwardEidasNodeResp.getContentAsString();
Assert.assertNotNull("forward to eIDAS Node is null", forwardPage);
Assert.assertFalse("forward to eIDAS Node is empty", forwardPage.isEmpty());
-
- String eidasNodeReqToken = extractRequestToken(forwardPage,
+
+ String eidasNodeReqToken = extractRequestToken(forwardPage,
"<input type=\"hidden\" name=\"token\" value=\"");
Assert.assertFalse("eidas req. token", eidasNodeReqToken.isEmpty());
-
+
//check eIDAS node request and build respose
String eidasRespToken = validateEidasNodeRequestAndBuildResponse(eidasNodeReqToken);
Assert.assertFalse("eidas resp. token", eidasRespToken.isEmpty());
-
-
+
+
// set-up eIDAS-node response
MockHttpServletRequest eidasNodeRespReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
eidasNodeRespReq.setParameter("token", eidasRespToken);
-
+
MockHttpServletResponse finalizeResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(eidasNodeRespReq, finalizeResp));
-
- injectSzrResponse();
+
+ // inject ZMR, ERnP and SZR responses for matching
+ injectZmrResponse();
+ injectSzrResponse();
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}") // empty response because we simulate result from ZMR
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
//excute eIDAS node response
eidasSignal.restoreEidasAuthProcess(eidasNodeRespReq, finalizeResp);
-
+
//validate state
Assert.assertEquals("forward to finalization", 302, finalizeResp.getStatus());
Assert.assertNotNull("missing redirect header", finalizeResp.getHeader("Location"));
Assert.assertTrue("wrong redirect header", finalizeResp.getHeader("Location").startsWith(FINAL_REDIRECT));
String finalPendingReqId = finalizeResp.getHeader("Location").substring(FINAL_REDIRECT.length());
Assert.assertFalse("final pendingRequestId", finalPendingReqId.isEmpty());
-
-
+
+
//set-up finalization request
MockHttpServletRequest finalizationReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
finalizationReq.setParameter("pendingid", finalPendingReqId);
-
+
MockHttpServletResponse saml2Resp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(finalizationReq, saml2Resp));
-
+
// exexcute finalization step
finalize.finalizeAuthProtocol(finalizationReq, saml2Resp);
-
+
//validate state
Assert.assertEquals("forward to finalization", 200, saml2Resp.getStatus());
Assert.assertEquals("forward to eIDAS Node page", "text/html;charset=UTF-8", saml2Resp.getContentType());
String saml2RespPage = saml2Resp.getContentAsString();
Assert.assertNotNull("selectionPage is null", saml2RespPage);
Assert.assertFalse("selectionPage is empty", saml2RespPage.isEmpty());
-
+
//validate SAML2 response
- String saml2RespB64 = extractRequestToken(saml2RespPage,
+ String saml2RespB64 = extractRequestToken(saml2RespPage,
"<input type=\"hidden\" name=\"SAMLResponse\" value=\"");
Assert.assertNotNull("SAML2 response", saml2RespB64);
-
+
StatusResponseType saml2 = (StatusResponseType) XMLObjectSupport.unmarshallFromInputStream(
- XMLObjectProviderRegistrySupport.getParserPool(),
+ XMLObjectProviderRegistrySupport.getParserPool(),
new ByteArrayInputStream(Base64Utils.decodeFromString(saml2RespB64)));
Assert.assertEquals("SAML2 status", Constants.SUCCESS_URI, saml2.getStatus().getStatusCode().getValue());
-
+
final AssertionAttributeExtractor extractor = new AssertionAttributeExtractor(saml2);
+
Assert.assertEquals("wrong resp attr. size", 7, extractor.getAllIncludeAttributeNames().size());
- Assert.assertEquals("Wrong attr: LoA ", "http://eidas.europa.eu/LoA/high",
+ Assert.assertEquals("Wrong attr: LoA ", "http://eidas.europa.eu/LoA/high",
extractor.getSingleAttributeValue("urn:oid:1.2.40.0.10.2.1.1.261.108"));
- Assert.assertEquals("Wrong attr: PVP_VERSION ", "2.2",
+ Assert.assertEquals("Wrong attr: PVP_VERSION ", "2.2",
extractor.getSingleAttributeValue("urn:oid:1.2.40.0.10.2.1.1.261.10"));
- Assert.assertEquals("Wrong attr: EID_ISSUER_NATION ", cc,
+ Assert.assertEquals("Wrong attr: EID_ISSUER_NATION ", cc,
extractor.getSingleAttributeValue("urn:oid:1.2.40.0.10.2.1.1.261.32"));
- Assert.assertEquals("Wrong attr: eidasBind", eidasBind,
+ Assert.assertEquals("Wrong attr: eidasBind", eidasBind,
extractor.getSingleAttributeValue("urn:eidgvat:attributes.eidbind"));
- Assert.assertNotNull("Wrong attr: authBlock",
+ Assert.assertNotNull("Wrong attr: authBlock",
extractor.getSingleAttributeValue("urn:eidgvat:attributes.authblock.signed"));
- Assert.assertNotNull("Wrong attr: piiTras.Id ",
+ Assert.assertNotNull("Wrong attr: piiTras.Id ",
extractor.getSingleAttributeValue("urn:eidgvat:attributes.piiTransactionId"));
Assert.assertEquals("Wrong attr:EID_STATUS_LEVEL ", "http://eid.gv.at/eID/status/identity",
extractor.getSingleAttributeValue(PvpAttributeDefinitions.EID_IDENTITY_STATUS_LEVEL_NAME));
-
+
}
private void injectSzrResponse() throws Exception {
-
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
-
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(vsz);
+
val signContentResp = new SignContentResponseType();
final SignContentEntry signContentEntry = new SignContentEntry();
signContentEntry.setValue(eidasBind);
signContentResp.getOut().add(signContentEntry);
- when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp);
-
+ when(szrMock.signContent(any(), any(), any())).thenReturn(signContentResp);
+
+ }
+
+ private void injectZmrResponse() throws Exception {
+ ResponseType resp = new ResponseType();
+
+ WorkflowInfoServer workflow = new WorkflowInfoServer();
+ workflow.setProzessInstanzID(new BigInteger(RandomStringUtils.randomNumeric(10)));
+ resp.setWorkflowInfoServer(workflow);
+
+ PersonSuchenResponse persRespObj = new PersonSuchenResponse();
+ PersonensuchergebnisType searchResult = new PersonensuchergebnisType();
+ PersonErgebnisSatzType personInfoObj = new PersonErgebnisSatzType();
+ resp.setPersonSuchenResponse(persRespObj);
+ persRespObj.setPersonensuchergebnis(searchResult);
+
+ searchResult.setGefundeneSaetzeERnP(0);
+ searchResult.setGefundeneSaetze(1);
+ searchResult.getPersonErgebnisSatz().add(personInfoObj);
+
+ PersonErgebnisType personInfo = new PersonErgebnisType();
+ Personendaten personDataObj = new Personendaten();
+ personInfoObj.setPersonendaten(personDataObj);
+ personDataObj.getPersonErgebnis().add(personInfo);
+
+ EidasIdentitaetErgebnisType eidasPersonalIdentifier = new EidasIdentitaetErgebnisType();
+ personInfo.getEidasIdentitaet().add(eidasPersonalIdentifier);
+ eidasPersonalIdentifier.setEidasWert(pseudonym);
+ eidasPersonalIdentifier.setEidasArt(Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER);
+ eidasPersonalIdentifier.setStaatscode2(cc);
+
+ NatuerlichePersonErgebnisType natInfo = new NatuerlichePersonErgebnisType();
+ IdentificationType bpk = new IdentificationType();
+ PersonenName natName = new PersonenName();
+ natInfo.getIdentification().add(bpk);
+ natInfo.setPersonenName(natName);
+ personInfo.setNatuerlichePerson(natInfo);
+
+ bpk.setType(EaafConstants.URN_PREFIX_CDID + "ZP");
+ bpk.setValue(RandomStringUtils.randomAlphabetic(10));
+ natInfo.setGeburtsdatum(dateOfBirth);
+ natName.setFamilienname(familyName);
+ natName.setVorname(givenName);
+
+ when(zmrClient.service(any(), any())).thenReturn(resp);
+
}
- private String validateEidasNodeRequestAndBuildResponse(String eidasNodeReqToken)
+
+ private String validateEidasNodeRequestAndBuildResponse(String eidasNodeReqToken)
throws SpecificCommunicationException, URISyntaxException {
final SpecificCommunicationService springManagedSpecificConnectorCommunicationService =
(SpecificCommunicationService) wac.getBean(
SpecificCommunicationDefinitionBeanNames.SPECIFIC_CONNECTOR_COMMUNICATION_SERVICE.toString());
-
- //read request and validate basic properties
- ILightRequest req = springManagedSpecificConnectorCommunicationService.getAndRemoveRequest(eidasNodeReqToken,
+
+ //read request and validate basic properties
+ ILightRequest req = springManagedSpecificConnectorCommunicationService.getAndRemoveRequest(eidasNodeReqToken,
attrRegistry.getCoreAttributeRegistry().getAttributes());
-
+
Assert.assertNotNull("eIDAS Node req", req);
Assert.assertEquals("Wrong CC", cc, req.getCitizenCountryCode());
Assert.assertEquals("Wrong CC", EaafConstants.EIDAS_LOA_HIGH, req.getLevelOfAssurance());
-
-
+
+
//set response from eIDAS node
BinaryLightToken respoToken = springManagedSpecificConnectorCommunicationService.putResponse(
buildDummyAuthResponse(Constants.SUCCESS_URI, req.getId()));
return Base64Utils.encodeToString(respoToken.getTokenBytes());
-
+
}
private AuthenticationResponse buildDummyAuthResponse(String statusCode, String reqId) throws URISyntaxException {
@@ -448,7 +535,7 @@ public class FullStartUpAndProcessTest {
Constants.eIDAS_ATTR_CURRENTGIVENNAME).first();
final AttributeDefinition<?> attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_DATEOFBIRTH).first();
-
+
final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder()
.put(attributeDef, personalId)
.put(attributeDef2, familyName)
@@ -465,20 +552,20 @@ public class FullStartUpAndProcessTest {
.levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH)
.attributes(attributeMap)
.build();
-
+
}
-
+
private String extractRequestToken(String selectionPage, String selector) {
int start = selectionPage.indexOf(selector);
Assert.assertTrue("find no pendingReqId location start", start > 0);
int end = selectionPage.indexOf("\"", start + selector.length());
Assert.assertTrue("find no pendingReqId location end", end > 0);
return selectionPage.substring(start + selector.length(), end);
-
+
}
- private void injectSaml2AuthnReq(MockHttpServletRequest saml2Req) throws XMLParserException, UnmarshallingException,
- SamlSigningException, CredentialsNotAvailableException, UnsupportedEncodingException, TransformerException,
+ private void injectSaml2AuthnReq(MockHttpServletRequest saml2Req) throws XMLParserException, UnmarshallingException,
+ SamlSigningException, CredentialsNotAvailableException, UnsupportedEncodingException, TransformerException,
IOException, MarshallingException, ComponentInitializationException {
final RequestAbstractType authnReq = (RequestAbstractType) XMLObjectSupport.unmarshallFromInputStream(
XMLObjectProviderRegistrySupport.getParserPool(),
@@ -487,19 +574,19 @@ public class FullStartUpAndProcessTest {
RequestAbstractType signedAuthnReq =
Saml2Utils.signSamlObject(authnReq, credentialProvider.getMessageSigningCredential(), true);
String b64 = Base64Utils.encodeToString(DomUtils.serializeNode(
- XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
+ XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
saml2Req.setParameter("SAMLRequest", b64);
-
+
final org.springframework.core.io.Resource resource = resourceLoader.getResource(
"classpath:/data/metadata_valid_without_encryption.xml");
Timer timer = new Timer("PVP metadata-resolver refresh");
- ResourceBackedMetadataResolver fileSystemResolver =
+ ResourceBackedMetadataResolver fileSystemResolver =
new ResourceBackedMetadataResolver(timer, new OpenSaml3ResourceAdapter(resource));
fileSystemResolver.setId("test");
fileSystemResolver.setParserPool(XMLObjectProviderRegistrySupport.getParserPool());
- fileSystemResolver.initialize();
+ fileSystemResolver.initialize();
metadataProvider.addMetadataResolverIntoChain(fileSystemResolver);
-
+
}
private void setSzrResponseIdentityLink(String responseXmlPath) throws JAXBException, SZRException_Exception {
diff --git a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/config/MsConnectorMessageSourceTest.java b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/config/MsConnectorMessageSourceTest.java
new file mode 100644
index 00000000..4c9d825d
--- /dev/null
+++ b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/config/MsConnectorMessageSourceTest.java
@@ -0,0 +1,71 @@
+package at.asitplus.eidas.specific.connector.test.config;
+
+import java.security.cert.CertificateException;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.config.InitializationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+
+import at.gv.egiz.eaaf.core.api.logging.IMessageSourceLocation;
+import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration({
+ "/applicationContext.xml",
+ "/spring/SpringTest_connector.beans.xml",
+ "/eaaf_core.beans.xml",
+ "/eaaf_pvp.beans.xml",
+ "/eaaf_pvp_idp.beans.xml",
+ "/spring/SpringTest-context_simple_storage.xml" })
+@WebAppConfiguration
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+@ActiveProfiles(profiles = {"deprecatedConfig"})
+public class MsConnectorMessageSourceTest {
+
+ /**
+ * jUnit class initializer.
+ * @throws ComponentInitializationException In case of an error
+ * @throws InitializationException In case of an error
+ * @throws CertificateException
+ *
+ */
+ @BeforeClass
+ public static void classInitializer() throws InitializationException,
+ ComponentInitializationException, CertificateException {
+ final String current = new java.io.File(".").toURI().toString();
+ System.setProperty("eidas.ms.configuration", current + "src/test/resources/config/junit_config_1.properties");
+
+ }
+
+ @Autowired
+ private ResourceLoader loader;
+ @Autowired(required = false)
+ private List<IMessageSourceLocation> messageSources;
+
+ @Test
+ public void checkMessageSources() {
+ Assert.assertNotNull("No messageSource", messageSources);
+
+ for (final IMessageSourceLocation messageSource : messageSources) {
+ Assert.assertNotNull("No sourcePath", messageSource.getMessageSourceLocation());
+
+ for (final String el : messageSource.getMessageSourceLocation()) {
+ final Resource messages = loader.getResource(el + ".properties");
+ Assert.assertTrue("Source not exist", messages.exists());
+
+ }
+ }
+ }
+}
diff --git a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/saml2/Pvp2SProfileEndPointTest.java b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/saml2/Pvp2SProfileEndPointTest.java
index ebc07680..a9612297 100644
--- a/connector/src/test/java/at/asitplus/eidas/specific/connector/test/saml2/Pvp2SProfileEndPointTest.java
+++ b/connector/src/test/java/at/asitplus/eidas/specific/connector/test/saml2/Pvp2SProfileEndPointTest.java
@@ -80,37 +80,37 @@ public class Pvp2SProfileEndPointTest {
@Autowired private PvpMetadataProvider metadataProvider;
@Autowired private ResourceLoader resourceLoader;
@Autowired private IRequestStorage storage;
-
+
private static CertificateFactory fact;
-
-
+
+
private MockHttpServletRequest httpReq;
private MockHttpServletResponse httpResp;
-
+
/**
* jUnit class initializer.
* @throws ComponentInitializationException In case of an error
* @throws InitializationException In case of an error
- * @throws CertificateException
- *
+ * @throws CertificateException
+ *
*/
@BeforeClass
- public static void classInitializer() throws InitializationException,
+ public static void classInitializer() throws InitializationException,
ComponentInitializationException, CertificateException {
final String current = new java.io.File(".").toURI().toString();
System.setProperty("eidas.ms.configuration", current + "src/test/resources/config/junit_config_1.properties");
-
+
EaafOpenSaml3xInitializer.eaafInitialize();
-
+
fact = CertificateFactory.getInstance("X.509");
-
+
}
-
+
/**
* jUnit test set-up.
- * @throws EaafException
- *
+ * @throws EaafException
+ *
*/
@Before
public void initialize() throws EaafException {
@@ -118,12 +118,12 @@ public class Pvp2SProfileEndPointTest {
httpResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
-
+
}
-
+
@Test
- public void authnReqWrongEndpoint() throws EaafException, XMLParserException, UnmarshallingException,
- UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
+ public void authnReqWrongEndpoint() throws EaafException, XMLParserException, UnmarshallingException,
+ UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
ComponentInitializationException {
//initialize test
final RequestAbstractType authnReq = (RequestAbstractType) XMLObjectSupport.unmarshallFromInputStream(
@@ -133,34 +133,34 @@ public class Pvp2SProfileEndPointTest {
RequestAbstractType signedAuthnReq =
Saml2Utils.signSamlObject(authnReq, credentialProvider.getMetaDataSigningCredential(), true);
String b64 = Base64Utils.encodeToString(DomUtils.serializeNode(
- XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
+ XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
httpReq.setParameter("SAMLRequest", b64);
-
+
final org.springframework.core.io.Resource resource = resourceLoader.getResource(
"classpath:/data/metadata_valid.xml");
Timer timer = new Timer("PVP metadata-resolver refresh");
- ResourceBackedMetadataResolver fileSystemResolver =
+ ResourceBackedMetadataResolver fileSystemResolver =
new ResourceBackedMetadataResolver(timer, new OpenSaml3ResourceAdapter(resource));
fileSystemResolver.setId("test");
fileSystemResolver.setParserPool(XMLObjectProviderRegistrySupport.getParserPool());
- fileSystemResolver.initialize();
+ fileSystemResolver.initialize();
metadataProvider.addMetadataResolverIntoChain(fileSystemResolver);
-
-
+
+
//request SAML2 authentication
try {
controller.pvpIdpPostRequest(httpReq, httpResp);
Assert.fail("wrong AuthnRequest not detected");
-
+
}catch (EaafException e) {
- Assert.assertEquals("wrong errorId", "pvp2.22", e.getErrorId());
-
- }
+ Assert.assertEquals("wrong errorId", "pvp2.22", e.getErrorId());
+
+ }
}
-
+
@Test
- public void authnReqWrongSigned() throws EaafException, XMLParserException, UnmarshallingException,
- UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
+ public void authnReqWrongSigned() throws EaafException, XMLParserException, UnmarshallingException,
+ UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
ComponentInitializationException {
//initialize test
final RequestAbstractType authnReq = (RequestAbstractType) XMLObjectSupport.unmarshallFromInputStream(
@@ -170,34 +170,34 @@ public class Pvp2SProfileEndPointTest {
RequestAbstractType signedAuthnReq =
Saml2Utils.signSamlObject(authnReq, credentialProvider.getMetaDataSigningCredential(), true);
String b64 = Base64Utils.encodeToString(DomUtils.serializeNode(
- XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
+ XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
httpReq.setParameter("SAMLRequest", b64);
-
+
final org.springframework.core.io.Resource resource = resourceLoader.getResource(
"classpath:/data/metadata_valid.xml");
Timer timer = new Timer("PVP metadata-resolver refresh");
- ResourceBackedMetadataResolver fileSystemResolver =
+ ResourceBackedMetadataResolver fileSystemResolver =
new ResourceBackedMetadataResolver(timer, new OpenSaml3ResourceAdapter(resource));
fileSystemResolver.setId("test");
fileSystemResolver.setParserPool(XMLObjectProviderRegistrySupport.getParserPool());
- fileSystemResolver.initialize();
+ fileSystemResolver.initialize();
metadataProvider.addMetadataResolverIntoChain(fileSystemResolver);
-
-
+
+
//request SAML2 authentication
try {
controller.pvpIdpPostRequest(httpReq, httpResp);
Assert.fail("wrong AuthnRequest not detected");
-
+
}catch (EaafException e) {
- Assert.assertEquals("wrong errorId", "pvp2.21", e.getErrorId());
-
- }
+ Assert.assertEquals("wrong errorId", "pvp2.21", e.getErrorId());
+
+ }
}
-
+
@Test
- public void authnReqMetadataExpired() throws EaafException, XMLParserException, UnmarshallingException,
- UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
+ public void authnReqMetadataExpired() throws EaafException, XMLParserException, UnmarshallingException,
+ UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
ComponentInitializationException {
//initialize test
final RequestAbstractType authnReq = (RequestAbstractType) XMLObjectSupport.unmarshallFromInputStream(
@@ -207,34 +207,34 @@ public class Pvp2SProfileEndPointTest {
RequestAbstractType signedAuthnReq =
Saml2Utils.signSamlObject(authnReq, credentialProvider.getMetaDataSigningCredential(), true);
String b64 = Base64Utils.encodeToString(DomUtils.serializeNode(
- XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
+ XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
httpReq.setParameter("SAMLRequest", b64);
-
+
final org.springframework.core.io.Resource resource = resourceLoader.getResource(
"classpath:/data/metadata_expired.xml");
Timer timer = new Timer("PVP metadata-resolver refresh");
- ResourceBackedMetadataResolver fileSystemResolver =
+ ResourceBackedMetadataResolver fileSystemResolver =
new ResourceBackedMetadataResolver(timer, new OpenSaml3ResourceAdapter(resource));
fileSystemResolver.setId("test");
fileSystemResolver.setParserPool(XMLObjectProviderRegistrySupport.getParserPool());
- fileSystemResolver.initialize();
+ fileSystemResolver.initialize();
metadataProvider.addMetadataResolverIntoChain(fileSystemResolver);
-
-
+
+
//request SAML2 authentication
try {
controller.pvpIdpPostRequest(httpReq, httpResp);
Assert.fail("wrong AuthnRequest not detected");
-
+
}catch (EaafException e) {
- Assert.assertEquals("wrong errorId", "pvp2.21", e.getErrorId());
-
- }
+ Assert.assertEquals("wrong errorId", "pvp2.21", e.getErrorId());
+
+ }
}
-
+
@Test
- public void authnReqValid() throws EaafException, XMLParserException, UnmarshallingException,
- UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
+ public void authnReqValid() throws EaafException, XMLParserException, UnmarshallingException,
+ UnsupportedEncodingException, TransformerException, IOException, MarshallingException,
ComponentInitializationException {
//initialize test
final RequestAbstractType authnReq = (RequestAbstractType) XMLObjectSupport.unmarshallFromInputStream(
@@ -244,67 +244,67 @@ public class Pvp2SProfileEndPointTest {
RequestAbstractType signedAuthnReq =
Saml2Utils.signSamlObject(authnReq, credentialProvider.getMessageSigningCredential(), true);
String b64 = Base64Utils.encodeToString(DomUtils.serializeNode(
- XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
+ XMLObjectSupport.getMarshaller(signedAuthnReq).marshall(signedAuthnReq)).getBytes("UTF-8"));
httpReq.setParameter("SAMLRequest", b64);
-
+
final org.springframework.core.io.Resource resource = resourceLoader.getResource(
"classpath:/data/metadata_valid.xml");
Timer timer = new Timer("PVP metadata-resolver refresh");
- ResourceBackedMetadataResolver fileSystemResolver =
+ ResourceBackedMetadataResolver fileSystemResolver =
new ResourceBackedMetadataResolver(timer, new OpenSaml3ResourceAdapter(resource));
fileSystemResolver.setId("test");
fileSystemResolver.setParserPool(XMLObjectProviderRegistrySupport.getParserPool());
- fileSystemResolver.initialize();
+ fileSystemResolver.initialize();
metadataProvider.addMetadataResolverIntoChain(fileSystemResolver);
-
-
+
+
//request SAML2 authentication
controller.pvpIdpPostRequest(httpReq, httpResp);
-
-
+
+
//validate state
Assert.assertEquals("http statuscode", 200, httpResp.getStatus());
Assert.assertEquals("Wrong http ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
-
+
String html = httpResp.getContentAsString();
Assert.assertNotNull("html result is null", html);
- Assert.assertFalse("html result is empty", html.isEmpty());
+ Assert.assertFalse("html result is empty", html.isEmpty());
Assert.assertTrue("Wrong page", html.contains("action=\"/myHomeCountry\""));
-
- String pattern = "<input type=\"hidden\" name=\"pendingid\" value=\"";
+
+ String pattern = "<input type=\"hidden\" name=\"pendingid\" value=\"";
int pendingIdStart = html.indexOf(pattern) + pattern.length();
- int pendingIdEnd = html.indexOf("\"", pendingIdStart);
- String pendingReqId = html.substring(pendingIdStart, pendingIdEnd);
+ int pendingIdEnd = html.indexOf("\"", pendingIdStart);
+ String pendingReqId = html.substring(pendingIdStart, pendingIdEnd);
Assert.assertFalse("pendingReqId is empty", pendingReqId.isEmpty());
-
+
IRequest pendingReq = storage.getPendingRequest(pendingReqId);
- Assert.assertNotNull("pendingReq", pendingReq);
+ Assert.assertNotNull("pendingReq", pendingReq);
Assert.assertNotNull("piiTransId", pendingReq.getUniquePiiTransactionIdentifier());
Assert.assertNotNull("piiTransId", pendingReq.getUniqueTransactionIdentifier());
-
- Assert.assertEquals("wrong OA Id", "https://demo.egiz.gv.at/demoportal-openID_demo",
+
+ Assert.assertEquals("wrong OA Id", "https://demo.egiz.gv.at/demoportal-openID_demo",
pendingReq.getRawData(MsEidasNodeConstants.DATA_REQUESTERID, String.class));
- Assert.assertEquals("wrong bPK Target", "urn:publicid:gv.at:cdid+BF",
+ Assert.assertEquals("wrong bPK Target", "urn:publicid:gv.at:cdid+BF",
pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier());
-
-
+
+
}
-
+
@Test
- public void checkSaml2Metadata() throws EaafException, UnsupportedEncodingException, XMLParserException,
+ public void checkSaml2Metadata() throws EaafException, UnsupportedEncodingException, XMLParserException,
UnmarshallingException, CertificateException, SignatureException {
-
+
//request SAML2 Metadata
controller.pvpMetadataRequest(httpReq, httpResp);
-
+
//validate state
Assert.assertEquals("http statuscode", 200, httpResp.getStatus());
Assert.assertEquals("Wrong http ContentType", "application/xml", httpResp.getContentType());
-
+
String html = httpResp.getContentAsString();
Assert.assertNotNull("html result is null", html);
- Assert.assertFalse("html result is empty", html.isEmpty());
-
+ Assert.assertFalse("html result is empty", html.isEmpty());
+
final EntityDescriptor entity = (EntityDescriptor) XMLObjectSupport.unmarshallFromInputStream(
XMLObjectProviderRegistrySupport.getParserPool(),
@@ -320,18 +320,18 @@ public class Pvp2SProfileEndPointTest {
final Credential cred = new BasicX509Credential((X509Certificate) fact.generateCertificate(
Pvp2SProfileEndPointTest.class.getResourceAsStream("/config/keys/Metadata.pem")));
SignatureValidator.validate(entity.getSignature(), cred);
-
+
Assert.assertEquals("wrong entityId", "http://localhost/pvp/metadata", entity.getEntityID());
Assert.assertNotNull("IDPSSODescr", entity.getRoleDescriptors(IDPSSODescriptor.DEFAULT_ELEMENT_NAME));
Assert.assertNotNull("SPSSODescr", entity.getRoleDescriptors(SPSSODescriptor.DEFAULT_ELEMENT_NAME));
- Assert.assertEquals("SPSSODescr. size", 0,
+ Assert.assertEquals("SPSSODescr. size", 0,
entity.getRoleDescriptors(SPSSODescriptor.DEFAULT_ELEMENT_NAME).size());
-
+
List<RoleDescriptor> idp = entity.getRoleDescriptors(IDPSSODescriptor.DEFAULT_ELEMENT_NAME);
Assert.assertEquals("IDP descr. size", 1, idp.size());
Assert.assertEquals("IDP descr. endpoints", 2, idp.get(0).getEndpoints().size());
Assert.assertEquals("IDP descr. keyDescr", 1, idp.get(0).getKeyDescriptors().size());
-
+
}
-
+
}
diff --git a/connector/src/test/resources/config/junit_config_1_springboot.properties b/connector/src/test/resources/config/junit_config_1_springboot.properties
index e63cda7b..91e6d2bb 100644
--- a/connector/src/test/resources/config/junit_config_1_springboot.properties
+++ b/connector/src/test/resources/config/junit_config_1_springboot.properties
@@ -43,6 +43,28 @@ eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=true
eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=false
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demozmr
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path=
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password=
+
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+# ERnP communication
+eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
+eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
+
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.type=jks
@@ -81,3 +103,39 @@ eidas.ms.sp.1.pvp2.metadata.url=http://junit.test/metadata
eidas.ms.sp.1.policy.allowed.requested.targets=test
eidas.ms.sp.1.policy.hasBaseIdTransferRestriction=true
+## PVP2 S-Profile client configuration
+#eidas.ms.modules.idaustriaclient.keystore.type=jks
+#eidas.ms.modules.idaustriaclient.keystore.path=keys/junit.jks1
+#eidas.ms.modules.idaustriaclient.keystore.password=password
+#eidas.ms.modules.idaustriaclient.key.metadata.alias=meta
+#eidas.ms.modules.idaustriaclient.key.metadata.password=password
+#eidas.ms.modules.idaustriaclient.key.signing.alias=sig
+#eidas.ms.modules.idaustriaclient.key.signing.password=password
+#eidas.ms.modules.idaustriaclient.metadata.validity=24
+
+eidas.ms.modules.idaustriaclient.keystore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.keystore.password=password
+eidas.ms.modules.idaustriaclient.keystore.type=jks
+
+eidas.ms.modules.idaustriaclient.metadata.sign.alias=meta
+eidas.ms.modules.idaustriaclient.metadata.sign.password=password
+eidas.ms.modules.idaustriaclient.request.sign.alias=sig
+eidas.ms.modules.idaustriaclient.request.sign.password=password
+eidas.ms.modules.idaustriaclient.response.encryption.alias=enc
+eidas.ms.modules.idaustriaclient.response.encryption.password=password
+
+eidas.ms.modules.idaustriaclient.truststore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.truststore.password=password
+eidas.ms.modules.idaustriaclient.truststore.type=jks
+
+eidas.ms.modules.idaustriaclient.node.entityId=
+eidas.ms.modules.idaustriaclient.sp.entityId=
+eidas.ms.modules.idaustriaclient.node.metadataUrl=
+
+eidas.ms.modules.idaustriaclient.metadata.organisation.name=JUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.friendyname=For testing with jUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.url=http://junit.test
+eidas.ms.modules.idaustriaclient.metadata.contact.givenname=Max
+eidas.ms.modules.idaustriaclient.metadata.contact.surname=Mustermann
+eidas.ms.modules.idaustriaclient.metadata.contact.email=max@junit.test
+
diff --git a/connector/src/test/resources/config/junit_config_2_springboot.properties b/connector/src/test/resources/config/junit_config_2_springboot.properties
index ecb22dec..1569f0f6 100644
--- a/connector/src/test/resources/config/junit_config_2_springboot.properties
+++ b/connector/src/test/resources/config/junit_config_2_springboot.properties
@@ -43,6 +43,27 @@ eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=true
eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=false
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demozmr
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path=
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password=
+
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+# ERnP communication
+eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
+eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.type=jks
@@ -81,3 +102,39 @@ eidas.ms.sp.1.pvp2.metadata.url=http://junit.test/metadata
eidas.ms.sp.1.policy.allowed.requested.targets=test
eidas.ms.sp.1.policy.hasBaseIdTransferRestriction=true
+
+## PVP2 S-Profile client configuration
+#eidas.ms.modules.idaustriaclient.keystore.type=jks
+#eidas.ms.modules.idaustriaclient.keystore.path=keys/junit.jks1
+#eidas.ms.modules.idaustriaclient.keystore.password=password
+#eidas.ms.modules.idaustriaclient.key.metadata.alias=meta
+#eidas.ms.modules.idaustriaclient.key.metadata.password=password
+#eidas.ms.modules.idaustriaclient.key.signing.alias=sig
+#eidas.ms.modules.idaustriaclient.key.signing.password=password
+#eidas.ms.modules.idaustriaclient.metadata.validity=24
+
+eidas.ms.modules.idaustriaclient.keystore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.keystore.password=password
+eidas.ms.modules.idaustriaclient.keystore.type=jks
+
+eidas.ms.modules.idaustriaclient.metadata.sign.alias=meta
+eidas.ms.modules.idaustriaclient.metadata.sign.password=password
+eidas.ms.modules.idaustriaclient.request.sign.alias=sig
+eidas.ms.modules.idaustriaclient.request.sign.password=password
+eidas.ms.modules.idaustriaclient.response.encryption.alias=enc
+eidas.ms.modules.idaustriaclient.response.encryption.password=password
+
+eidas.ms.modules.idaustriaclient.truststore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.truststore.password=password
+eidas.ms.modules.idaustriaclient.truststore.type=jks
+
+eidas.ms.modules.idaustriaclient.node.entityId=
+eidas.ms.modules.idaustriaclient.node.metadataUrl=
+
+eidas.ms.modules.idaustriaclient.metadata.organisation.name=JUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.friendyname=For testing with jUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.url=http://junit.test
+eidas.ms.modules.idaustriaclient.metadata.contact.givenname=Max
+eidas.ms.modules.idaustriaclient.metadata.contact.surname=Mustermann
+eidas.ms.modules.idaustriaclient.metadata.contact.email=max@junit.test
+
diff --git a/connector/src/test/resources/config/keys/junit_test.jks b/connector/src/test/resources/config/keys/junit_test.jks
new file mode 100644
index 00000000..ee6254a9
--- /dev/null
+++ b/connector/src/test/resources/config/keys/junit_test.jks
Binary files differ
diff --git a/connector/src/test/resources/config/properties/messages.properties b/connector/src/test/resources/config/properties/messages.properties
index ea604cda..23dd48c3 100644
--- a/connector/src/test/resources/config/properties/messages.properties
+++ b/connector/src/test/resources/config/properties/messages.properties
@@ -18,7 +18,7 @@ gui.countryselection.header1=Federal Ministry of Internal Affairs
gui.countryselection.header2=Austrian Central eIDAS Node
gui.countryselection.header3=Operated by Federal Ministry of Internal Affairs
gui.countryselection.header.selection=Select your country
-gui.countryselection.cancle=Cancel
+gui.countryselection.cancel=Cancel
gui.countryselection.notsupportedinfo=If you cannot find your country in this list then your electronic identity (eID) is not yet supported.
gui.countryselection.infos.general.header=Information on Logins with European eIDs
@@ -84,8 +84,8 @@ gui.countryselection.country.ro=Romania
gui.countryselection.country.ro.logo.alt=Romania-eID
gui.countryselection.country.sk=Slovakia
gui.countryselection.country.sk.logo.alt=Slovakia-eID
-gui.countryselection.country.sw=Sweden
-gui.countryselection.country.sw.logo.alt=Sweden-eID
+gui.countryselection.country.se=Sweden
+gui.countryselection.country.se.logo.alt=Sweden-eID
gui.countryselection.country.uk=United Kingdom
gui.countryselection.country.uk.logo.alt=United Kingdom-eID
@@ -95,4 +95,32 @@ gui.countryselection.country.testcountry.logo.alt=Testcountry-eID
gui.countryselection.mode.prod=Production
gui.countryselection.mode.qs=QS
gui.countryselection.mode.test=Test
-gui.countryselection.mode.dev=Development \ No newline at end of file
+gui.countryselection.mode.dev=Development
+
+##Other Login Methods page
+gui.otherlogin.title=eIDAS-Login Other Login Methods
+gui.otherlogin.header.selection=Select an alternative login method
+gui.otherlogin.hs=Mobile Signature ("Handy-Signatur")
+gui.otherlogin.eidas=Alternative eIDAS ID
+gui.otherlogin.none=No alternative login methods
+gui.otherlogin.cancel=Cancel
+
+##Austrian Residency page
+gui.residency.title=Austrian Residency
+gui.residency.header.selection=Search for your Austrian Residency
+gui.residency.header.help=You can search for the address that you have been registered at in the past. Please enter a \
+ postcode, municipality or village first to start the search.
+gui.residency.header.inputinvalid=Be sure to enter a value for Municipality or Village
+gui.residency.cancel=Cancel
+gui.residency.search=Search
+gui.residency.clear=Clear
+gui.residency.proceed=Proceed
+gui.residency.updated=Updated your input
+gui.residency.found=Found {0} results, click on one result to refine your search
+gui.residency.unique=Unique result found, please proceed
+gui.residency.error=Error on Backend Call
+gui.residency.input.postleitzahl=Postcode
+gui.residency.input.municipality=Municipality
+gui.residency.input.village=Village
+gui.residency.input.street=Street
+gui.residency.input.number=Number \ No newline at end of file
diff --git a/connector/src/test/resources/config/properties/messages_de.properties b/connector/src/test/resources/config/properties/messages_de.properties
index 989b8d9c..26b1b3c6 100644
--- a/connector/src/test/resources/config/properties/messages_de.properties
+++ b/connector/src/test/resources/config/properties/messages_de.properties
@@ -18,7 +18,7 @@ gui.countryselection.header1=Bundesministerium für Inneres
gui.countryselection.header2=Zentraler eIDAS Knoten der Republik Österreich
gui.countryselection.header3=Betrieben durch das Bundesministerium für Inneres
gui.countryselection.header.selection=Wählen Sie Ihr Land
-gui.countryselection.cancle=Abbrechen
+gui.countryselection.cancel=Abbrechen
gui.countryselection.notsupportedinfo=Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken, dann wird Ihre elektronische Identität (eID) leider noch nicht unterstützt.
gui.countryselection.infos.general.header=Information zur Anmeldung über Europäische eIDs
@@ -85,8 +85,8 @@ gui.countryselection.country.ro=Romänien
gui.countryselection.country.ro.logo.alt=Romänische-eID
gui.countryselection.country.sk=Slovakei
gui.countryselection.country.sk.logo.alt=Slovakische-eID
-gui.countryselection.country.sw=Schweden
-gui.countryselection.country.sw.logo.alt=Schwedische-eID
+gui.countryselection.country.se=Schweden
+gui.countryselection.country.se.logo.alt=Schwedische-eID
gui.countryselection.country.uk=Großbritanien
gui.countryselection.country.uk.logo.alt=Britische-eID
@@ -98,3 +98,30 @@ gui.countryselection.mode.qs=Qualitätsicherung
gui.countryselection.mode.test=Test
gui.countryselection.mode.dev=Development
+##Other Login Methods page
+gui.otherlogin.title=eIDAS-Login Alternative Anmeldemethoden
+gui.otherlogin.header.selection=Wählen Sie eine alternative Anmeldemethode
+gui.otherlogin.hs=Handy-Signatur
+gui.otherlogin.eidas=Alternativer eIDAS Login
+gui.otherlogin.none=Keine
+gui.otherlogin.cancel=Abbrechen
+
+##Austrian Residency page
+gui.residency.title=Österreichischer Wohnsitz
+gui.residency.header.selection=Suche nach Österreichischem Wohnsitz
+gui.residency.header.help=Hier können Sie nach einem Wohnsitze in Österreich suchen. Bitte geben Sie zuerst eine \
+ Postleitzahl, Gemeinde oder Ortschaft ein um die Suche zu starten.
+gui.residency.header.inputinvalid=Bitte geben Sie einen Wert für Gemeinde oder Ortschaft ein
+gui.residency.cancel=Abbrechen
+gui.residency.search=Suche
+gui.residency.clear=Löschen
+gui.residency.proceed=Fortfahren
+gui.residency.updated=Eingabe aktualisiert
+gui.residency.found={0} Ergebnisse gefunden, klicken Sie auf ein Ergebnis um die Suche zu verfeinern
+gui.residency.unique=Eindeutiges Ergebnis gefunden, bitte fortfahren
+gui.residency.error=Fehler bei Addresssuche
+gui.residency.input.postleitzahl=PLZ
+gui.residency.input.municipality=Gemeinde
+gui.residency.input.village=Ortschaft
+gui.residency.input.street=Straße
+gui.residency.input.number=Nummer \ No newline at end of file
diff --git a/connector/src/test/resources/config/templates/countrySelection.html b/connector/src/test/resources/config/templates/countrySelection.html
index 7fbc9464..02d01399 100644
--- a/connector/src/test/resources/config/templates/countrySelection.html
+++ b/connector/src/test/resources/config/templates/countrySelection.html
@@ -2,235 +2,268 @@
<html xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
+ th:with="lang=${#locale.language}" th:lang="${lang}">
<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="$contextPath/static/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
-<script type="text/javascript">
-</script>
-<style>
-body {
- background-image: none;
- margin: 0px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-div.header {
- background-color: #e9ecef;
- padding-top: 28px;
- padding-left: 137px;
- padding-right: 137px;
- padding-bottom: 12px;
-}
-div.titlebar {
- padding: 0px;
-}
-div.titlebar div {
-}
-.hidden {
- display: none;
-}
-ul.nav_oben {
- padding: 0px;
- margin: 0px;
- text-align: right;
- text-transform: uppercase;
-}
-li {
- display: inline-block;
-}
-div.header a {
- text-decoration: none;
- color: black;
-}
-a {
- text-decoration: none;
- color: #a22c1c;
-}
-.block {
- /* override country.css */
- width: 200px;
- padding-bottom: 20px;
-}
-@media only screen and (min-width: 1000px) {
- div.header {
- padding-left: 137px;
- padding-right: 137px;
- }
- .content {
- padding-left: 137px;
- padding-right: 137px;
- }
- footer {
- padding-left: 137px;
- padding-right: 137px;
- }
-}
-@media only screen and (max-width: 999px) {
- div.header {
- padding-left: 1em;
- padding-right: 1em;
- }
- .content {
- padding-left: 1em;
- padding-right: 1em;
- }
- footer {
- padding-left: 1em;
- padding-right: 1em;
- }
-}
-
-div.subtitle h1 {
- padding: 0px;
- margin: 0px;
- font-size: 130%;
- align: right;
-}
-div.subtitle h2 {
- padding: 0px;
- margin: 0px;
- font-size: 115%;
-}
-footer {
- left: 0;
- padding-top: 1em;
- bottom: 0;
- width: 100%;
- height: 2em;
- background-color: rgb(162,44,28);
- color: white;
-}
-.float {
- float: left;
-}
-.floatright {
- float: right;
-}
-.copyright {
- width: 66%;
- font-size: 80%;
-}
-#countries {
- padding-bottom: 40px;
-}
-#country {
- padding-bottom: 20px;
-}
-input[type=submit] {
- width: inherit;
-/* text-align: left; */
-}
-form {
- justify-content: center;
-}
-</style>
-<script type="text/javascript">
-
-/* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
-if (!Element.prototype.matches)
- Element.prototype.matches = Element.prototype.msMatchesSelector ||
- Element.prototype.webkitMatchesSelector;
-
-if (!Element.prototype.closest)
- Element.prototype.closest = function(s) {
- var el = this;
- if (!document.documentElement.contains(el)) return null;
- do {
- if (el.matches(s)) return el;
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- };
-
-
-function clickCountryFlag(element) {
- if (!element) return false;
-
- var form = element.closest("form");
-
- if (!form) return false;
-
- form.submit();
- return false;
-}
-</script>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../webcontent/js/js_country.js"
+ th:attr="src=@{/static/js/js_country.js}"></script>
+ <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
</head>
<body>
- <div class="header container">
+<div class="header container">
<div class="titlebar">
- <div>
- <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
- <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
- th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
- <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
- </a>
- </div>
- <ul class="nav_oben">
- <li>
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
- </li>
- &nbsp; &nbsp;
- <li><a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}" > Startseite BMI </a></li>
- </ul>
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li><a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}"> Startseite
+ BMI </a></li>
+ </ul>
</div>
- </div>
- <div class="content">
+</div>
+<div class="content">
<div class="subtitle">
- <h1 th:text="#{gui.countryselection.header2}" > Zentraler eIDAS Knoten der Republik Österreich </h1>
- <h2 th:text="#{gui.countryselection.header3}" > Betrieben durch das Bundesministerium für Inneres </h2>
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
</div>
<h1 th:text="#{gui.countryselection.header.selection}"> Wählen Sie Ihr Land / Select your country </h1>
<div id="country">
- <!-- Active countries -->
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
- th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
- <input type="submit" role="button" value="Deutschland / Germany" th:attr="value=#{gui.countryselection.country.de}" />
- <input type="hidden" name="selectedCountry" value="XX">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- </form>
-
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
+ th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
+ <input type="submit" role="button" value="Deutschland / Germany"
+ th:attr="value=#{gui.countryselection.country.de}"/>
+ <input type="hidden" name="selectedCountry" value="DE">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
+ th:attr="src=@{img/countries/Belgium-EU_gray.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
+ <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Bulgaria-EU_gray.png"
+ alt="Bulgaria-eID"
+ th:attr="src=@{/img/countries/Bulgaria-EU_gray.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
+ <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
+ th:attr="src=@{/img/countries/Croatia-EU_gray.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
+ <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
+ th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
+ <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/CzechRepublic-EU_gray.png"
+ alt="CzechRepublic-eID"
+ th:attr="src=@{/img/countries/CzechRepublic-EU_gray.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
+ <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
+ th:attr="src=@{/img/countries/Denmark-EU_gray.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
+ <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
+ th:attr="src=@{/img/countries/Estonia-EU_gray.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
+ <input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Finland-EU_gray.png" alt="Finland-eID"
+ th:attr="src=@{/img/countries/Finland-EU_gray.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
+ <input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/France-EU_gray.png" alt="France-eID"
+ th:attr="src=@{/img/countries/France-EU_gray.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
+ <input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Greece-EU_gray.png" alt="Greece-eID"
+ th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
+ <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
+ th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
+ <input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
+ th:attr="src=@{/img/countries/Ireland-EU_gray.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
+ <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Italy-EU_gray.png" alt="Italy-eID"
+ th:attr="src=@{/img/countries/Italy-EU_gray.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
+ <input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
+ th:attr="src=@{/img/countries/Latvia-EU_gray.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
+ <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Luxembourg-EU_gray.png"
+ alt="Luxembourg-eID"
+ th:attr="src=@{/img/countries/Luxembourg-EU_gray.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
+ <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Malta-EU_gray.png" alt="Malta-eID"
+ th:attr="src=@{/img/countries/Malta-EU_gray.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
+ <input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Poland-EU_gray.png" alt="Poland-eID"
+ th:attr="src=@{/img/countries/Poland-EU_gray.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
+ <input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
+ th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
+ <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Romania-EU_gray.png" alt="Romania-eID"
+ th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
+ <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Slovakia-EU_gray.png"
+ alt="Slovakia-eID"
+ th:attr="src=@{/img/countries/Slovakia-EU_gray.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
+ <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
+ th:attr="src=@{/img/countries/Slovenia-EU_gray.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
+ <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/Spain-EU_gray.png" alt="Spain-eID"
+ th:attr="src=@{/img/countries/Spain-EU_gray.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
+ <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
+ <select id="testEnvironment" name="selectedEnvironment">
+ <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
+ <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
+ <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
+ <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
+ </select>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
+ th:attr="src=@{/img/countries/Sweden-EU_gray.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
+ <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img class="countryimage" src="$contextPath/img/countries/TheNetherlands-EU_gray.jpg"
+ alt="TheNetherlands-eID"
+ th:attr="src=@{/img/countries/TheNetherlands-EU_gray.jpg},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
+ <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
+ </form>
+
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <a><img disabled class="countryimage" src="$contextPath/img/countries/UnitedKingdom-EU_gray.png"
+ alt="UnitedKingdom-eID"
+ th:attr="src=@{/img/countries/UnitedKingdom-EU_gray.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
+ <input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}" disabled>
+ </form>
+
</div>
<!-- Abbrechen Button -->
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancle}">
- <input type="hidden" name="stopAuthProcess" value="true" >
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel"
+ th:attr="value=#{gui.countryselection.cancel}">
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
</form>
- <p th:text="#{gui.countryselection.notsupportedinfo}" >Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken ... </p>
-
-<h2 th:text="#{gui.countryselection.infos.general.header}" > Information zur Anmeldung über Europäische eIDs </h2>
-<p>
- <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
- <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}" > Bundesministerium für Inneres </a>
- <span th:text="#{gui.countryselection.infos.general.part.2}"> second part </span>
-</p>
-
-<p>
- <span th:text="#{gui.countryselection.infos.general.part.3}"> third part </span>
- <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank" th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
- <span th:text="#{gui.countryselection.infos.general.part.4}"> fourth part </span>
-</p>
-
-<p
- <span th:text="#{gui.countryselection.infos.general.part.5}"> fived part </span>
- <a href="https://www.dsb.gv.at/-/das-erganzungsregister-fur-naturliche-personen-ernp-" target="_blank" th:text="#{gui.countryselection.infos.general.link.2}" ></a>
- <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
-</p>
-
- </div>
- <footer>
- <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
- <div></div>
- </footer>
+ <p th:text="#{gui.countryselection.notsupportedinfo}">Wenn Sie Ihr Land in dieser Aufzählung nicht entdecken
+ ... </p>
+
+ <h2 th:text="#{gui.countryselection.infos.general.header}"> Information zur Anmeldung über Europäische eIDs </h2>
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.1}"> first part </span>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.header1}"> Bundesministerium
+ für Inneres </a>
+ <span th:text="#{gui.countryselection.infos.general.part.2}"> second part </span>
+ </p>
+
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.3}"> third part </span>
+ <a href="https://eur-lex.europa.eu/legal-content/DE/TXT/HTML/?uri=CELEX:32014R0910&from=DE" target="_blank"
+ th:text="#{gui.countryselection.infos.general.link.1}"> eIDAS-Verordnung der Europäischen Union </a>
+ <span th:text="#{gui.countryselection.infos.general.part.4}"> fourth part </span>
+ </p>
+
+ <p>
+ <span th:text="#{gui.countryselection.infos.general.part.5}"> fived part </span>
+ <a href="https://www.dsb.gv.at/-/das-erganzungsregister-fur-naturliche-personen-ernp-" target="_blank"
+ th:text="#{gui.countryselection.infos.general.link.2}"></a>
+ <span th:text="#{gui.countryselection.infos.general.part.6}"> sixed part </span>
+ </p>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
</body>
</html>
diff --git a/connector/src/test/resources/config/templates/countrySelection_example.html b/connector/src/test/resources/config/templates/countrySelection_example.html
deleted file mode 100644
index 3b7c2d50..00000000
--- a/connector/src/test/resources/config/templates/countrySelection_example.html
+++ /dev/null
@@ -1,210 +0,0 @@
-<!DOCTYPE html>
-<html xmlns:th="http://www.thymeleaf.org"
- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
- layout:decorator="fragments/base"
- th:with="lang=${#locale.language}" th:lang="${lang}">
-
-<head>
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" href="$contextPath/static/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
- <script type="text/javascript" src="$contextPath/static/js/js_country.js" th:attr="src=@{/static/js/js_country.js}"></script>
- <title th:text="#{gui.countryselection.title}">eIDAS-Login Länderauswahl</title>
-</head>
-
-<body>
- <div id="page">
- <div class="languageselection" th:include="language_selection :: selectlanguage">
- LanguageSelectionBlock
- </div>
-
- <h2 th:text="#{gui.countryselection.header.selection}"> Select your country </h2>
- <div id="country">
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/germany-eu_.png" alt="Germany-eID"
- th:attr="src=@{/img/countries/germany-eu_.png},alt=#{gui.countryselection.country.de.logo.alt}"/></a>
- <input type="submit" role="button" value="Deutschland / Germany" th:attr="value=#{gui.countryselection.country.de}" />
- <input type="hidden" name="selectedCountry" value="DE">
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}" />
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Belgium-EU_gray.png" alt="Belgium-eID"
- th:attr="src=@{img/countries/Belgium-EU_gray.png},alt=#{gui.countryselection.country.be.logo.alt}"/></a>
- <input type="submit" value="Belgium" th:attr="value=#{gui.countryselection.country.be}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Bulgaria-EU_gray.png" alt="Bulgaria-eID"
- th:attr="src=@{/img/countries/Bulgaria-EU_gray.png},alt=#{gui.countryselection.country.bg.logo.alt}"/></a>
- <input type="submit" value="Bulgaria" th:attr="value=#{gui.countryselection.country.bg}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Croatia-EU_gray.png" alt="Croatia-eID"
- th:attr="src=@{/img/countries/Croatia-EU_gray.png},alt=#{gui.countryselection.country.hr.logo.alt}"/></a>
- <input type="submit" value="Croatia" th:attr="value=#{gui.countryselection.country.hr}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Cyprus-EU_gray.png" alt="Cyprus-eID"
- th:attr="src=@{/img/countries/Cyprus-EU_gray.png},alt=#{gui.countryselection.country.cy.logo.alt}"/></a>
- <input type="submit" value="Cyprus" th:attr="value=#{gui.countryselection.country.cy}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/CzechRepublic-EU_gray.png" alt="CzechRepublic-eID"
- th:attr="src=@{/img/countries/CzechRepublic-EU_gray.png},alt=#{gui.countryselection.country.cz.logo.alt}"/></a>
- <input type="submit" value="CzechRepublic" th:attr="value=#{gui.countryselection.country.cz}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Denmark-EU_gray.png" alt="Denmark-eID"
- th:attr="src=@{/img/countries/Denmark-EU_gray.png},alt=#{gui.countryselection.country.dk.logo.alt}"/></a>
- <input type="submit" value="Denmark" th:attr="value=#{gui.countryselection.country.dk}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Estonia-EU_gray.png" alt="Estonia-eID"
- th:attr="src=@{/img/countries/Estonia-EU_gray.png},alt=#{gui.countryselection.country.ee.logo.alt}"/></a>
- <input type="submit" value="Estonia" th:attr="value=#{gui.countryselection.country.ee}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Finland-EU_gray.png" alt="Finland-eID"
- th:attr="src=@{/img/countries/Finland-EU_gray.png},alt=#{gui.countryselection.country.fi.logo.alt}"/></a>
- <input type="submit" value="Finland" th:attr="value=#{gui.countryselection.country.fi}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/France-EU_gray.png" alt="France-eID"
- th:attr="src=@{/img/countries/France-EU_gray.png},alt=#{gui.countryselection.country.fr.logo.alt}"/></a>
- <input type="submit" value="France" th:attr="value=#{gui.countryselection.country.fr}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Greece-EU_gray.png" alt="Greece-eID"
- th:attr="src=@{/img/countries/Greece-EU_gray.png},alt=#{gui.countryselection.country.gr.logo.alt}"/></a>
- <input type="submit" value="Greece" th:attr="value=#{gui.countryselection.country.gr}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Hungary-EU_gray.png" alt="Hungary-eID"
- th:attr="src=@{/img/countries/Hungary-EU_gray.png},alt=#{gui.countryselection.country.hu.logo.alt}"/></a>
- <input type="submit" value="Hungary" th:attr="value=#{gui.countryselection.country.hu}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Ireland-EU_gray.png" alt="Ireland-eID"
- th:attr="src=@{/img/countries/Ireland-EU_gray.png},alt=#{gui.countryselection.country.ir.logo.alt}"/></a>
- <input type="submit" value="Ireland" th:attr="value=#{gui.countryselection.country.ir}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Italy-EU_gray.png" alt="Italy-eID"
- th:attr="src=@{/img/countries/Italy-EU_gray.png},alt=#{gui.countryselection.country.it.logo.alt}"/></a>
- <input type="submit" value="Italy" th:attr="value=#{gui.countryselection.country.it}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Latvia-EU_gray.png" alt="Latvia-eID"
- th:attr="src=@{/img/countries/Latvia-EU_gray.png},alt=#{gui.countryselection.country.lv.logo.alt}"/></a>
- <input type="submit" value="Latvia" th:attr="value=#{gui.countryselection.country.lv}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Luxembourg-EU_gray.png" alt="Luxembourg-eID"
- th:attr="src=@{/img/countries/Luxembourg-EU_gray.png},alt=#{gui.countryselection.country.lu.logo.alt}"/></a>
- <input type="submit" value="Luxembourg" th:attr="value=#{gui.countryselection.country.lu}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Malta-EU_gray.png" alt="Malta-eID"
- th:attr="src=@{/img/countries/Malta-EU_gray.png},alt=#{gui.countryselection.country.mt.logo.alt}"/></a>
- <input type="submit" value="Malta" th:attr="value=#{gui.countryselection.country.mt}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Poland-EU_gray.png" alt="Poland-eID"
- th:attr="src=@{/img/countries/Poland-EU_gray.png},alt=#{gui.countryselection.country.pl.logo.alt}"/></a>
- <input type="submit" value="Poland" th:attr="value=#{gui.countryselection.country.pl}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Portugal-EU_gray.png" alt="Portugal-eID"
- th:attr="src=@{/img/countries/Portugal-EU_gray.png},alt=#{gui.countryselection.country.pt.logo.alt}"/></a>
- <input type="submit" value="Portugal" th:attr="value=#{gui.countryselection.country.pt}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Romania-EU_gray.png" alt="Romania-eID"
- th:attr="src=@{/img/countries/Romania-EU_gray.png},alt=#{gui.countryselection.country.ro.logo.alt}"/></a>
- <input type="submit" value="Romania" th:attr="value=#{gui.countryselection.country.ro}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Slovakia-EU_gray.png" alt="Slovakia-eID"
- th:attr="src=@{/img/countries/Slovakia-EU_gray.png},alt=#{gui.countryselection.country.sk.logo.alt}"/></a>
- <input type="submit" value="Slovakia" th:attr="value=#{gui.countryselection.country.sk}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Slovenia-EU_gray.png" alt="Slovenia-eID"
- th:attr="src=@{/img/countries/Slovenia-EU_gray.png},alt=#{gui.countryselection.country.si.logo.alt}"/></a>
- <input type="submit" value="Slovenia" th:attr="value=#{gui.countryselection.country.si}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/Spain-EU_gray.png" alt="Spain-eID"
- th:attr="src=@{/img/countries/Spain-EU_gray.png},alt=#{gui.countryselection.country.es.logo.alt}"/></a>
- <input type="submit" value="Spain" th:attr="value=#{gui.countryselection.country.es}">
- <select id="testEnvironment" name="selectedEnvironment">
- <option value="prod" th:text="#{gui.countryselection.mode.prod}">Production</option>
- <option value="qs" th:text="#{gui.countryselection.mode.qs}">QS</option>
- <option value="test" th:text="#{gui.countryselection.mode.test}">Testing</option>
- <option value="dev" th:text="#{gui.countryselection.mode.dev}">Development</option>
- </select>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/Sweden-EU_gray.png" alt="Sweden-eID"
- th:attr="src=@{/img/countries/Sweden-EU_gray.png},alt=#{gui.countryselection.country.se.logo.alt}"/></a>
- <input type="submit" value="Sweden" th:attr="value=#{gui.countryselection.country.se}" disabled>
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img class="countryimage" src="$contextPath/img/countries/TheNetherlands-EU_gray.jpg" alt="TheNetherlands-eID"
- th:attr="src=@{/img/countries/TheNetherlands-EU_gray.jpg},alt=#{gui.countryselection.country.nl.logo.alt}"/></a>
- <input type="submit" value="Netherlands" th:attr="value=#{gui.countryselection.country.nl}">
- </form>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <a><img disabled class="countryimage" src="$contextPath/img/countries/UnitedKingdom-EU_gray.png" alt="UnitedKingdom-eID"
- th:attr="src=@{/img/countries/UnitedKingdom-EU_gray.png},alt=#{gui.countryselection.country.uk.logo.alt}"/></a>
- <input type="submit" value="United Kingdom" th:attr="value=#{gui.countryselection.country.uk}" disabled>
- </form>
-
- </div>
-
- <form class="block" method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
- <input type="submit" class="btn btn-outline-primary btn-block" value="Abbrechen/Cancel" th:attr="value=#{gui.countryselection.cancle}">
- <input type="hidden" name="stopAuthProcess" value="true" >
- <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
- </form>
-
- </div>
-</body>
-</html>
diff --git a/connector/src/test/resources/config/templates/eidas_node_forward.html b/connector/src/test/resources/config/templates/eidas_node_forward.html
index 186937d7..6dffa34b 100644
--- a/connector/src/test/resources/config/templates/eidas_node_forward.html
+++ b/connector/src/test/resources/config/templates/eidas_node_forward.html
@@ -4,7 +4,7 @@
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
<head>
- <script src="$contextPath/autocommit.js"
+ <script src="../webcontent/autocommit.js"
th:attr="src=@{/autocommit.js}"></script>
</head>
<body>
diff --git a/connector/src/test/resources/config/templates/error.html b/connector/src/test/resources/config/templates/error.html
new file mode 100644
index 00000000..21f589cd
--- /dev/null
+++ b/connector/src/test/resources/config/templates/error.html
@@ -0,0 +1,53 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="stylesheet" href="../webcontent/css/css_error.css" th:href="@{/css/css_error.css}"/>
+
+<title th:text="#{gui.errorpage.msg.title}">An error arise ... </title>
+</head>
+
+<body>
+<div id="page">
+ <div id="page1" class="case selected-case" role="main">
+ <div class="hell" role="application">
+ <h2 class="OA_header" role="heading" th:text="#{gui.errorpage.msg.title}">Error Header</h2>
+
+ <div id="alert_area" class="hell" role="application">
+ <p th:text="#{gui.errorpage.msg.information}">Error Information</p>
+ <br/>
+ <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
+ <p><b th:text="#{gui.errorpage.msg.errormsg}">Msg :</b> <span
+ th:text="${#messages.msgWithParams('__${errorCode}__', '__${errorParams}__')}"></span></p>
+ </div>
+ </div>
+
+ <div th:if="${timestamp}">
+ <p><b>Timestamp:</b> <span th:text="${timestamp}"></span></p>
+ </div>
+ <div th:if="${error}">
+ <p><b>Error:</b> <span th:text="${error}"></span></p>
+ </div>
+ <div th:if="${status}">
+ <p><b>Status:</b> <span th:text="${status}"></span></p>
+ </div>
+ <div th:if="${message}">
+ <p><b>Message:</b> <span th:text="${message}"></span></p>
+ </div>
+ <div th:if="${exception}">
+ <p><b>Exception:</b> <span th:text="${exception}"></span></p>
+ </div>
+ <div th:if="${trace}">
+ <p><b>Trace:</b> <span th:text="${trace}"></span></p>
+ </div>
+ <div th:if="${Stacktrace}">
+ <p><b>Stacktrace:</b> <span th:text="${stacktrace}"></span></p>
+ </div>
+
+ </div>
+</div>
+</body>
+</html> \ No newline at end of file
diff --git a/connector/src/test/resources/config/templates/error_message.html b/connector/src/test/resources/config/templates/error_message.html
index 86f9d29d..caaf7136 100644
--- a/connector/src/test/resources/config/templates/error_message.html
+++ b/connector/src/test/resources/config/templates/error_message.html
@@ -3,10 +3,10 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
-
+
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link rel="stylesheet" href="$contextPath/css/css_error.css" th:href="@{/css/css_error.css}" />
-
+ <link rel="stylesheet" href="../webcontent/css/css_error.css" th:href="@{/css/css_error.css}" />
+
<title th:text="#{gui.errorpage.msg.title}">An error arise ... </title>
</head>
@@ -14,21 +14,21 @@
<div id="page">
<div id="page1" class="case selected-case" role="main">
<h2 class="OA_header" role="heading">Authentication error arise</h2>
-
+
<div class="hell" role="application" >
<h2 class="OA_header" role="heading" th:text="#{gui.errorpage.msg.title}">Error Header</h2>
-
+
<div id="alert_area" class="hell" role="application" >
<p th:text="#{gui.errorpage.msg.information}">Error Information</p>
<br/>
- <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
+ <p><b th:text="#{gui.errorpage.msg.errorcode}">Code :</b> <span th:text="${errorCode}"></span></p>
<p><b th:text="#{gui.errorpage.msg.errormsg}">Msg :</b > <span th:text="${#messages.msgWithParams('__${errorCode}__', '__${errorParams}__')}"></span></p>
- </div>
- <!-- errorMsg -->
- </div>
+ </div>
+ <!-- errorMsg -->
+ </div>
<div th:if="${stacktrace}">
- <p><b th:text="#{gui.errorpage.msg.stacktrace}">fullError</b> <span th:text="${stacktrace}"></span></p>
+ <p><b th:text="#{gui.errorpage.msg.stacktrace}">fullError</b> <span th:text="${stacktrace}"></span></p>
</div>
</div>
diff --git a/connector/src/test/resources/config/templates/other_login_method.html b/connector/src/test/resources/config/templates/other_login_method.html
new file mode 100644
index 00000000..8f846f84
--- /dev/null
+++ b/connector/src/test/resources/config/templates/other_login_method.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <title th:text="#{gui.otherlogin.title}">eIDAS-Login Other Login Methods</title>
+ <style>
+ .block {
+ width: 100%;
+ }
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 20em;
+ }
+ </style>
+</head>
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <h1 th:text="#{gui.otherlogin.header.selection}"> Select an alternative login method </h1>
+
+ <div id="otherlogin" class="block">
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Handy-Signatur / Mobile Signature"
+ th:text="#{gui.otherlogin.hs}">A
+ </button>
+ <input type="hidden" name="loginSelection" value="MOBILE_PHONE_SIGNATURE_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Andere eIDAS ID" th:text="#{gui.otherlogin.eidas}">B
+ </button>
+ <input type="hidden" name="loginSelection" value="EIDAS_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" role="button" value="Keine weitere HS / eIDAS"
+ th:text="#{gui.otherlogin.none}">C
+ </button>
+ <input type="hidden" name="loginSelection" value="NO_OTHER_LOGIN">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <!-- Abbrechen Button -->
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.otherlogin.cancel}"></button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
+</body>
+</html>
diff --git a/connector/src/test/resources/config/templates/pvp2_post_binding.html b/connector/src/test/resources/config/templates/pvp2_post_binding.html
index 90858237..06b9b494 100644
--- a/connector/src/test/resources/config/templates/pvp2_post_binding.html
+++ b/connector/src/test/resources/config/templates/pvp2_post_binding.html
@@ -6,7 +6,7 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
- <script src="$contextPath/autocommit.js"></script>
+ <script src="/autocommit.js"></script>
</head>
<body>
<noscript>
@@ -21,7 +21,7 @@
<form action="${action}" method="post" target="_parent">
<div>
- #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
+ #if($RelayState) <input type="hidden" name="RelayState" value="${RelayState}"/> #end
#if($SAMLRequest) <input type="hidden" name="SAMLRequest" value="${SAMLRequest}" /> #end
#if($SAMLResponse) <input type="hidden" name="SAMLResponse" value="${SAMLResponse}" /> #end
</div>
diff --git a/connector/src/test/resources/config/templates/residency.html b/connector/src/test/resources/config/templates/residency.html
new file mode 100644
index 00000000..9a277a16
--- /dev/null
+++ b/connector/src/test/resources/config/templates/residency.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html>
+<html xmlns:th="http://www.thymeleaf.org"
+ xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+ layout:decorator="fragments/base"
+ th:with="lang=${#locale.language}" th:lang="${lang}">
+<head>
+ <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="stylesheet" href="../webcontent/css/css_country.css" th:href="@{/static/css/css_country.css}"/>
+ <script type="text/javascript" src="../webcontent/js/jquery-3.6.0.js"
+ th:attr="src=@{/static/js/jquery-3.6.0.js}"></script>
+ <title th:text="#{gui.residency.title}">Österreichischer Wohnsitz</title>
+ <script type="text/javascript" th:inline="javascript">
+ $(document).ready(function () {
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ $("#loading").hide();
+ $.ajaxSetup({
+ beforeSend: function () {
+ $("#loading").show();
+ },
+ complete: function () {
+ $("#loading").hide();
+ }
+ });
+ $("#inputForm input[type='text']").keyup(function (event) {
+ if (event.keyCode === 13) {
+ $("#buttonSearch").click();
+ }
+ });
+ });
+
+ function search() {
+ let updatedText = /*[[#{gui.residency.updated}]]*/ 'Updated text';
+ let errorText = /*[[#{gui.residency.error}]]*/ 'Error';
+ let foundText = /*[[#{gui.residency.found}]]*/ 'Found {0}';
+ let uniqueText = /*[[#{gui.residency.unique}]]*/ 'Unique';
+ let invalidInputText = /*[[#{gui.residency.header.inputinvalid}]]*/ 'Invalid';
+ if (!$("#inputForm #inputMunicipality").val().trim() && !$("#inputForm #inputPostleitzahl").val().trim() &&
+ !$("#inputForm #inputVillage").val().trim()) {
+ $("#textResult").show().text(invalidInputText);
+ return;
+ }
+ $.ajax({
+ type: "POST",
+ url: "http://localhost:8080/ms_connector/residency/search",
+ data: $("#inputForm").serialize()
+ }).done(function (data, textStatus, jqXHR) {
+ if (data["resultCount"] === 1) {
+ $("#textResult").show().text(uniqueText);
+ $("#tableResult tbody").empty();
+ $("#tableResult").hide();
+ $("#inputForm #inputPostleitzahl").val(data["results"][0]["postleitzahl"]);
+ $("#inputForm #inputMunicipality").val(data["results"][0]["municipality"]);
+ $("#inputForm #inputVillage").val(data["results"][0]["village"]);
+ $("#inputForm #inputStreet").val(data["results"][0]["street"]);
+ $("#inputForm #inputNumber").val(data["results"][0]["number"]);
+ return;
+ }
+ $("#textResult").show().text(foundText.replace("{0}", data["resultCount"]));
+ $("#tableResult").show();
+ $("#tableResult tbody").empty();
+ $.each(data.results, function (i, output) {
+ $("#tableResult tbody")
+ .append($("<tr>")
+ .append($("<td>").text(output["postleitzahl"] !== null ? output["postleitzahl"] : "").css("text-align", "right"))
+ .append($("<td>").text(output["municipality"] !== null ? output["municipality"] : ""))
+ .append($("<td>").text(output["village"] !== null ? output["village"] : ""))
+ .append($("<td>").text(output["street"] !== null ? output["street"] : ""))
+ .append($("<td>").text(output["number"] !== null ? output["number"] : "").css("text-align", "right"))
+ .css("cursor", "pointer").click(function () {
+ $("#inputForm #inputPostleitzahl").val($(this).children("td:nth-child(1)").text());
+ $("#inputForm #inputMunicipality").val($(this).children("td:nth-child(2)").text());
+ $("#inputForm #inputVillage").val($(this).children("td:nth-child(3)").text());
+ $("#inputForm #inputStreet").val($(this).children("td:nth-child(4)").text());
+ $("#inputForm #inputNumber").val($(this).children("td:nth-child(5)").text());
+ $("#textResult").show().text(updatedText);
+ search();
+ })
+ );
+ })
+ if (data.results.length === 0) {
+ $("#tableResult").hide();
+ }
+ }).fail(function (jqXHR, textStatus, errorThrown) {
+ $("#textResult").show().text(errorText);
+ })
+ }
+
+ function clearInput() {
+ $("#inputForm #inputMunicipality").val("");
+ $("#inputForm #inputVillage").val("");
+ $("#inputForm #inputStreet").val("");
+ $("#inputForm #inputNumber").val("");
+ $("#textResult").hide();
+ $("#tableResult").hide();
+ }
+ </script>
+ <style>
+ #residency label {
+ width: 10em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #residency input {
+ width: 15em;
+ display: inline-block;
+ margin-bottom: 0.5em;
+ }
+
+ #result {
+ margin-bottom: 4em;
+ }
+
+ button {
+ padding: 0.5em;
+ margin: 0.5em;
+ width: 8em;
+ }
+
+ .block {
+ width: 100%;
+ }
+
+ #tableResult td, #tableResult th {
+ padding: 1em 0.5em;
+ }
+
+ #tableResult a {
+ text-decoration: underline;
+ }
+
+ #tableResult {
+ border-collapse: collapse;
+ }
+
+ #tableResult tr {
+ border-bottom: 1px solid black;
+ }
+ </style>
+</head>
+
+<body>
+<div class="header container">
+ <div class="titlebar">
+ <div>
+ <a href="https://www.bmi.gv.at/" target="_blank" title="Home">
+ <img class="toplogo img-responsive" src="/static/BMI.png" alt="Logo BMI"
+ th:attr="alt=#{gui.countryselection.logo.bmi.alt}">
+ <h1 class="hidden" th:text="#{gui.countryselection.header1}"> Bundesministerium für Inneres </h1>
+ </a>
+ </div>
+ <ul class="nav_oben">
+ <li>
+ <div class="languageselection" th:include="language_selection :: selectlanguage">
+ LanguageSelectionBlock
+ </div>
+ </li>
+ &nbsp; &nbsp;
+ <li>
+ <a href="https://www.bmi.gv.at/" target="_blank" th:text="#{gui.countryselection.link.bmi}">Startseite
+ BMI </a>
+ </li>
+ </ul>
+ </div>
+</div>
+<div class="content">
+ <div class="subtitle">
+ <h1 th:text="#{gui.countryselection.header2}"> Zentraler eIDAS Knoten der Republik Österreich </h1>
+ <h2 th:text="#{gui.countryselection.header3}"> Betrieben durch das Bundesministerium für Inneres </h2>
+ </div>
+
+ <h1 th:text="#{gui.residency.header.selection}">Search your Austrian Residency</h1>
+
+ <div id="residency">
+ <form id="inputForm" method="post" action="$contextPath$submitEndpoint"
+ th:attr="action=@{${submitEndpoint}}">
+ <div><p th:text="#{gui.residency.header.help}">Please enter a postcode, municipality or village first</p>
+ </div>
+ <div>
+ <label for="inputPostleitzahl" th:text="#{gui.residency.input.postleitzahl}">Postleitzahl</label>
+ <input type="text" id="inputPostleitzahl" name="postleitzahl" value=""/>
+ </div>
+ <div>
+ <label for="inputMunicipality" th:text="#{gui.residency.input.municipality}">Municipality</label>
+ <input type="text" id="inputMunicipality" name="municipality" value=""/>
+ </div>
+ <div>
+ <label for="inputVillage" th:text="#{gui.residency.input.village}">Village</label>
+ <input type="text" id="inputVillage" name="village" value=""/>
+ </div>
+ <div>
+ <label for="inputStreet" th:text="#{gui.residency.input.street}">Street</label>
+ <input type="text" id="inputStreet" name="street" value=""/>
+ </div>
+ <div>
+ <label for="inputNumber" th:text="#{gui.residency.input.number}">Number</label>
+ <input type="text" id="inputNumber" name="number" value=""/>
+ </div>
+ <div class="block">
+ <button type="button" id="buttonSearch" onclick="search()" th:text="#{gui.residency.search}">
+ Search
+ </button>
+ <button type="button" id="buttonClear" onclick="clearInput()" th:text="#{gui.residency.clear}">
+ Clear
+ </button>
+ <button type="button" id="buttonProceed" th:text="#{gui.residency.proceed}">Proceed</button>
+ </div>
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}"/>
+ </form>
+ </div>
+
+ <form method="post" action="$contextPath$submitEndpoint" th:attr="action=@{${submitEndpoint}}">
+ <button type="submit" value="Abbrechen/Cancel" th:text="#{gui.residency.cancel}">Cancel</button>
+ <input type="hidden" name="stopAuthProcess" value="true">
+ <input type="hidden" name="pendingid" value="$pendingid" th:attr="value=${pendingid}">
+ </form>
+
+ <div>
+ <img id="loading" src="../webcontent/img/ajax-loader.gif"
+ th:attr="src=@{/static/img/ajax-loader.gif}" style="display: none"/>
+ </div>
+
+ <div id="result">
+ <div>
+ <p><span id="textResult" style="display: none"></span></p>
+ </div>
+ <table id="tableResult" style="display: none">
+ <thead>
+ <tr>
+ <th th:text="#{gui.residency.input.postleitzahl}" style="text-align: right">Postcode</th>
+ <th th:text="#{gui.residency.input.municipality}">Municipality</th>
+ <th th:text="#{gui.residency.input.village}">Village</th>
+ <th th:text="#{gui.residency.input.street}">Street</th>
+ <th th:text="#{gui.residency.input.number}" style="text-align: right">Number</th>
+ </tr>
+ </thead>
+ <tbody>
+
+ </tbody>
+ </table>
+ </div>
+
+</div>
+<footer>
+ <div class="copyright">&copy; BUNDESMINISTERIUM FÜR INNERES</div>
+ <div></div>
+</footer>
+</body>
+</html>
diff --git a/connector/src/test/resources/config/webcontent/autocommit.js b/connector/src/test/resources/config/webcontent/autocommit.js
new file mode 100644
index 00000000..d21a5651
--- /dev/null
+++ b/connector/src/test/resources/config/webcontent/autocommit.js
@@ -0,0 +1,5 @@
+function autoCommmit() {
+ document.forms[0].submit();
+}
+
+document.addEventListener('DOMContentLoaded', autoCommmit); \ No newline at end of file
diff --git a/connector/src/test/resources/config/webcontent/css/css_country.css b/connector/src/test/resources/config/webcontent/css/css_country.css
index 4091955f..bc575c90 100644
--- a/connector/src/test/resources/config/webcontent/css/css_country.css
+++ b/connector/src/test/resources/config/webcontent/css/css_country.css
@@ -1,137 +1,158 @@
@charset "utf-8";
- body {
- background-image: none;
- margin: 0px;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- }
- #page {
- padding-top: 2%;
- padding-left: 10%;
- }
-
- #country {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- align-items: center;
- }
-
- .block {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- cursor: pointer;
- text-decoration: none;
- padding-right:2%;
- width: 250px;
- }
-
- .countryimage {
- width:50px;
- height:50px;
- padding-right: 2%;
- padding-bottom: 4%;
- }
-
- input[type=button], input[type=submit], input[type=reset] {
- display:flex;
- background-color:transparent;
- border:none;
- color: black;
- text-decoration: none;
- cursor: pointer;
- }
- #testEnvironment {
- border: none;
- color: black;
- padding: 10px 20px;
- text-decoration: none;
- margin: 4px 2px;
- height: 3%;
- display: inline-block;
- vertical-align: middle;
- width: 40%;
- }
- #button{
- background-color: transparent;
- border:none;
- }
- div.header {
- background-color: #e9ecef;
- padding-top: 28px;
- padding-left: 137px;
- padding-right: 137px;
- padding-bottom: 12px;
- }
- div.titlebar {
- padding: 0px;
- }
- div.titlebar div {
- }
- .hidden {
- display: none;
- }
- ul.nav_oben {
- padding: 0px;
- margin: 0px;
- text-align: right;
- text-transform: uppercase;
- }
- li {
- display: inline-block;
- }
- div.header a {
- text-decoration: none;
- color: black;
- }
- a {
- text-decoration: none;
- color: #a22c1c;
- }
- .content {
- padding-left: 137px;
- padding-right: 137px;
- }
- div.subtitle h1 {
- padding: 0px;
- margin: 0px;
- font-size: 130%;
- align: right;
- }
- div.subtitle h2 {
- padding: 0px;
- margin: 0px;
- font-size: 115%;
- }
- footer {
- position: fixed;
- left: 0;
- padding-left: 137px;
- padding-right: 137px;
- padding-top: 1em;
- bottom: 0;
- width: 100%;
- height: 2em;
- background-color: rgb(162,44,28);
- color: white;
- }
- .float {
- float: left;
- }
- .floatright {
- float: right;
- }
- .copyright {
- width: 66%;
- font-size: 80%;
- }
- #countries,#country {
- padding-bottom: 40px;
- }
- input[type=submit] {
- width: inherit;
- /* text-align: left; */
- }
- form {
- justify-content: center;
- } \ No newline at end of file
+body {
+ background-image: none;
+ margin: 0px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+#page {
+ padding-top: 2%;
+ padding-left: 10%;
+}
+
+#country {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: center;
+}
+
+.block {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ cursor: pointer;
+ text-decoration: none;
+ padding-right: 2%;
+ width: 250px;
+}
+
+.countryimage {
+ width: 50px;
+ height: 50px;
+ padding-right: 2%;
+ padding-bottom: 4%;
+}
+
+input[type=button], input[type=submit], input[type=reset] {
+ display: flex;
+ background-color: transparent;
+ border: none;
+ color: black;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+#testEnvironment {
+ border: none;
+ color: black;
+ padding: 10px 20px;
+ text-decoration: none;
+ margin: 4px 2px;
+ height: 3%;
+ display: inline-block;
+ vertical-align: middle;
+ width: 40%;
+}
+
+#button {
+ background-color: transparent;
+ border: none;
+}
+
+div.header {
+ background-color: #e9ecef;
+ padding-top: 28px;
+ padding-left: 137px;
+ padding-right: 137px;
+ padding-bottom: 12px;
+}
+
+div.titlebar {
+ padding: 0px;
+}
+
+div.titlebar div {
+}
+
+.hidden {
+ display: none;
+}
+
+ul.nav_oben {
+ padding: 0px;
+ margin: 0px;
+ text-align: right;
+ text-transform: uppercase;
+}
+
+li {
+ display: inline-block;
+}
+
+div.header a {
+ text-decoration: none;
+ color: black;
+}
+
+a {
+ text-decoration: none;
+ color: #a22c1c;
+}
+
+.content {
+ padding-left: 137px;
+ padding-right: 137px;
+}
+
+div.subtitle h1 {
+ padding: 0px;
+ margin: 0px;
+ font-size: 130%;
+ align: right;
+}
+
+div.subtitle h2 {
+ padding: 0px;
+ margin: 0px;
+ font-size: 115%;
+}
+
+footer {
+ position: fixed;
+ left: 0;
+ padding-left: 137px;
+ padding-right: 137px;
+ padding-top: 1em;
+ bottom: 0;
+ width: 100%;
+ height: 2em;
+ background-color: rgb(162, 44, 28);
+ color: white;
+}
+
+.float {
+ float: left;
+}
+
+.floatright {
+ float: right;
+}
+
+.copyright {
+ width: 66%;
+ font-size: 80%;
+}
+
+#countries, #country {
+ padding-bottom: 40px;
+}
+
+input[type=submit] {
+ width: inherit;
+ /* text-align: left; */
+}
+
+form {
+ justify-content: center;
+} \ No newline at end of file
diff --git a/connector/src/test/resources/config/webcontent/css/css_error.css b/connector/src/test/resources/config/webcontent/css/css_error.css
new file mode 100644
index 00000000..d772df43
--- /dev/null
+++ b/connector/src/test/resources/config/webcontent/css/css_error.css
@@ -0,0 +1,26 @@
+@charset "utf-8";
+ body {
+ padding-left: 5%;
+ background-color: #F9F9F9;
+ }
+ #page {
+ padding-top: 2%;
+ padding-right: 10%;
+ padding-left: 5%;
+ }
+
+ .OA_header {
+ font-size: 2.1em;
+ padding-top:1%;
+ margin-bottom: 1%;
+ margin-top: 1%;
+
+ }
+
+ #alert_area {
+ float:left;
+ width: 100%;
+ }
+
+
+
diff --git a/connector/src/test/resources/config/webcontent/img/ajax-loader.gif b/connector/src/test/resources/config/webcontent/img/ajax-loader.gif
new file mode 100644
index 00000000..f2a1bc0c
--- /dev/null
+++ b/connector/src/test/resources/config/webcontent/img/ajax-loader.gif
Binary files differ
diff --git a/connector/src/test/resources/config/webcontent/js/jquery-3.6.0.js b/connector/src/test/resources/config/webcontent/js/jquery-3.6.0.js
new file mode 100644
index 00000000..fc6c299b
--- /dev/null
+++ b/connector/src/test/resources/config/webcontent/js/jquery-3.6.0.js
@@ -0,0 +1,10881 @@
+/*!
+ * jQuery JavaScript Library v3.6.0
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright OpenJS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2021-03-02T17:08Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var flat = arr.flat ? function( array ) {
+ return arr.flat.call( array );
+} : function( array ) {
+ return arr.concat.apply( [], array );
+};
+
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
+
+
+var isWindow = function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+ };
+
+
+var document = window.document;
+
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ nonce: true,
+ noModule: true
+ };
+
+ function DOMEval( code, node, doc ) {
+ doc = doc || document;
+
+ var i, val,
+ script = doc.createElement( "script" );
+
+ script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+
+ // Support: Firefox 64+, Edge 18+
+ // Some browsers don't support the "nonce" property on scripts.
+ // On the other hand, just using `getAttribute` is not enough as
+ // the `nonce` attribute is reset to an empty string whenever it
+ // becomes browsing-context connected.
+ // See https://github.com/whatwg/html/issues/2369
+ // See https://html.spec.whatwg.org/#nonce-attributes
+ // The `node.getAttribute` check was added for the sake of
+ // `jQuery.globalEval` so that it can fake a nonce-containing node
+ // via an object.
+ val = node[ i ] || node.getAttribute && node.getAttribute( i );
+ if ( val ) {
+ script.setAttribute( i, val );
+ }
+ }
+ }
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+
+
+function toType( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.6.0",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ };
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ even: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return ( i + 1 ) % 2;
+ } ) );
+ },
+
+ odd: function() {
+ return this.pushStack( jQuery.grep( this, function( _elem, i ) {
+ return i % 2;
+ } ) );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ copy = options[ name ];
+
+ // Prevent Object.prototype pollution
+ // Prevent never-ending loop
+ if ( name === "__proto__" || target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+ src = target[ name ];
+
+ // Ensure proper type for the source value
+ if ( copyIsArray && !Array.isArray( src ) ) {
+ clone = [];
+ } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {
+ clone = {};
+ } else {
+ clone = src;
+ }
+ copyIsArray = false;
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a provided context; falls back to the global one
+ // if not specified.
+ globalEval: function( code, options, doc ) {
+ DOMEval( code, { nonce: options && options.nonce }, doc );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return flat( ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType( obj );
+
+ if ( isFunction( obj ) || isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.6
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://js.foundation/
+ *
+ * Date: 2021-02-16
+ */
+( function( window ) {
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ nonnativeSelectorCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ( {} ).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ pushNative = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[ i ] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" +
+ "ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram
+ identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace +
+ "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+
+ // "Attribute values must be CSS identifiers [capture 5]
+ // or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" +
+ whitespace + "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" +
+ whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace +
+ "*" ),
+ rdescend = new RegExp( whitespace + "|>" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" +
+ whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" +
+ whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace +
+ "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace +
+ "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rhtml = /HTML$/i,
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ),
+ funescape = function( escape, nonHex ) {
+ var high = "0x" + escape.slice( 1 ) - 0x10000;
+
+ return nonHex ?
+
+ // Strip the backslash prefix from a non-hex escape sequence
+ nonHex :
+
+ // Replace a hexadecimal escape sequence with the encoded Unicode code point
+ // Support: IE <=11+
+ // For values outside the Basic Multilingual Plane (BMP), manually construct a
+ // surrogate pair
+ high < 0 ?
+ String.fromCharCode( high + 0x10000 ) :
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" +
+ ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ inDisabledFieldset = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ ( arr = slice.call( preferredDoc.childNodes ) ),
+ preferredDoc.childNodes
+ );
+
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ // eslint-disable-next-line no-unused-expressions
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ pushNative.apply( target, slice.call( els ) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+
+ // Can't trust NodeList.length
+ while ( ( target[ j++ ] = els[ i++ ] ) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+ setDocument( context );
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {
+
+ // ID selector
+ if ( ( m = match[ 1 ] ) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( ( elem = context.getElementById( m ) ) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && ( elem = newContext.getElementById( m ) ) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[ 2 ] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !nonnativeSelectorCache[ selector + " " ] &&
+ ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&
+
+ // Support: IE 8 only
+ // Exclude object elements
+ ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) {
+
+ newSelector = selector;
+ newContext = context;
+
+ // qSA considers elements outside a scoping root when evaluating child or
+ // descendant combinators, which is not what we want.
+ // In such cases, we work around the behavior by prefixing every selector in the
+ // list with an ID selector referencing the scope context.
+ // The technique has to be used as well when a leading combinator is used
+ // as such selectors are not recognized by querySelectorAll.
+ // Thanks to Andrew Dupont for this technique.
+ if ( nodeType === 1 &&
+ ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+
+ // We can use :scope instead of the ID hack if the browser
+ // supports it & if we're not changing the context.
+ if ( newContext !== context || !support.scope ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( ( nid = context.getAttribute( "id" ) ) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", ( nid = expando ) );
+ }
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " +
+ toSelector( groups[ i ] );
+ }
+ newSelector = groups.join( "," );
+ }
+
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ nonnativeSelectorCache( selector, true );
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return ( cache[ key + " " ] = value );
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement( "fieldset" );
+
+ try {
+ return !!fn( el );
+ } catch ( e ) {
+ return false;
+ } finally {
+
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split( "|" ),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[ i ] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( ( cur = cur.nextSibling ) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return ( name === "input" || name === "button" ) && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ inDisabledFieldset( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction( function( argument ) {
+ argument = +argument;
+ return markFunction( function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ ( j = matchIndexes[ i ] ) ] ) {
+ seed[ j ] = !( matches[ j ] = seed[ j ] );
+ }
+ }
+ } );
+ } );
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
+
+ // Support: IE <=8
+ // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
+ // https://bugs.jquery.com/ticket/4833
+ return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" );
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9 - 11+, Edge 12 - 18+
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( preferredDoc != document &&
+ ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,
+ // Safari 4 - 5 only, Opera <=11.6 - 12.x only
+ // IE/Edge & older browsers don't support the :scope pseudo-class.
+ // Support: Safari 6.0 only
+ // Safari 6.0 supports :scope but it's an alias of :root there.
+ support.scope = assert( function( el ) {
+ docElem.appendChild( el ).appendChild( document.createElement( "div" ) );
+ return typeof el.querySelectorAll !== "undefined" &&
+ !el.querySelectorAll( ":scope fieldset div" ).length;
+ } );
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert( function( el ) {
+ el.className = "i";
+ return !el.getAttribute( "className" );
+ } );
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert( function( el ) {
+ el.appendChild( document.createComment( "" ) );
+ return !el.getElementsByTagName( "*" ).length;
+ } );
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert( function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ } );
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter[ "ID" ] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute( "id" ) === attrId;
+ };
+ };
+ Expr.find[ "ID" ] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter[ "ID" ] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode( "id" );
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find[ "ID" ] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode( "id" );
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( ( elem = elems[ i++ ] ) ) {
+ node = elem.getAttributeNode( "id" );
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find[ "TAG" ] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( ( elem = results[ i++ ] ) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {
+
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert( function( el ) {
+
+ var input;
+
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll( "[selected]" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push( "~=" );
+ }
+
+ // Support: IE 11+, Edge 15 - 18+
+ // IE 11/Edge don't find elements on a `[name='']` query in some cases.
+ // Adding a temporary attribute to the document before the selection works
+ // around the issue.
+ // Interestingly, IE 10 & older don't seem to have the issue.
+ input = document.createElement( "input" );
+ input.setAttribute( "name", "" );
+ el.appendChild( input );
+ if ( !el.querySelectorAll( "[name='']" ).length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" +
+ whitespace + "*(?:''|\"\")" );
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll( ":checked" ).length ) {
+ rbuggyQSA.push( ":checked" );
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push( ".#.+[+~]" );
+ }
+
+ // Support: Firefox <=3.6 - 5 only
+ // Old Firefox doesn't throw on a badly-escaped identifier.
+ el.querySelectorAll( "\\\f" );
+ rbuggyQSA.push( "[\\r\\n\\f]" );
+ } );
+
+ assert( function( el ) {
+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
+ "<select disabled='disabled'><option/></select>";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement( "input" );
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll( "[name=d]" ).length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll( ":enabled" ).length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll( ":disabled" ).length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: Opera 10 - 11 only
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll( "*,:x" );
+ rbuggyQSA.push( ",.*:" );
+ } );
+ }
+
+ if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector ) ) ) ) {
+
+ assert( function( el ) {
+
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ } );
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ) );
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( ( b = b.parentNode ) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {
+
+ // Choose the first element that is related to our preferred document
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( a == document || a.ownerDocument == preferredDoc &&
+ contains( preferredDoc, a ) ) {
+ return -1;
+ }
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( b == document || b.ownerDocument == preferredDoc &&
+ contains( preferredDoc, b ) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ return a == document ? -1 :
+ b == document ? 1 :
+ /* eslint-enable eqeqeq */
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( ( cur = cur.parentNode ) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( ( cur = cur.parentNode ) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[ i ] === bp[ i ] ) {
+ i++;
+ }
+
+ return i ?
+
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[ i ], bp[ i ] ) :
+
+ // Otherwise nodes in our document sort first
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ /* eslint-disable eqeqeq */
+ ap[ i ] == preferredDoc ? -1 :
+ bp[ i ] == preferredDoc ? 1 :
+ /* eslint-enable eqeqeq */
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ setDocument( elem );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !nonnativeSelectorCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch ( e ) {
+ nonnativeSelectorCache( expr, true );
+ }
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+
+ // Set document vars if needed
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( context.ownerDocument || context ) != document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+
+ // Set document vars if needed
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( ( elem.ownerDocument || elem ) != document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return ( sel + "" ).replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( ( elem = results[ i++ ] ) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+
+ // If no nodeType, this is expected to be an array
+ while ( ( node = elem[ i++ ] ) ) {
+
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[ 1 ] = match[ 1 ].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[ 3 ] = ( match[ 3 ] || match[ 4 ] ||
+ match[ 5 ] || "" ).replace( runescape, funescape );
+
+ if ( match[ 2 ] === "~=" ) {
+ match[ 3 ] = " " + match[ 3 ] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[ 1 ] = match[ 1 ].toLowerCase();
+
+ if ( match[ 1 ].slice( 0, 3 ) === "nth" ) {
+
+ // nth-* requires argument
+ if ( !match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[ 4 ] = +( match[ 4 ] ?
+ match[ 5 ] + ( match[ 6 ] || 1 ) :
+ 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) );
+ match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[ 3 ] ) {
+ Sizzle.error( match[ 0 ] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[ 6 ] && match[ 2 ];
+
+ if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[ 3 ] ) {
+ match[ 2 ] = match[ 4 ] || match[ 5 ] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+
+ // Get excess from tokenize (recursively)
+ ( excess = tokenize( unquoted, true ) ) &&
+
+ // advance to the next closing parenthesis
+ ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) {
+
+ // excess is a negative index
+ match[ 0 ] = match[ 0 ].slice( 0, excess );
+ match[ 2 ] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() {
+ return true;
+ } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ ( pattern = new RegExp( "(^|" + whitespace +
+ ")" + className + "(" + whitespace + "|$)" ) ) && classCache(
+ className, function( elem ) {
+ return pattern.test(
+ typeof elem.className === "string" && elem.className ||
+ typeof elem.getAttribute !== "undefined" &&
+ elem.getAttribute( "class" ) ||
+ ""
+ );
+ } );
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ /* eslint-disable max-len */
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ /* eslint-enable max-len */
+
+ };
+ },
+
+ "CHILD": function( type, what, _argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, _context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( ( node = node[ dir ] ) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+
+ // Use previously-cached element index if available
+ if ( useCache ) {
+
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+
+ // Use the same loop as above to seek `elem` from the start
+ while ( ( node = ++nodeIndex && node && node[ dir ] ||
+ ( diff = nodeIndex = 0 ) || start.pop() ) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] ||
+ ( node[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ ( outerCache[ node.uniqueID ] = {} );
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction( function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[ i ] );
+ seed[ idx ] = !( matches[ idx ] = matched[ i ] );
+ }
+ } ) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+
+ // Potentially complex pseudos
+ "not": markFunction( function( selector ) {
+
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction( function( seed, matches, _context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( ( elem = unmatched[ i ] ) ) {
+ seed[ i ] = !( matches[ i ] = elem );
+ }
+ }
+ } ) :
+ function( elem, _context, xml ) {
+ input[ 0 ] = elem;
+ matcher( input, null, xml, results );
+
+ // Don't keep the element (issue #299)
+ input[ 0 ] = null;
+ return !results.pop();
+ };
+ } ),
+
+ "has": markFunction( function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ } ),
+
+ "contains": markFunction( function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;
+ };
+ } ),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+
+ // lang value must be a valid identifier
+ if ( !ridentifier.test( lang || "" ) ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( ( elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );
+ return false;
+ };
+ } ),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement &&
+ ( !document.hasFocus || document.hasFocus() ) &&
+ !!( elem.type || elem.href || ~elem.tabIndex );
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return ( nodeName === "input" && !!elem.checked ) ||
+ ( nodeName === "option" && !!elem.selected );
+ },
+
+ "selected": function( elem ) {
+
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ // eslint-disable-next-line no-unused-expressions
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos[ "empty" ]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( ( attr = elem.getAttribute( "type" ) ) == null ||
+ attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo( function() {
+ return [ 0 ];
+ } ),
+
+ "last": createPositionalPseudo( function( _matchIndexes, length ) {
+ return [ length - 1 ];
+ } ),
+
+ "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ } ),
+
+ "even": createPositionalPseudo( function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "odd": createPositionalPseudo( function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "lt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+ var i = argument < 0 ?
+ argument + length :
+ argument > length ?
+ length :
+ argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } ),
+
+ "gt": createPositionalPseudo( function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ } )
+ }
+};
+
+Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || ( match = rcomma.exec( soFar ) ) ) {
+ if ( match ) {
+
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[ 0 ].length ) || soFar;
+ }
+ groups.push( ( tokens = [] ) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( ( match = rcombinators.exec( soFar ) ) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+
+ // Cast descendant combinators to space
+ type: match[ 0 ].replace( rtrim, " " )
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||
+ ( match = preFilters[ type ]( match ) ) ) ) {
+ matched = match.shift();
+ tokens.push( {
+ value: matched,
+ type: type,
+ matches: match
+ } );
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[ i ].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( ( elem = elem[ dir ] ) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || ( elem[ expando ] = {} );
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] ||
+ ( outerCache[ elem.uniqueID ] = {} );
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( ( oldCache = uniqueCache[ key ] ) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return ( newCache[ 2 ] = oldCache[ 2 ] );
+ } else {
+
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[ i ]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[ 0 ];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[ i ], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( ( elem = unmatched[ i ] ) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction( function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts(
+ selector || "*",
+ context.nodeType ? [ context ] : context,
+ []
+ ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( ( elem = temp[ i ] ) ) {
+ matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( ( elem = matcherOut[ i ] ) ) {
+
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( ( matcherIn[ i ] = elem ) );
+ }
+ }
+ postFinder( null, ( matcherOut = [] ), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( ( elem = matcherOut[ i ] ) &&
+ ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {
+
+ seed[ temp ] = !( results[ temp ] = elem );
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ } );
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[ 0 ].type ],
+ implicitRelative = leadingRelative || Expr.relative[ " " ],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ ( checkContext = context ).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {
+ matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];
+ } else {
+ matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[ j ].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens
+ .slice( 0, i - 1 )
+ .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } )
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ),
+
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),
+ len = elems.length;
+
+ if ( outermost ) {
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ outermostContext = context == document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+
+ // Support: IE 11+, Edge 17 - 18+
+ // IE/Edge sometimes throw a "Permission denied" error when strict-comparing
+ // two documents; shallow comparisons work.
+ // eslint-disable-next-line eqeqeq
+ if ( !context && elem.ownerDocument != document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( ( matcher = elementMatchers[ j++ ] ) ) {
+ if ( matcher( elem, context || document, xml ) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+
+ // They will have gone through all possible matchers
+ if ( ( elem = !matcher && elem ) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( ( matcher = setMatchers[ j++ ] ) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !( unmatched[ i ] || setMatched[ i ] ) ) {
+ setMatched[ i ] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[ i ] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache(
+ selector,
+ matcherFromGroupMatchers( elementMatchers, setMatchers )
+ );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( ( selector = compiled.selector || selector ) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[ 0 ] = match[ 0 ].slice( 0 );
+ if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {
+
+ context = ( Expr.find[ "ID" ]( token.matches[ 0 ]
+ .replace( runescape, funescape ), context ) || [] )[ 0 ];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[ i ];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ ( type = token.type ) ] ) {
+ break;
+ }
+ if ( ( find = Expr.find[ type ] ) ) {
+
+ // Search, expanding context for leading sibling combinators
+ if ( ( seed = find(
+ token.matches[ 0 ].replace( runescape, funescape ),
+ rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||
+ context
+ ) ) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert( function( el ) {
+
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1;
+} );
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert( function( el ) {
+ el.innerHTML = "<a href='#'></a>";
+ return el.firstChild.getAttribute( "href" ) === "#";
+} ) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ } );
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert( function( el ) {
+ el.innerHTML = "<input/>";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+} ) ) {
+ addHandle( "value", function( elem, _name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ } );
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert( function( el ) {
+ return el.getAttribute( "disabled" ) == null;
+} ) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ ( val = elem.getAttributeNode( name ) ) && val.specified ?
+ val.value :
+ null;
+ }
+ } );
+}
+
+return Sizzle;
+
+} )( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+}
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, _i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, _i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, _i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( elem.contentDocument != null &&
+
+ // Support: IE 11+
+ // <object> elements with no `data` attribute has an object
+ // `contentDocument` with a `null` prototype.
+ getProto( elem.contentDocument ) ) {
+
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( _i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[ 3 - i ][ 3 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock,
+
+ // progress_handlers.lock
+ tuples[ 0 ][ 3 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the primary Deferred
+ primary = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ primary.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( primary.state() === "pending" ||
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return primary.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
+ }
+
+ return primary.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( toType( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, _key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( _all, letter ) {
+ return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( camelCase );
+ } else {
+ key = camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var documentElement = document.documentElement;
+
+
+
+ var isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem );
+ },
+ composed = { composed: true };
+
+ // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only
+ // Check attachment across shadow DOM boundaries when possible (gh-3504)
+ // Support: iOS 10.0-10.2 only
+ // Early iOS 10 versions support `attachShadow` but not `getRootNode`,
+ // leading to errors. We need to check for `getRootNode`.
+ if ( documentElement.getRootNode ) {
+ isAttached = function( elem ) {
+ return jQuery.contains( elem.ownerDocument, elem ) ||
+ elem.getRootNode( composed ) === elem.ownerDocument;
+ };
+ }
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ isAttached( elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = elem.nodeType &&
+ ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while ( maxIterations-- ) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style( elem, prop, initialInUnit + unit );
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+
+ // Support: IE <=9 only
+ // IE <=9 replaces <option> tags with their contents when inserted outside of
+ // the select element.
+ div.innerHTML = "<option></option>";
+ support.option = !!div.lastChild;
+} )();
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting <tbody> or other required elements.
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+};
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// Support: IE <=9 only
+if ( !support.option ) {
+ wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ];
+}
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, attached, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( toType( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ attached = isAttached( elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( attached ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 - 11+
+// focus() and blur() are asynchronous, except when they are no-op.
+// So expect focus to be synchronous when the element is already active,
+// and blur to be synchronous when the element is not already active.
+// (focus and blur are always synchronous in other supported browsers,
+// this just defines when we can count on it).
+function expectSync( elem, type ) {
+ return ( elem === safeActiveElement() ) === ( type === "focus" );
+}
+
+// Support: IE <=9 only
+// Accessing document.activeElement can throw unexpectedly
+// https://bugs.jquery.com/ticket/13393
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Only attach events to objects that accept data
+ if ( !acceptData( elem ) ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = Object.create( null );
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( nativeEvent ),
+
+ handlers = (
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // If the event is namespaced, then each handler is only invoked if it is
+ // specially universal or its namespaces are a superset of the event's.
+ if ( !event.rnamespace || handleObj.namespace === false ||
+ event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG <use> instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ click: {
+
+ // Utilize native event to ensure correct state for checkable inputs
+ setup: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Claim the first handler
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ // dataPriv.set( el, "click", ... )
+ leverageNative( el, "click", returnTrue );
+ }
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function( data ) {
+
+ // For mutual compressibility with _default, replace `this` access with a local var.
+ // `|| data` is dead code meant only to preserve the variable through minification.
+ var el = this || data;
+
+ // Force setup before triggering a click
+ if ( rcheckableType.test( el.type ) &&
+ el.click && nodeName( el, "input" ) ) {
+
+ leverageNative( el, "click" );
+ }
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // For cross-browser consistency, suppress native .click() on links
+ // Also prevent it if we're currently inside a leveraged native-event stack
+ _default: function( event ) {
+ var target = event.target;
+ return rcheckableType.test( target.type ) &&
+ target.click && nodeName( target, "input" ) &&
+ dataPriv.get( target, "click" ) ||
+ nodeName( target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+// Ensure the presence of an event listener that handles manually-triggered
+// synthetic events by interrupting progress until reinvoked in response to
+// *native* events that it fires directly, ensuring that state changes have
+// already occurred before other listeners are invoked.
+function leverageNative( el, type, expectSync ) {
+
+ // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add
+ if ( !expectSync ) {
+ if ( dataPriv.get( el, type ) === undefined ) {
+ jQuery.event.add( el, type, returnTrue );
+ }
+ return;
+ }
+
+ // Register the controller as a special universal handler for all event namespaces
+ dataPriv.set( el, type, false );
+ jQuery.event.add( el, type, {
+ namespace: false,
+ handler: function( event ) {
+ var notAsync, result,
+ saved = dataPriv.get( this, type );
+
+ if ( ( event.isTrigger & 1 ) && this[ type ] ) {
+
+ // Interrupt processing of the outer synthetic .trigger()ed event
+ // Saved data should be false in such cases, but might be a leftover capture object
+ // from an async native handler (gh-4350)
+ if ( !saved.length ) {
+
+ // Store arguments for use when handling the inner native event
+ // There will always be at least one argument (an event object), so this array
+ // will not be confused with a leftover capture object.
+ saved = slice.call( arguments );
+ dataPriv.set( this, type, saved );
+
+ // Trigger the native event and capture its result
+ // Support: IE <=9 - 11+
+ // focus() and blur() are asynchronous
+ notAsync = expectSync( this, type );
+ this[ type ]();
+ result = dataPriv.get( this, type );
+ if ( saved !== result || notAsync ) {
+ dataPriv.set( this, type, false );
+ } else {
+ result = {};
+ }
+ if ( saved !== result ) {
+
+ // Cancel the outer synthetic event
+ event.stopImmediatePropagation();
+ event.preventDefault();
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
+ }
+
+ // If this is an inner synthetic event for an event with a bubbling surrogate
+ // (focus or blur), assume that the surrogate already propagated from triggering the
+ // native event and prevent that from happening again here.
+ // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the
+ // bubbling surrogate propagates *after* the non-bubbling base), but that seems
+ // less bad than duplication.
+ } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {
+ event.stopPropagation();
+ }
+
+ // If this is a native event triggered above, everything is now in order
+ // Fire an inner synthetic event with the original arguments
+ } else if ( saved.length ) {
+
+ // ...and capture the result
+ dataPriv.set( this, type, {
+ value: jQuery.event.trigger(
+
+ // Support: IE <=9 - 11+
+ // Extend with the prototype to reset the above stopImmediatePropagation()
+ jQuery.extend( saved[ 0 ], jQuery.Event.prototype ),
+ saved.slice( 1 ),
+ this
+ )
+ } );
+
+ // Abort handling of the native event
+ event.stopImmediatePropagation();
+ }
+ }
+ } );
+}
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ code: true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+ which: true
+}, jQuery.event.addProp );
+
+jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
+ jQuery.event.special[ type ] = {
+
+ // Utilize native event if possible so blur/focus sequence is correct
+ setup: function() {
+
+ // Claim the first handler
+ // dataPriv.set( this, "focus", ... )
+ // dataPriv.set( this, "blur", ... )
+ leverageNative( this, type, expectSync );
+
+ // Return false to allow normal processing in the caller
+ return false;
+ },
+ trigger: function() {
+
+ // Force setup before trigger
+ leverageNative( this, type );
+
+ // Return non-false to allow normal event-path propagation
+ return true;
+ },
+
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
+ delegateType: delegateType
+ };
+} );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /<script|<style|<link/i,
+
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+ if ( nodeName( elem, "table" ) &&
+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+ }
+
+ return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+ elem.type = elem.type.slice( 5 );
+ } else {
+ elem.removeAttribute( "type" );
+ }
+
+ return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( dataPriv.hasData( src ) ) {
+ pdataOld = dataPriv.get( src );
+ events = pdataOld.events;
+
+ if ( events ) {
+ dataPriv.remove( dest, "handle events" );
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( dataUser.hasData( src ) ) {
+ udataOld = dataUser.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ dataUser.set( dest, udataCur );
+ }
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+ // Flatten any nested arrays
+ args = flat( args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = collection.length,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ valueIsFunction = isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( valueIsFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return collection.each( function( index ) {
+ var self = collection.eq( index );
+ if ( valueIsFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ domManip( self, args, callback, ignored );
+ } );
+ }
+
+ if ( l ) {
+ fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ // Require either new content or an interest in ignored elements to invoke the callback
+ if ( first || ignored ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item
+ // instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( collection[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !dataPriv.access( node, "globalEval" ) &&
+ jQuery.contains( doc, node ) ) {
+
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
+
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl && !node.noModule ) {
+ jQuery._evalUrl( node.src, {
+ nonce: node.nonce || node.getAttribute( "nonce" )
+ }, doc );
+ }
+ } else {
+ DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return collection;
+}
+
+function remove( elem, selector, keepData ) {
+ var node,
+ nodes = selector ? jQuery.filter( selector, elem ) : elem,
+ i = 0;
+
+ for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+ if ( !keepData && node.nodeType === 1 ) {
+ jQuery.cleanData( getAll( node ) );
+ }
+
+ if ( node.parentNode ) {
+ if ( keepData && isAttached( node ) ) {
+ setGlobalEval( getAll( node, "script" ) );
+ }
+ node.parentNode.removeChild( node );
+ }
+ }
+
+ return elem;
+}
+
+jQuery.extend( {
+ htmlPrefilter: function( html ) {
+ return html;
+ },
+
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = isAttached( elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+ if ( acceptData( elem ) ) {
+ if ( ( data = elem[ dataPriv.expando ] ) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataPriv.expando ] = undefined;
+ }
+ if ( elem[ dataUser.expando ] ) {
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataUser.expando ] = undefined;
+ }
+ }
+ }
+ }
+} );
+
+jQuery.fn.extend( {
+ detach: function( selector ) {
+ return remove( this, selector, true );
+ },
+
+ remove: function( selector ) {
+ return remove( this, selector );
+ },
+
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each( function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ } );
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ } );
+ },
+
+ prepend: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ } );
+ },
+
+ before: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ } );
+ },
+
+ after: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ } );
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; ( elem = this[ i ] ) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ } );
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = jQuery.htmlPrefilter( value );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch ( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var ignored = [];
+
+ // Make the changes, replacing each non-ignored context element with the new content
+ return domManip( this, arguments, function( elem ) {
+ var parent = this.parentNode;
+
+ if ( jQuery.inArray( this, ignored ) < 0 ) {
+ jQuery.cleanData( getAll( this ) );
+ if ( parent ) {
+ parent.replaceChild( elem, this );
+ }
+ }
+
+ // Force callback invocation
+ }, ignored );
+ }
+} );
+
+jQuery.each( {
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ var view = elem.ownerDocument.defaultView;
+
+ if ( !view || !view.opener ) {
+ view = window;
+ }
+
+ return view.getComputedStyle( elem );
+ };
+
+var swap = function( elem, options, callback ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computeStyleTests() {
+
+ // This is a singleton, we need to execute it only once
+ if ( !div ) {
+ return;
+ }
+
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+ "margin-top:1px;padding:0;border:0";
+ div.style.cssText =
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+ "margin:auto;border:1px;padding:1px;" +
+ "width:60%;top:1%";
+ documentElement.appendChild( container ).appendChild( div );
+
+ var divStyle = window.getComputedStyle( div );
+ pixelPositionVal = divStyle.top !== "1%";
+
+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+ // Some styles come back with percentage values, even though they shouldn't
+ div.style.right = "60%";
+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+ // Support: IE 9 - 11 only
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+ // Support: IE 9 only
+ // Detect overflow:scroll screwiness (gh-3699)
+ // Support: Chrome <=64
+ // Don't get tricked when zoom affects offsetWidth (gh-4029)
+ div.style.position = "absolute";
+ scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;
+
+ documentElement.removeChild( container );
+
+ // Nullify the div so it wouldn't be stored in the memory and
+ // it will also be a sign that checks already performed
+ div = null;
+ }
+
+ function roundPixelMeasures( measure ) {
+ return Math.round( parseFloat( measure ) );
+ }
+
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+ reliableTrDimensionsVal, reliableMarginLeftVal,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ // Finish early in limited (non-browser) environments
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE <=9 - 11 only
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ jQuery.extend( support, {
+ boxSizingReliable: function() {
+ computeStyleTests();
+ return boxSizingReliableVal;
+ },
+ pixelBoxStyles: function() {
+ computeStyleTests();
+ return pixelBoxStylesVal;
+ },
+ pixelPosition: function() {
+ computeStyleTests();
+ return pixelPositionVal;
+ },
+ reliableMarginLeft: function() {
+ computeStyleTests();
+ return reliableMarginLeftVal;
+ },
+ scrollboxSize: function() {
+ computeStyleTests();
+ return scrollboxSizeVal;
+ },
+
+ // Support: IE 9 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Behavior in IE 9 is more subtle than in newer versions & it passes
+ // some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
+ reliableTrDimensions: function() {
+ var table, tr, trChild, trStyle;
+ if ( reliableTrDimensionsVal == null ) {
+ table = document.createElement( "table" );
+ tr = document.createElement( "tr" );
+ trChild = document.createElement( "div" );
+
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
+ tr.style.height = "1px";
+ trChild.style.height = "9px";
+
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
+ documentElement
+ .appendChild( table )
+ .appendChild( tr )
+ .appendChild( trChild );
+
+ trStyle = window.getComputedStyle( tr );
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
+
+ documentElement.removeChild( table );
+ }
+ return reliableTrDimensionsVal;
+ }
+ } );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+
+ // Support: Firefox 51+
+ // Retrieving style before computed somehow
+ // fixes an issue with getting wrong values
+ // on detached elements
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // getPropertyValue is needed for:
+ // .css('filter') (IE 9 only, #12537)
+ // .css('--customProperty) (#3144)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+
+ if ( ret === "" && !isAttached( elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Android Browser returns percentage for some values,
+ // but width seems to be reliably pixels.
+ // This is against the CSSOM draft spec:
+ // https://drafts.csswg.org/cssom/#resolved-values
+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+
+ // Support: IE <=9 - 11 only
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return ( this.get = hookFn ).apply( this, arguments );
+ }
+ };
+}
+
+
+var cssPrefixes = [ "Webkit", "Moz", "ms" ],
+ emptyStyle = document.createElement( "div" ).style,
+ vendorProps = {};
+
+// Return a vendor-prefixed property or undefined
+function vendorPropName( name ) {
+
+ // Check for vendor prefixed names
+ var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in emptyStyle ) {
+ return name;
+ }
+ }
+}
+
+// Return a potentially-mapped jQuery.cssProps or vendor prefixed property
+function finalPropName( name ) {
+ var final = jQuery.cssProps[ name ] || vendorProps[ name ];
+
+ if ( final ) {
+ return final;
+ }
+ if ( name in emptyStyle ) {
+ return name;
+ }
+ return vendorProps[ name ] = vendorPropName( name ) || name;
+}
+
+
+var
+
+ // Swappable if display is none or starts with table
+ // except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rcustomProp = /^--/,
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ };
+
+function setPositiveNumber( _elem, value, subtract ) {
+
+ // Any relative (+/-) values have already been
+ // normalized at this point
+ var matches = rcssNum.exec( value );
+ return matches ?
+
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+ value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+ var i = dimension === "width" ? 1 : 0,
+ extra = 0,
+ delta = 0;
+
+ // Adjustment may not be necessary
+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
+ return 0;
+ }
+
+ for ( ; i < 4; i += 2 ) {
+
+ // Both box models exclude margin
+ if ( box === "margin" ) {
+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+ }
+
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+ if ( !isBorderBox ) {
+
+ // Add padding
+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // For "border" or "margin", add border
+ if ( box !== "padding" ) {
+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+ // But still keep track of it otherwise
+ } else {
+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
+ // "padding" or "margin"
+ } else {
+
+ // For "content", subtract padding
+ if ( box === "content" ) {
+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // For "content" or "padding", subtract border
+ if ( box !== "margin" ) {
+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ // Account for positive content-box scroll gutter when requested by providing computedVal
+ if ( !isBorderBox && computedVal >= 0 ) {
+
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+ // Assuming integer scroll gutter, subtract the rest and round down
+ delta += Math.max( 0, Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ computedVal -
+ delta -
+ extra -
+ 0.5
+
+ // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter
+ // Use an explicit zero to avoid NaN (gh-3964)
+ ) ) || 0;
+ }
+
+ return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+ // Start with computed style
+ var styles = getStyles( elem ),
+
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).
+ // Fake content-box until we know it's needed to know the true value.
+ boxSizingNeeded = !support.boxSizingReliable() || extra,
+ isBorderBox = boxSizingNeeded &&
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ valueIsBorderBox = isBorderBox,
+
+ val = curCSS( elem, dimension, styles ),
+ offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );
+
+ // Support: Firefox <=54
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
+ if ( rnumnonpx.test( val ) ) {
+ if ( !extra ) {
+ return val;
+ }
+ val = "auto";
+ }
+
+
+ // Support: IE 9 - 11 only
+ // Use offsetWidth/offsetHeight for when box sizing is unreliable.
+ // In those cases, the computed value can be trusted to be border-box.
+ if ( ( !support.boxSizingReliable() && isBorderBox ||
+
+ // Support: IE 10 - 11+, Edge 15 - 18+
+ // IE/Edge misreport `getComputedStyle` of table rows with width/height
+ // set in CSS while `offset*` properties report correct values.
+ // Interestingly, in some cases IE 9 doesn't suffer from this issue.
+ !support.reliableTrDimensions() && nodeName( elem, "tr" ) ||
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
+ val === "auto" ||
+
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) &&
+
+ // Make sure the element is visible & connected
+ elem.getClientRects().length ) {
+
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+ // Where available, offsetWidth/offsetHeight approximate border box dimensions.
+ // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the
+ // retrieved value as a content box dimension.
+ valueIsBorderBox = offsetProp in elem;
+ if ( valueIsBorderBox ) {
+ val = elem[ offsetProp ];
+ }
+ }
+
+ // Normalize "" and auto
+ val = parseFloat( val ) || 0;
+
+ // Adjust for the element's box model
+ return ( val +
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles,
+
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
+ val
+ )
+ ) + "px";
+}
+
+jQuery.extend( {
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "animationIterationCount": true,
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "gridArea": true,
+ "gridColumn": true,
+ "gridColumnEnd": true,
+ "gridColumnStart": true,
+ "gridRow": true,
+ "gridRowEnd": true,
+ "gridRowStart": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {},
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name ),
+ style = elem.style;
+
+ // Make sure that we're working with the right name. We don't
+ // want to query the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+ value = adjustCSS( elem, name, ret );
+
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add the unit (except for certain CSS properties)
+ // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append
+ // "px" to a few hardcoded values.
+ if ( type === "number" && !isCustomProp ) {
+ value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+ }
+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !( "set" in hooks ) ||
+ ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+ if ( isCustomProp ) {
+ style.setProperty( name, value );
+ } else {
+ style[ name ] = value;
+ }
+ }
+
+ } else {
+
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks &&
+ ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name );
+
+ // Make sure that we're working with the right name. We don't
+ // want to modify the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || isFinite( num ) ? num || 0 : val;
+ }
+
+ return val;
+ }
+} );
+
+jQuery.each( [ "height", "width" ], function( _i, dimension ) {
+ jQuery.cssHooks[ dimension ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+ // Support: Safari 8+
+ // Table columns in Safari have non-zero offsetWidth & zero
+ // getBoundingClientRect().width unless display is changed.
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a disconnected node
+ // in IE throws an error.
+ ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var matches,
+ styles = getStyles( elem ),
+
+ // Only read styles.position if the test has a chance to fail
+ // to avoid forcing a reflow.
+ scrollboxSizeBuggy = !support.scrollboxSize() &&
+ styles.position === "absolute",
+
+ // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)
+ boxSizingNeeded = scrollboxSizeBuggy || extra,
+ isBorderBox = boxSizingNeeded &&
+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ subtract = extra ?
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra,
+ isBorderBox,
+ styles
+ ) :
+ 0;
+
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
+ // faking a content-box to get border and padding (gh-3699)
+ if ( isBorderBox && scrollboxSizeBuggy ) {
+ subtract -= Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ parseFloat( styles[ dimension ] ) -
+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
+ 0.5
+ );
+ }
+
+ // Convert to pixels if value adjustment is needed
+ if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+ ( matches[ 3 ] || "px" ) !== "px" ) {
+
+ elem.style[ dimension ] = value;
+ value = jQuery.css( elem, dimension );
+ }
+
+ return setPositiveNumber( elem, value, subtract );
+ }
+ };
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+ function( elem, computed ) {
+ if ( computed ) {
+ return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+ elem.getBoundingClientRect().left -
+ swap( elem, { marginLeft: 0 }, function() {
+ return elem.getBoundingClientRect().left;
+ } )
+ ) + "px";
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( prefix !== "margin" ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+} );
+
+jQuery.fn.extend( {
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( Array.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ }
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || jQuery.easing._default;
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ // Use a property on the element directly when it is not a DOM element,
+ // or when there is no matching style property that exists.
+ if ( tween.elem.nodeType !== 1 ||
+ tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.nodeType === 1 && (
+ jQuery.cssHooks[ tween.prop ] ||
+ tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ },
+ _default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, inProgress,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rrun = /queueHooks$/;
+
+function schedule() {
+ if ( inProgress ) {
+ if ( document.hidden === false && window.requestAnimationFrame ) {
+ window.requestAnimationFrame( schedule );
+ } else {
+ window.setTimeout( schedule, jQuery.fx.interval );
+ }
+
+ jQuery.fx.tick();
+ }
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ window.setTimeout( function() {
+ fxNow = undefined;
+ } );
+ return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+ isBox = "width" in props || "height" in props,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHiddenWithinTree( elem ),
+ dataShow = dataPriv.get( elem, "fxshow" );
+
+ // Queue-skipping animations hijack the fx hooks
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always( function() {
+
+ // Ensure the complete handler is called before this completes
+ anim.always( function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ } );
+ } );
+ }
+
+ // Detect show/hide animations
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.test( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // Pretend to be hidden if this is a "show" and
+ // there is still data from a stopped show/hide
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+
+ // Ignore all other no-op show/hide data
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+ }
+ }
+
+ // Bail out if this is a no-op like .hide().hide()
+ propTween = !jQuery.isEmptyObject( props );
+ if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+ return;
+ }
+
+ // Restrict "overflow" and "display" styles during box animations
+ if ( isBox && elem.nodeType === 1 ) {
+
+ // Support: IE <=9 - 11, Edge 12 - 15
+ // Record all 3 overflow attributes because IE does not infer the shorthand
+ // from identically-valued overflowX and overflowY and Edge just mirrors
+ // the overflowX value there.
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Identify a display type, preferring old show/hide data over the CSS cascade
+ restoreDisplay = dataShow && dataShow.display;
+ if ( restoreDisplay == null ) {
+ restoreDisplay = dataPriv.get( elem, "display" );
+ }
+ display = jQuery.css( elem, "display" );
+ if ( display === "none" ) {
+ if ( restoreDisplay ) {
+ display = restoreDisplay;
+ } else {
+
+ // Get nonempty value(s) by temporarily forcing visibility
+ showHide( [ elem ], true );
+ restoreDisplay = elem.style.display || restoreDisplay;
+ display = jQuery.css( elem, "display" );
+ showHide( [ elem ] );
+ }
+ }
+
+ // Animate inline elements as inline-block
+ if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+ if ( jQuery.css( elem, "float" ) === "none" ) {
+
+ // Restore the original display value at the end of pure show/hide animations
+ if ( !propTween ) {
+ anim.done( function() {
+ style.display = restoreDisplay;
+ } );
+ if ( restoreDisplay == null ) {
+ display = style.display;
+ restoreDisplay = display === "none" ? "" : display;
+ }
+ }
+ style.display = "inline-block";
+ }
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always( function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ } );
+ }
+
+ // Implement show/hide animations
+ propTween = false;
+ for ( prop in orig ) {
+
+ // General show/hide setup for this element animation
+ if ( !propTween ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+ }
+
+ // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+
+ // Show elements before animating them
+ if ( hidden ) {
+ showHide( [ elem ], true );
+ }
+
+ /* eslint-disable no-loop-func */
+
+ anim.done( function() {
+
+ /* eslint-enable no-loop-func */
+
+ // The final step of a "hide" animation is actually hiding the element
+ if ( !hidden ) {
+ showHide( [ elem ] );
+ }
+ dataPriv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ } );
+ }
+
+ // Per-property setup
+ propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = propTween.start;
+ if ( hidden ) {
+ propTween.end = propTween.start;
+ propTween.start = 0;
+ }
+ }
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( Array.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = Animation.prefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ } ),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+ // Support: Android 2.3 only
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+ // If there's more to do, yield
+ if ( percent < 1 && length ) {
+ return remaining;
+ }
+
+ // If this was an empty animation, synthesize a final progress notification
+ if ( !length ) {
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
+ }
+
+ // Resolve the animation and report its conclusion
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ },
+ animation = deferred.promise( {
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, {
+ specialEasing: {},
+ easing: jQuery.easing._default
+ }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ } ),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length; index++ ) {
+ result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ if ( isFunction( result.stop ) ) {
+ jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+ result.stop.bind( result );
+ }
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ // Attach callbacks from options
+ animation
+ .progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ } )
+ );
+
+ return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweeners: {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value );
+ adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+ return tween;
+ } ]
+ },
+
+ tweener: function( props, callback ) {
+ if ( isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.match( rnothtmlwhite );
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length; index++ ) {
+ prop = props[ index ];
+ Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+ Animation.tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilters: [ defaultPrefilter ],
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ Animation.prefilters.unshift( callback );
+ } else {
+ Animation.prefilters.push( callback );
+ }
+ }
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !isFunction( easing ) && easing
+ };
+
+ // Go to the end state if fx are off
+ if ( jQuery.fx.off ) {
+ opt.duration = 0;
+
+ } else {
+ if ( typeof opt.duration !== "number" ) {
+ if ( opt.duration in jQuery.fx.speeds ) {
+ opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+ } else {
+ opt.duration = jQuery.fx.speeds._default;
+ }
+ }
+ }
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend( {
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate( { opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || dataPriv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each( function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = dataPriv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this &&
+ ( type == null || timers[ index ].queue === type ) ) {
+
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each( function() {
+ var index,
+ data = dataPriv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ } );
+ }
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+ slideDown: genFx( "show" ),
+ slideUp: genFx( "hide" ),
+ slideToggle: genFx( "toggle" ),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = Date.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+
+ // Run the timer and safely remove it when done (allowing for external removal)
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+ if ( inProgress ) {
+ return;
+ }
+
+ inProgress = true;
+ schedule();
+};
+
+jQuery.fx.stop = function() {
+ inProgress = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = window.setTimeout( next, time );
+ hooks.stop = function() {
+ window.clearTimeout( timeout );
+ };
+ } );
+};
+
+
+( function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: Android <=4.3 only
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE <=11 only
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: IE <=11 only
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each( function() {
+ jQuery.removeAttr( this, name );
+ } );
+ }
+} );
+
+jQuery.extend( {
+ attr: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set attributes on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === "undefined" ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // Attribute hooks are determined by the lowercase version
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+ }
+
+ if ( value !== undefined ) {
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+ return;
+ }
+
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ? undefined : ret;
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name,
+ i = 0,
+
+ // Attribute names can contain non-HTML whitespace characters
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ attrNames = value && value.match( rnothtmlwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( ( name = attrNames[ i++ ] ) ) {
+ elem.removeAttribute( name );
+ }
+ }
+ }
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle,
+ lowercaseName = name.toLowerCase();
+
+ if ( !isXML ) {
+
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ lowercaseName ];
+ attrHandle[ lowercaseName ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ lowercaseName :
+ null;
+ attrHandle[ lowercaseName ] = handle;
+ }
+ return ret;
+ };
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+ rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each( function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ } );
+ }
+} );
+
+jQuery.extend( {
+ prop: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ return ( elem[ name ] = value );
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ return elem[ name ];
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+
+ // Support: IE <=9 - 11 only
+ // elem.tabIndex doesn't always return the
+ // correct value when it hasn't been explicitly set
+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+ if ( tabindex ) {
+ return parseInt( tabindex, 10 );
+ }
+
+ if (
+ rfocusable.test( elem.nodeName ) ||
+ rclickable.test( elem.nodeName ) &&
+ elem.href
+ ) {
+ return 0;
+ }
+
+ return -1;
+ }
+ }
+ },
+
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ }
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ },
+ set: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+ };
+}
+
+jQuery.each( [
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+ // Strip and collapse whitespace according to HTML spec
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+ function stripAndCollapse( value ) {
+ var tokens = value.match( rnothtmlwhite ) || [];
+ return tokens.join( " " );
+ }
+
+
+function getClass( elem ) {
+ return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+ if ( Array.isArray( value ) ) {
+ return value;
+ }
+ if ( typeof value === "string" ) {
+ return value.match( rnothtmlwhite ) || [];
+ }
+ return [];
+}
+
+jQuery.fn.extend( {
+ addClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ if ( !arguments.length ) {
+ return this.attr( "class", "" );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isValidValue = type === "string" || Array.isArray( value );
+
+ if ( typeof stateVal === "boolean" && isValidValue ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( isFunction( value ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).toggleClass(
+ value.call( this, i, getClass( this ), stateVal ),
+ stateVal
+ );
+ } );
+ }
+
+ return this.each( function() {
+ var className, i, self, classNames;
+
+ if ( isValidValue ) {
+
+ // Toggle individual class names
+ i = 0;
+ self = jQuery( this );
+ classNames = classesToArray( value );
+
+ while ( ( className = classNames[ i++ ] ) ) {
+
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( value === undefined || type === "boolean" ) {
+ className = getClass( this );
+ if ( className ) {
+
+ // Store className if set
+ dataPriv.set( this, "__className__", className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ if ( this.setAttribute ) {
+ this.setAttribute( "class",
+ className || value === false ?
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
+ );
+ }
+ }
+ } );
+ },
+
+ hasClass: function( selector ) {
+ var className, elem,
+ i = 0;
+
+ className = " " + selector + " ";
+ while ( ( elem = this[ i++ ] ) ) {
+ if ( elem.nodeType === 1 &&
+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+ val: function( value ) {
+ var hooks, ret, valueIsFunction,
+ elem = this[ 0 ];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] ||
+ jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks &&
+ "get" in hooks &&
+ ( ret = hooks.get( elem, "value" ) ) !== undefined
+ ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ // Handle most common string cases
+ if ( typeof ret === "string" ) {
+ return ret.replace( rreturn, "" );
+ }
+
+ // Handle cases where value is null/undef or number
+ return ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ valueIsFunction = isFunction( value );
+
+ return this.each( function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( valueIsFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( Array.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ } );
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ } );
+ }
+} );
+
+jQuery.extend( {
+ valHooks: {
+ option: {
+ get: function( elem ) {
+
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+
+ // Support: IE <=10 - 11 only
+ // option.text throws exceptions (#14686, #14858)
+ // Strip and collapse whitespace
+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+ stripAndCollapse( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option, i,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one",
+ values = one ? null : [],
+ max = one ? index + 1 : options.length;
+
+ if ( index < 0 ) {
+ i = max;
+
+ } else {
+ i = one ? index : 0;
+ }
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // Support: IE <=9 only
+ // IE8-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+
+ // Don't return options that are disabled or in a disabled optgroup
+ !option.disabled &&
+ ( !option.parentNode.disabled ||
+ !nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+
+ /* eslint-disable no-cond-assign */
+
+ if ( option.selected =
+ jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+ ) {
+ optionSet = true;
+ }
+
+ /* eslint-enable no-cond-assign */
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( Array.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+ };
+ }
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ stopPropagationCallback = function( e ) {
+ e.stopPropagation();
+ };
+
+jQuery.extend( jQuery.event, {
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+ cur = lastElement = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf( "." ) > -1 ) {
+
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split( "." );
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join( "." );
+ event.rnamespace = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === ( elem.ownerDocument || document ) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+ lastElement = cur;
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
+ dataPriv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( ( !special._default ||
+ special._default.apply( eventPath.pop(), data ) === false ) &&
+ acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.addEventListener( type, stopPropagationCallback );
+ }
+
+ elem[ type ]();
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.removeEventListener( type, stopPropagationCallback );
+ }
+
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ // Piggyback on a donor event to simulate a different one
+ // Used only for `focus(in | out)` events
+ simulate: function( type, elem, event ) {
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true
+ }
+ );
+
+ jQuery.event.trigger( e, null, elem );
+ }
+
+} );
+
+jQuery.fn.extend( {
+
+ trigger: function( type, data ) {
+ return this.each( function() {
+ jQuery.event.trigger( type, data, this );
+ } );
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[ 0 ];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+
+ // Handle: regular nodes (via `this.ownerDocument`), window
+ // (via `this.document`) & document (via `this`).
+ var doc = this.ownerDocument || this.document || this,
+ attaches = dataPriv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this.document || this,
+ attaches = dataPriv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ dataPriv.remove( doc, fix );
+
+ } else {
+ dataPriv.access( doc, fix, attaches );
+ }
+ }
+ };
+ } );
+}
+var location = window.location;
+
+var nonce = { guid: Date.now() };
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml, parserErrorElem;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE 9 - 11 only
+ // IE throws on parseFromString with invalid input.
+ try {
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+ } catch ( e ) {}
+
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
+ }
+ return xml;
+};
+
+
+var
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( Array.isArray( obj ) ) {
+
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams(
+ prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+ v,
+ traditional,
+ add
+ );
+ }
+ } );
+
+ } else if ( !traditional && toType( obj ) === "object" ) {
+
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, valueOrFunction ) {
+
+ // If value is a function, invoke it and use its return value
+ var value = isFunction( valueOrFunction ) ?
+ valueOrFunction() :
+ valueOrFunction;
+
+ s[ s.length ] = encodeURIComponent( key ) + "=" +
+ encodeURIComponent( value == null ? "" : value );
+ };
+
+ if ( a == null ) {
+ return "";
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ } );
+
+ } else {
+
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map( function() {
+
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ } ).filter( function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ } ).map( function( _i, elem ) {
+ var val = jQuery( this ).val();
+
+ if ( val == null ) {
+ return null;
+ }
+
+ if ( Array.isArray( val ) ) {
+ return jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } );
+ }
+
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } ).get();
+ }
+} );
+
+
+var
+ r20 = /%20/g,
+ rhash = /#.*$/,
+ rantiCache = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Anchor tag for parsing the document origin
+ originAnchor = document.createElement( "a" );
+
+originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+ if ( isFunction( func ) ) {
+
+ // For each dataType in the dataTypeExpression
+ while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+ // Prepend if requested
+ if ( dataType[ 0 ] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+ // Otherwise append
+ } else {
+ ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" &&
+ !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ } );
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s.throws ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return {
+ state: "parsererror",
+ error: conv ? e : "No conversion from " + prev + " to " + current
+ };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: location.href,
+ type: "GET",
+ isLocal: rlocalProtocol.test( location.protocol ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /\bxml\b/,
+ html: /\bhtml/,
+ json: /\bjson\b/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": JSON.parse,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+
+ // URL without anti-cache param
+ cacheURL,
+
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+
+ // timeout handle
+ timeoutTimer,
+
+ // Url cleanup var
+ urlAnchor,
+
+ // Request state (becomes false upon send and true upon completion)
+ completed,
+
+ // To know if global events are to be dispatched
+ fireGlobals,
+
+ // Loop variable
+ i,
+
+ // uncached part of the url
+ uncached,
+
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+
+ // Callbacks context
+ callbackContext = s.context || s,
+
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context &&
+ ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks( "once memory" ),
+
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+
+ // Default abort message
+ strAbort = "canceled",
+
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( completed ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+ responseHeaders[ match[ 1 ].toLowerCase() + " " ] =
+ ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] )
+ .concat( match[ 2 ] );
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() + " " ];
+ }
+ return match == null ? null : match.join( ", " );
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return completed ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ if ( completed == null ) {
+ name = requestHeadersNames[ name.toLowerCase() ] =
+ requestHeadersNames[ name.toLowerCase() ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( completed == null ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( completed ) {
+
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ } else {
+
+ // Lazy-add the new callbacks in a way that preserves old ones
+ for ( code in map ) {
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR );
+
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || location.href ) + "" )
+ .replace( rprotocol, location.protocol + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+ // A cross-domain request is in order when the origin doesn't match the current origin.
+ if ( s.crossDomain == null ) {
+ urlAnchor = document.createElement( "a" );
+
+ // Support: IE <=8 - 11, Edge 12 - 15
+ // IE throws exception on accessing the href property if url is malformed,
+ // e.g. http://example.com:80x/
+ try {
+ urlAnchor.href = s.url;
+
+ // Support: IE <=8 - 11 only
+ // Anchor's host property isn't correctly set when s.url is relative
+ urlAnchor.href = urlAnchor.href;
+ s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+ urlAnchor.protocol + "//" + urlAnchor.host;
+ } catch ( e ) {
+
+ // If there is an error parsing the URL, assume it is crossDomain,
+ // it can be rejected by the transport if it is invalid
+ s.crossDomain = true;
+ }
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( completed ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger( "ajaxStart" );
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ // Remove hash to simplify url manipulation
+ cacheURL = s.url.replace( rhash, "" );
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // Remember the hash so we can put it back
+ uncached = s.url.slice( cacheURL.length );
+
+ // If data is available and should be processed, append data to url
+ if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+ cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add or update anti-cache param if needed
+ if ( s.cache === false ) {
+ cacheURL = cacheURL.replace( rantiCache, "$1" );
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) +
+ uncached;
+ }
+
+ // Put hash and anti-cache on the URL that will be requested (gh-1732)
+ s.url = cacheURL + uncached;
+
+ // Change '%20' to '+' if this is encoded form body content (gh-2658)
+ } else if ( s.data && s.processData &&
+ ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+ s.data = s.data.replace( r20, "+" );
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+ s.accepts[ s.dataTypes[ 0 ] ] +
+ ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend &&
+ ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ completeDeferred.add( s.complete );
+ jqXHR.done( s.success );
+ jqXHR.fail( s.error );
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+
+ // If request was aborted inside ajaxSend, stop there
+ if ( completed ) {
+ return jqXHR;
+ }
+
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = window.setTimeout( function() {
+ jqXHR.abort( "timeout" );
+ }, s.timeout );
+ }
+
+ try {
+ completed = false;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+
+ // Rethrow post-completion exceptions
+ if ( completed ) {
+ throw e;
+ }
+
+ // Propagate others as results
+ done( -1, e );
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Ignore repeat invocations
+ if ( completed ) {
+ return;
+ }
+
+ completed = true;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ window.clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
+ s.converters[ "text script" ] = function() {};
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader( "Last-Modified" );
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader( "etag" );
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+} );
+
+jQuery.each( [ "get", "post" ], function( _i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+
+ // Shift arguments if data argument was omitted
+ if ( isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ // The url can be an options object (which then must have .url)
+ return jQuery.ajax( jQuery.extend( {
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ }, jQuery.isPlainObject( url ) && url ) );
+ };
+} );
+
+jQuery.ajaxPrefilter( function( s ) {
+ var i;
+ for ( i in s.headers ) {
+ if ( i.toLowerCase() === "content-type" ) {
+ s.contentType = s.headers[ i ] || "";
+ }
+ }
+} );
+
+
+jQuery._evalUrl = function( url, options, doc ) {
+ return jQuery.ajax( {
+ url: url,
+
+ // Make this explicit, since user can override this through ajaxSetup (#11264)
+ type: "GET",
+ dataType: "script",
+ cache: true,
+ async: false,
+ global: false,
+
+ // Only evaluate the response if it is successful (gh-4126)
+ // dataFilter is not invoked for failure responses, so using it instead
+ // of the default converter is kludgy but it works.
+ converters: {
+ "text script": function() {}
+ },
+ dataFilter: function( response ) {
+ jQuery.globalEval( response, options, doc );
+ }
+ } );
+};
+
+
+jQuery.fn.extend( {
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( this[ 0 ] ) {
+ if ( isFunction( html ) ) {
+ html = html.call( this[ 0 ] );
+ }
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map( function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ } ).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( isFunction( html ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).wrapInner( html.call( this, i ) );
+ } );
+ }
+
+ return this.each( function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ } );
+ },
+
+ wrap: function( html ) {
+ var htmlIsFunction = isFunction( html );
+
+ return this.each( function( i ) {
+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+ } );
+ },
+
+ unwrap: function( selector ) {
+ this.parent( selector ).not( "body" ).each( function() {
+ jQuery( this ).replaceWith( this.childNodes );
+ } );
+ return this;
+ }
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+ return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+ return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new window.XMLHttpRequest();
+ } catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+ // File protocol always yields status code 0, assume 200
+ 0: 200,
+
+ // Support: IE <=9 only
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+ var callback, errorCallback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr();
+
+ xhr.open(
+ options.type,
+ options.url,
+ options.async,
+ options.username,
+ options.password
+ );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+ headers[ "X-Requested-With" ] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ callback = errorCallback = xhr.onload =
+ xhr.onerror = xhr.onabort = xhr.ontimeout =
+ xhr.onreadystatechange = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+
+ // Support: IE <=9 only
+ // On a manual native abort, IE9 throws
+ // errors on any property access that is not readyState
+ if ( typeof xhr.status !== "number" ) {
+ complete( 0, "error" );
+ } else {
+ complete(
+
+ // File: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ }
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+
+ // Support: IE <=9 only
+ // IE9 has no XHR2 but throws on binary (trac-11426)
+ // For XHR2 non-text, let the caller handle it (gh-2498)
+ ( xhr.responseType || "text" ) !== "text" ||
+ typeof xhr.responseText !== "string" ?
+ { binary: xhr.response } :
+ { text: xhr.responseText },
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+ // Support: IE 9 only
+ // Use onreadystatechange to replace onabort
+ // to handle uncaught aborts
+ if ( xhr.onabort !== undefined ) {
+ xhr.onabort = errorCallback;
+ } else {
+ xhr.onreadystatechange = function() {
+
+ // Check readyState before timeout as it changes
+ if ( xhr.readyState === 4 ) {
+
+ // Allow onerror to be called first,
+ // but that will not handle a native abort
+ // Also, save errorCallback to a variable
+ // as xhr.onerror cannot be accessed
+ window.setTimeout( function() {
+ if ( callback ) {
+ errorCallback();
+ }
+ } );
+ }
+ };
+ }
+
+ // Create the abort callback
+ callback = callback( "abort" );
+
+ try {
+
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+ if ( s.crossDomain ) {
+ s.contents.script = false;
+ }
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+ accepts: {
+ script: "text/javascript, application/javascript, " +
+ "application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /\b(?:java|ecma)script\b/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+ // This transport only deals with cross domain or forced-by-attrs requests
+ if ( s.crossDomain || s.scriptAttrs ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery( "<script>" )
+ .attr( s.scriptAttrs || {} )
+ .prop( { charset: s.scriptCharset, src: s.url } )
+ .on( "load error", callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ } );
+
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+} );
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" &&
+ ( s.contentType || "" )
+ .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+ rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters[ "script json" ] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // Force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always( function() {
+
+ // If previous value didn't exist - remove it
+ if ( overwritten === undefined ) {
+ jQuery( window ).removeProp( callbackName );
+
+ // Otherwise restore preexisting value
+ } else {
+ window[ callbackName ] = overwritten;
+ }
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+
+ // Make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // Save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ } );
+
+ // Delegate to script
+ return "script";
+ }
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+ var body = document.implementation.createHTMLDocument( "" ).body;
+ body.innerHTML = "<form></form><form></form>";
+ return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( typeof data !== "string" ) {
+ return [];
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+
+ var base, parsed, scripts;
+
+ if ( !context ) {
+
+ // Stop scripts or inline event handlers from being executed immediately
+ // by using document.implementation
+ if ( support.createHTMLDocument ) {
+ context = document.implementation.createHTMLDocument( "" );
+
+ // Set the base href for the created document
+ // so any parsed elements with URLs
+ // are based on the document's URL (gh-2965)
+ base = context.createElement( "base" );
+ base.href = document.location.href;
+ context.head.appendChild( base );
+ } else {
+ context = document;
+ }
+ }
+
+ parsed = rsingleTag.exec( data );
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[ 1 ] ) ];
+ }
+
+ parsed = buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ var selector, type, response,
+ self = this,
+ off = url.indexOf( " " );
+
+ if ( off > -1 ) {
+ selector = stripAndCollapse( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax( {
+ url: url,
+
+ // If "type" variable is undefined, then "GET" method will be used.
+ // Make value of this field explicit since
+ // user can override it through ajaxSetup method
+ type: type || "GET",
+ dataType: "html",
+ data: params
+ } ).done( function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ // If the request succeeds, this function gets "data", "status", "jqXHR"
+ // but they are ignored because response was set above.
+ // If it fails, this function gets "jqXHR", "status", "error"
+ } ).always( callback && function( jqXHR, status ) {
+ self.each( function() {
+ callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+ } );
+ } );
+ }
+
+ return this;
+};
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+ return jQuery.grep( jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ } ).length;
+};
+
+
+
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( isFunction( options ) ) {
+
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend( {
+
+ // offset() relates an element's border box to the document origin
+ offset: function( options ) {
+
+ // Preserve chaining for setter
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each( function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ } );
+ }
+
+ var rect, win,
+ elem = this[ 0 ];
+
+ if ( !elem ) {
+ return;
+ }
+
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a
+ // disconnected node in IE throws an error
+ if ( !elem.getClientRects().length ) {
+ return { top: 0, left: 0 };
+ }
+
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
+ rect = elem.getBoundingClientRect();
+ win = elem.ownerDocument.defaultView;
+ return {
+ top: rect.top + win.pageYOffset,
+ left: rect.left + win.pageXOffset
+ };
+ },
+
+ // position() relates an element's margin box to its offset parent's padding box
+ // This corresponds to the behavior of CSS absolute positioning
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset, doc,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+ // Assume position:fixed implies availability of getBoundingClientRect
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ offset = this.offset();
+
+ // Account for the *real* offset parent, which can be the document or its root element
+ // when a statically positioned element is identified
+ doc = elem.ownerDocument;
+ offsetParent = elem.offsetParent || doc.documentElement;
+ while ( offsetParent &&
+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+ jQuery.css( offsetParent, "position" ) === "static" ) {
+
+ offsetParent = offsetParent.parentNode;
+ }
+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+ // Incorporate borders into its offset, since they are outside its content origin
+ parentOffset = jQuery( offsetParent ).offset();
+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+ }
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ // This method will return documentElement in the following cases:
+ // 1) For the element inside the iframe without offsetParent, this method will return
+ // documentElement of the parent window
+ // 2) For the hidden or detached element
+ // 3) For body or html element, i.e. in case of the html node - it will return itself
+ //
+ // but those exceptions were never presented as a real life use-cases
+ // and might be considered as more preferable results.
+ //
+ // This logic, however, is not guaranteed and can change at any point in the future
+ offsetParent: function() {
+ return this.map( function() {
+ var offsetParent = this.offsetParent;
+
+ while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || documentElement;
+ } );
+ }
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+
+ // Coalesce documents and windows
+ var win;
+ if ( isWindow( elem ) ) {
+ win = elem;
+ } else if ( elem.nodeType === 9 ) {
+ win = elem.defaultView;
+ }
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : win.pageXOffset,
+ top ? val : win.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length );
+ };
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( _i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
+
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( isWindow( elem ) ) {
+
+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+ return funcName.indexOf( "outer" ) === 0 ?
+ elem[ "inner" + name ] :
+ elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable );
+ };
+ } );
+} );
+
+
+jQuery.each( [
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+], function( _i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+} );
+
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+ function( _i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+ }
+);
+
+
+
+
+// Support: Android <=4.0 only
+// Make sure we trim BOM and NBSP
+var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type( obj );
+ return ( type === "number" || type === "string" ) &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN( obj - parseFloat( obj ) );
+};
+
+jQuery.trim = function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+};
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ } );
+}
+
+
+
+
+var
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( typeof noGlobal === "undefined" ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
diff --git a/connector/src/test/resources/config/webcontent/js/js_country.js b/connector/src/test/resources/config/webcontent/js/js_country.js
index 5dcea90e..9baa0d0a 100644
--- a/connector/src/test/resources/config/webcontent/js/js_country.js
+++ b/connector/src/test/resources/config/webcontent/js/js_country.js
@@ -1,41 +1,41 @@
function clickCountryFlag(element) {
- if (!element) return false;
+ if (!element) return false;
- var form = element.target.closest("form");
+ var form = element.target.closest("form");
- if (!form) return false;
+ if (!form) return false;
- form.submit();
- return false;
+ form.submit();
+ return false;
}
/* Set JS events by EventListener to prevent problems with CSP*/
-document.addEventListener("DOMContentLoaded", function(event) {
-
- /* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
- if (!Element.prototype.matches)
- Element.prototype.matches = Element.prototype.msMatchesSelector ||
- Element.prototype.webkitMatchesSelector;
-
- if (!Element.prototype.closest)
- Element.prototype.closest = function(s) {
- var el = this;
- if (!document.documentElement.contains(el)) return null;
- do {
- if (el.matches(s)) return el;
- el = el.parentElement || el.parentNode;
- } while (el !== null && el.nodeType === 1);
- return null;
- };
-
- /* set Click events by EventListener to prevent JavaScript in HTML which can be a problem with CSP*/
- var allFlags = document.getElementsByClassName("countryimage");
- for (i=0;i<allFlags.length;i++) {
- if(allFlags[i].getAttribute("disabled") == null) {
- allFlags[i].closest("a").addEventListener('click', clickCountryFlag, false);
+document.addEventListener("DOMContentLoaded", function (event) {
+
+ /* Element.closest polyfill - https://developer.mozilla.org/en-US/docs/Web/API/Element/closest License: public domain*/
+ if (!Element.prototype.matches)
+ Element.prototype.matches = Element.prototype.msMatchesSelector ||
+ Element.prototype.webkitMatchesSelector;
+
+ if (!Element.prototype.closest)
+ Element.prototype.closest = function (s) {
+ var el = this;
+ if (!document.documentElement.contains(el)) return null;
+ do {
+ if (el.matches(s)) return el;
+ el = el.parentElement || el.parentNode;
+ } while (el !== null && el.nodeType === 1);
+ return null;
+ };
+
+ /* set Click events by EventListener to prevent JavaScript in HTML which can be a problem with CSP*/
+ var allFlags = document.getElementsByClassName("countryimage");
+ for (i = 0; i < allFlags.length; i++) {
+ if (allFlags[i].getAttribute("disabled") == null) {
+ allFlags[i].closest("a").addEventListener('click', clickCountryFlag, false);
+ }
}
- }
});
diff --git a/connector/src/test/resources/spring/SpringTest_connector.beans.xml b/connector/src/test/resources/spring/SpringTest_connector.beans.xml
index 98752b58..3d5b0458 100644
--- a/connector/src/test/resources/spring/SpringTest_connector.beans.xml
+++ b/connector/src/test/resources/spring/SpringTest_connector.beans.xml
@@ -10,6 +10,7 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
+
<import resource="classpath:/spring/SpringTest_core.beans.xml"/>
@@ -27,12 +28,8 @@
<bean id="PVP2XProtocol"
class="at.asitplus.eidas.specific.connector.controller.Pvp2SProfileEndpoint">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
- <property name="metadataProvider">
- <ref bean="PVPMetadataProvider" />
- </property>
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
+ <property name="metadataProvider" ref="PVPMetadataProvider" />
</bean>
<bean id="AuthnRequestValidator"
@@ -47,12 +44,8 @@
<bean id="PVPAuthenticationRequestAction"
class="at.gv.egiz.eaaf.modules.pvp2.idp.impl.AuthenticationAction">
- <property name="pvpIdpCredentials">
- <ref bean="PVPEndPointCredentialProvider" />
- </property>
- <property name="metadataProvider">
- <ref bean="PVPMetadataProvider" />
- </property>
+ <property name="pvpIdpCredentials" ref="PVPEndPointCredentialProvider" />
+ <property name="metadataProvider" ref="PVPMetadataProvider" />
</bean>
<bean id="PVPMetadataProvider"
diff --git a/infos/Handbuch_MS-eIDAS-Node.docx b/infos/Handbuch_MS-eIDAS-Node.docx
index 0401fea9..c844f0e5 100644
--- a/infos/Handbuch_MS-eIDAS-Node.docx
+++ b/infos/Handbuch_MS-eIDAS-Node.docx
Binary files differ
diff --git a/infos/history.txt b/infos/history.txt
index 9c6f06d1..57a05a12 100644
--- a/infos/history.txt
+++ b/infos/history.txt
@@ -1,5 +1,22 @@
Dieses Dokument zeigt die Veränderungen und Erweiterungen am eIDAS MS-Connector
+Version 1.3.0 (2022-05-xx):
+ - Feature
+ - Erweitertes Identitätsmatching welches sowohl bestehende ZMR und ERnP Einträge berücksichtigt
+ - Bugfix
+ - Fehler bei der Verarbeitung von leeren Attributewerten behoben
+ - Akutalisierung von Drittherstellerbibliotheken
+ - Spring-Core 5.3.18
+ - Spring-Boot 2.5.12
+ - thymeleaf-spring5 3.0.15.RELEASE
+ - Apache CXF 3.4.6
+ - Google Guava 31.1-jre
+ - Jackson 2.13.2
+ - Joda-Time 2.10.14
+ - jose4j 0.7.11
+ - log4j 2.17.2
+ - slf4j 1.7.36
+
Version 1.2.4 (2022-04-05):
- Bugfix
- Mögliche RCE Schwachstelle via Spring Framework behoben (CVE-2022-22965)
diff --git a/infos/readme_1.3.0.md b/infos/readme_1.3.0.md
new file mode 100644
index 00000000..7bfae522
--- /dev/null
+++ b/infos/readme_1.3.0.md
@@ -0,0 +1,62 @@
+# MS-Connector v1.3.0 Release vom xx.05.2022
+
+Der MS-Connector implementiert eine Bridge zwischen dem österreichischen E-ID System und dem eIDAS Framework um ausländischen Benutzern eine Anmeldung am österreichischen Service-Providern zu ermöglichen.
+
+### Änderungen in dieser Version
+
+ - Feature
+ - Erweitertes Identitätsmatching welches sowohl bestehende ZMR und ERnP Einträge berücksichtigt
+ - Bugfix
+ - Fehler bei der Verarbeitung von leeren Attributewerten behoben
+ - Akutalisierung von Drittherstellerbibliotheken
+
+
+
+
+### Durchführen eines Updates
+
+Nachfolgend finden Sie die erforderlichen Schritte für das Update eines bestehenden MS-specific eIDAS Connectors auf die aktuelle Version 1.3.0. Das vollständige Handbuch mit allen Konfigurationsparametern finden Sie im Releasepackage im Verzeichnis: _infos/handbook/_
+
+### Ausgehend von einer bestehenden Version 1.2.x
+
+1. Stoppen Sie die *MS-Connector* Applikation und fertigen Sie eine Sicherungskopie Ihrer Applikation inklusive Konfiguration an
+
+2. Entpacken Sie das Releasepacket *ms_specific_connector-1.3.0-dist.zip* in ein temporäres Verzeichnis welches in weiterer Folge __MsConnectorPackage__ bezeichnet wird.
+
+3. Kopieren sie die Applikation __MsConnectorPackage__/ms_connector.war nach in das Applikationsverzeichnis ihres Applikationsservers
+
+4. Neue Konfigurationsparameter
+
+ - *ZMR Client*
+ - ```eidas.ms.auth.eIDAS.zmrclient.endpoint```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.key.alias```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.key.password```
+ - ```eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr```
+ - *ERnP Client*
+ - ```eidas.ms.auth.eIDAS.ernpclient.endpoint```
+ - ```eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type```
+ - ```eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path```
+ - ```eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password```
+ - ```eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias```
+ - ```eidas.ms.auth.eIDAS.ernpclient.ssl.key.password```
+ - ```eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr```
+
+5. Neue optionale Konfigurationsparameter
+
+ - *ZMR Client*
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.type```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path```
+ - ```eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password```
+ - ```eidas.ms.auth.eIDAS.zmrclient.timeout.connection```
+ - ```eidas.ms.auth.eIDAS.zmrclient.timeout.response```
+ - ```eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code```
+ - ```eidas.ms.auth.eIDAS.zmrclient.req.update.reason.text```
+ - ```eidas.ms.auth.eIDAS.zmrclient.debug.logfullmessages```
+ - *ERnP Client*
+ * ```eidas.ms.client.http.connection.timeout.request```
+ * ```eidas.ms.client.http.connection.timeout.socket```
+
+
diff --git a/licenses/IAIK-LICENSE.txt b/licenses/IAIK-LICENSE.txt
deleted file mode 100644
index 4fa412cf..00000000
--- a/licenses/IAIK-LICENSE.txt
+++ /dev/null
@@ -1,108 +0,0 @@
-Stiftung SIC License Agreement for "IAIK MOA"
-
-Valid from December 1st, 2005
-
-The Stiftung SIC
-Stiftung Secure Information and Communication Technologies
-Inffeldgasse16a, A-8010 Graz, Austria, hereafter referred to as "Stiftung SIC",
-offers to grant licences for the SOFTWARE defined below according to the following conditions:
-
-1. DEFINITIONS
-For the purpose of this Licence Agreement, the following definitions are valid:
-
-a. The term "SOFTWARE" refers to the "IAIK MOA" bundle in any
-form (object code or other) including documentation. The
-SOFTWARE is the sole property of Stiftung SIC and protected by
-Austrian, International Copyright Law, e.g. the Revised Berne
-Convention, and the US Copyright Act.
-
-b. "IAIK MOA" is distributed in documentation, manuals, and user
-guides, tools - including any revisions, patches and updates
-downloaded by the customer.
-
-c."IAIK MOA Runtime Modules" means the runtime object code
-modules provided with, or derived from the SOFTWARE.
-
-d. "MOA modules" mean the modules for online applications made
-available by the Austrian Federal Chancellery and they consist of
-MOA-Signature Creation (MOA-SS), MOA-Signature Verification
-(MOA-SP) and MOA-Identification (MOA-ID).
-
-2. GRANTING of LICENCES
-
-The licensee is granted as specified below:
-
-o IAIK MOA Runtime License
-Stiftung SIC grants the Licensee a non-exclusive, non-transferable runtime licence to use the
-"IAIK MOA" modules in the context of unmodified MOA modules. Any attempt to use any parts or
-the whole IAIK Crypto Toolkits which come bundled together with the MOA modules for any
-purpose other than accessing these MOA modules by applications, including, but not limited to,
-the development of applications, the creation of a toolkit, or inclusion in a different toolkit, is not
-permitted without additional licenses. These licences are not transferable to contractors or any
-other persons, organisations or companies outside the licensee's organisation without making
-such persons, organisations or companies explicitly aware of the restrictions of these licenses
-and such persons, organisations or companies explicitly agree to observe these restrictions.
-
-3. LIMITATIONS for all LICENCES:
-LICENSEES must not attempt to reverse engineer, decompile, disassemble, reverse, translate or in
-any other manner decode the computer programmes in the IAIK libraries in order to derive the
-source code there from.
-
-4. WARRANTY:
-Stiftung SIC guarantees that the SOFTWARE is free of any computer virus or other malicious
-hidden routines that would intentionally cause damage to or corrupt data, storage media or
-equipment. For proving the integrity of the SOFTWARE, Stiftung SIC may calculate a SHA-1 hash
-value over the distribution file and publish it on its web site. It is the duty of the licensee to verify this
-hash value. If the hash value cannot be verified, Stiftung SIC declines any warranties on that
-software, and the licensee should immediately (or within 30 days of delivery at the latest), contact
-Stiftung SIC for verification and reshipment.
-The SOFTWARE is provided "as is" and except for the declaration and warranty stated in this
-section, Stiftung SIC makes no representations, conditions or warranties, either express or implied,
-relative to the SOFTWARE or services provided hereunder, including all implied conditions or
-warranties of merchantability and fitness for a particular purpose and all conditions with respect to
-intellectual property infringement. Stiftung SIC may, but shall not be obliged to, fix errors in any
-SOFTWARE.
-
-5. PROPRIETARY INFORMATION and CONFIDENTIALITY:
-The LICENSEE acknowledges that the SOFTWARE remains the property of, and is confidential to,
-Stiftung SIC and incorporates trade secrets of Stiftung SIC, and that Stiftung SIC shall have the
-exclusive right to any copyrights or patents in respect of the SOFTWARE. The LICENSEE agrees to
-maintain the confidentiality of the SOFTWARE.
-The LICENSEE further agrees that (with the exception of paragraph 2 above), he shall not make
-any disclosure of the SOFTWARE (including copies thereof or methods or concepts utilised therein)
-to any person or entity, other than employees of the LICENSEE, to whom such disclosure is
-necessary in order to use the SOFTWARE as provided herein. The LICENSEE shall appropriately
-notify each employee to whom any such disclosure is made. Such disclosure must be made in
-confidence and shall be kept in confidence by the employee in question.
-The LICENSEE agrees to use diligent and determined efforts to secure and protect the
-SOFTWARE and copies thereof in a manner consistent with their proprietary character and the
-maintenance of Licensor's rights therein, and without limitation thereof, to take appropriate action,
-by instruction or agreement with its employees who are permitted access to the SOFTWARE or
-copies thereof, or otherwise, to satisfy its obligations as hereby stated.
-
-6. TERMINATION:
-Stiftung SIC may terminate this Agreement without prior notice, if the licensee 1. neglects or fails to
-perform or observe, or correct a breach of its obligations to Stiftung SIC; 2. goes out of business,
-files a bankruptcy petition or has such a petition filed involuntarily against it or becomes insolvent; 3.
-develops, sells, licenses or distributes or attempts to develop, sell, license or distribute any software
-based on the SOFTWARE which is outside the scope of the limited rights granted herein, to any
-third party. In the event of such a termination, the Licensee shall immediately destroy all copies and
-ensure that all backup copies are destroyed as well.
-
-Stiftung SIC may at any time stop granting free licenses of the SOFTWARE in combination with the
-MOA modules without prior notice. In this case, all licenses granted until that time remain valid, i.e.
-allow the licensee to continue using the SOFTWARE in combination with the unmodified MOA
-modules.
-
-7. LIABILITY:
-To the maximum extent allowed by applicable law Stiftung SIC shall not be liable for any damages
-whatsoever (including, without limitation, damages for loss of business profits, business interruption,
-loss of business information, or other pecuniary loss) arising out of the use of or inability to use the
-SOFTWARE, even if Stiftung SIC has been advised of the possibility of such damages.
-
-8. WAIVER:
-Invalidity, on legal grounds, of any term of this Agreement does not render the Agreement as a whole
-invalid.
-
-9. GOVERNING LAW, ARBITRATION:
-This Agreement is governed by Austrian law.
diff --git a/licenses/SIC_LICENSE.txt b/licenses/SIC_LICENSE.txt
deleted file mode 100644
index 5452d915..00000000
--- a/licenses/SIC_LICENSE.txt
+++ /dev/null
@@ -1,197 +0,0 @@
-License for Open Source Projects
-
-Stiftung SIC Java Crypto-Software Development Kit Licence Agreement for
-Free Licenses Valid from February 19, 2010, amended May 13, 2011
-
-The Stiftung SIC (Stiftung Secure Information and Communication
-Technologies, Inffeldgasse16a, A-8010 Graz, Austria / Europe) hereafter
-referred to as "Stiftung SIC" offers to grant licences for the SOFTWARE
-defined below according to the following conditions:
-
-1. DEFINITIONS
-
-a. "LICENSEE" refers to the person, organisation or company, to whom the
-licenses are granted under this license agreement.
-
-b. The term "SOFTWARE" refers to IAIK Java Crypto Software in any form
-(source code, object code or other) including documentation. The
-SOFTWARE is the sole property of Stiftung SIC and protected by Austrian,
-International Copyright Law, e.g. the Revised Berne Convention, and the
-US Copyright Act.
-
-c. "IAIK Java Crypto Software" means either IAIK-JCE, iSaSiLk or any
-other Java-based Crypto-Software development kit which usually consists
-of source code (if applicable; for source licences only), Java byte code
-or any other form of object code. The Software and additional tools are
-distributed in documentation, manuals, user guides, sample application
-code, tools - including any revisions, patches and updates delivered or
-downloaded by the LICENSEE.
-
-d. "IAIK Java Crypto Software Runtime Modules" means the runtime object
-code modules provided with, or derived from, an IAIK-Java-Crypto
-Software Development Kit, which are usually distributed as a
-Java-Archive in JAR or ZIP-Format, or in any other format suitable for
-use by application programmes or other software.
-
-e. "IAIK-Crypto Software based Application" means any computer programme
-created by the LICENSEE using any of the IAIK-Toolkits, with the
-exception of server software, which is considered as a different
-category.
-
-f. "Server software" means IAIK-Crypto Software based applications run
-or published on a server (like but not limited to a web server).
-Examples for server software are applets, midlets, servlets, CGI-scripts
-or software that is run on a server.
-
-g. "To publish" means that an application is retrievable or accessible
-from a certain server, but not installed on another machine.
-
-h. "DERIVED SOFTWARE" refers to software (excluding any of our SOFTWARE)
-in any form (source code, object code or other) that uses the IAIK Java
-Crypto Software Runtime Modules. It also includes parts where LICENSEE
-acts as a licensor or sub-licensor.
-
-i. “Open Source Software Development” means development under an
-ACCEPTED LICENSE.
-
-j. "ACCEPTED LICENSE" means the following licenses:
-
-j1. GPL Version 2, June 1991 (http: //www.fsf.org/licenses/gpl.html).
-
-j2. European Union Public License (EUPL) Version 1.1, January 2009
-(http://www.osor.eu/eupl) - for distribution under compatible licenses
-defined in the licenses above or under any other license, the LICENSEE
-needs explicit permission by Stiftung SIC.
-
-2. GRANTING of LICENCES Stiftung SIC grants free licenses of the
-SOFTWARE for development of free of charge open source software. The
-SOFTWARE may be distributed bundled with the free of charge open source
-software in binary form only. The type of open source development is
-generally unrestricted; the only exception is a product that contains or
-is an API or a service of which most of the functionality is provided by
-the SOFTWARE. The derived product must not offer features that are
-similar to that of the SOFTWARE. This means, this license does not allow
-developing a product that contains or is a wrapper around the SOFTWARE.
-
-The LICENSEE and his licensees are granted a non-exclusive,
-non-transferable license to run and redistribute the IAIK Java Crypto
-Software Runtime Modules in unmodified, binary form under the following
-conditions.
-
- * The LICENSEE and his licensees are not permitted to charge any
- royalties or fees for DERIVED SOFTWARE.
-
- * The LICENSEE of "IAIK Java Crypto Software Runtime Modules", has to
- make the source code of his product publicly available under an
- ACCEPTED LICENSE.
-
- * The LICENSEE is further hereby obliged and authorized to bind his
- licensees to all these conditions.
-
-If LICENSEE licenses DERIVED SOFTWARE under any other free software
-licensing scheme that is similar to an ACCEPTED LICENSE, it may be
-possible to grant a free license. Stiftung SIC will decide on this
-individually after inspecting the intended use and license conditions.
-
-This free license shall NOT be construed or otherwise interpreted as any
-kind of express or implied representation that this SOFTWARE is
-licensable under an ACCEPTED LICENSE or any free license other than the
-one laid out in this document.
-
-3. LIMITATIONS for all LICENCES: LICENSEES must not attempt to reverse
-engineer, decompile, disassemble, reverse, translate or in any other
-manner decode the computer programmes in the IAIK-Toolkit in order to
-derive the source code there from.
-
-ATTENTION: THIS LICENSE AGREEMENT DOES NOT INCLUDE LICENSING OF THE
-INCLUDED ALGORITHMS, when appropriate. Please see
-http://jce.iaik.tugraz.at/sic/sales/patent_issues_algorithms for a
-summary of the licence/patent status situation of algorithms used in
-IAIK-JCE. It is the sole responsibility of LICENSEES to ensure the
-legality of using the IAIK-Crypto software in their countries. Stiftung
-SIC declares that to the best of its knowledge all parts of the
-IAIK-Toolkits have been developed by Austrian citizens, except for the
-HTTP implementation (w3c_http.jar) delivered with the iSaSiLk
-distribution and free third party libraries (like Apache Xalan or
-Xerces) that may be delivered with the toolkits for convenience. The
-implementation of the Camellia cipher algorithm core has been provided
-by NTT (Nippon Telegraph and Telephone Corporation) under BSD licence
-terms
-(see http://jce.iaik.tugraz.at/sic/sales/patent_issues_algorithms).
-
-4. TERMS of LICENSE: Free licenses for development of free of charge
-open source software under ACCEPTED LICENSES are perpetual. Stiftung SIC
-has no obligation to continue making free updates or new versions
-available for LICENSEE
-
-5. DELIVERY: Free licenses are made available by download only.
-
-6. WARRANTY: Stiftung SIC guarantees that the SOFTWARE is free of any
-computer virus or other malicious hidden routines that would
-intentionally cause damage to or corrupt data, storage media or
-equipment.
-
-The SOFTWARE is provided "as is" and except for the declaration and
-warranty stated in this Section, Stiftung SIC makes no representations,
-conditions or warranties, either express or implied, relative to the
-IAIK-Toolkit or services provided hereunder, including all implied
-conditions or warranties of merchantability and fitness for a particular
-purpose and all conditions with respect to intellectual property
-infringement.
-
-7. PROPRIETARY INFORMATION and CONFIDENTIALITY: The LICENSEE
-acknowledges that the SOFTWARE remains the property of, and is
-confidential to, Stiftung SIC and incorporates trade secrets of Stiftung
-SIC, and that Stiftung SIC shall have the exclusive right to any
-copyrights or patents in respect of the SOFTWARE. The LICENSEE agrees to
-maintain the confidentiality of the SOFTWARE. The LICENSEE further
-agrees that (with the exception of paragraph 2 above), he shall not make
-any disclosure of the SOFTWARE (including copies thereof or methods or
-concepts utilised therein) to any person or entity, other than employees
-of the LICENSEE, to whom such disclosure is necessary in order to use
-the SOFTWARE as provided herein. The LICENSEE shall appropriately notify
-each employee to whom any such disclosure is made. Such disclosure must
-be made in confidence and shall be kept in confidence by the employee in
-question. The LICENSEE agrees to use diligent and determined efforts to
-secure and protect the SOFTWARE and copies thereof in a manner
-consistent with their proprietary character and the maintenance of
-LICENSOR`s rights therein, and without limitation thereof, to take
-appropriate action, by instruction or agreement with its employees who
-are permitted access to the SOFTWARE or copies thereof, or otherwise, to
-satisfy its obligations as hereby stated.
-
-8. TERMINATION: Stiftung SIC may terminate this Agreement without prior
-notice, if the LICENSEE 1. neglects or fails to perform or observe, or
-correct a breach of its obligations to Stiftung SIC; 2. goes out of
-business, files a bankruptcy petition or has such a petition filed
-involuntarily against it or becomes insolvent; 3. develops, sells,
-licenses or distributes or attempts to develop, sell, license or
-distribute any software based on the IAIK-Toolkit which is outside the
-scope of the limited rights granted herein, to any third party. In the
-event of such a termination, the LICENSEE shall immediately delete all
-electronic versions from his systems and ensure that all backup copies
-are destroyed as well.
-
-9. LIABILITY: To the maximum extent allowed by applicable law Stiftung
-SIC shall not be liable for any damages whatsoever (including, without
-limitation, damages for loss of business profits, business interruption,
-loss of business information, or other pecuniary loss) arising out of
-the use of or inability to use the IAIK-Toolkit, even if Stiftung SIC
-has been advised of the possibility of such damages.
-
-10. EXPORT RESTRICTIONS: In some countries, the IAIK-Toolkits may be
-subject to export and import restrictions. Their re-export may require
-the approval of the competent authorities. The LICENSEE shall be liable
-for the observance of any control regulation and explicitly agrees to
-hold Stiftung SIC fully harmless.
-
-11. WAIVER: Invalidity, on legal grounds, of any term of this Agreement
-does not render the Agreement as a whole invalid.
-
-12. SURVIVAL: Irrespective of expiration or termination of this
-Agreement, the provisions of Articles 2, 4, and 8 shall survive the
-termination or the expiry of this Agreement.
-
-13. GOVERNING LAW, ARBITRATION: This Agreement is governed by Austrian
-law.
-
diff --git a/modules/authmodule-eIDAS-v2/checks/spotbugs-exclude.xml b/modules/authmodule-eIDAS-v2/checks/spotbugs-exclude.xml
index d961b4d6..9b12a750 100644
--- a/modules/authmodule-eIDAS-v2/checks/spotbugs-exclude.xml
+++ b/modules/authmodule-eIDAS-v2/checks/spotbugs-exclude.xml
@@ -14,6 +14,12 @@
</Match>
<Match>
<!-- CSFR protection is implemented by pendingRequestId that is an one-time token -->
+ <Class name="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller.IdAustriaClientAuthSignalController" />
+ <Method name="performAuthentication" />
+ <Bug pattern="SPRING_CSRF_UNRESTRICTED_REQUEST_MAPPING" />
+ </Match>
+ <Match>
+ <!-- CSFR protection is implemented by pendingRequestId that is an one-time token -->
<Class name="at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasSignalServlet" />
<Method name="restoreEidasAuthProcess" />
<Bug pattern="SPRING_CSRF_UNRESTRICTED_REQUEST_MAPPING" />
@@ -27,7 +33,7 @@
<Match>
<!-- Redirect URL is only loaded from configuration -->
<Class name="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask" />
- <Method name="execute" />
+ <Method name="sendRedirect" />
<Bug pattern="UNVALIDATED_REDIRECT" />
</Match>
<Match>
diff --git a/modules/authmodule-eIDAS-v2/pom.xml b/modules/authmodule-eIDAS-v2/pom.xml
index 105d16f0..2cb8d82e 100644
--- a/modules/authmodule-eIDAS-v2/pom.xml
+++ b/modules/authmodule-eIDAS-v2/pom.xml
@@ -6,7 +6,7 @@
<parent>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>modules</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<groupId>at.asitplus.eidas.ms_specific.modules</groupId>
<artifactId>authmodule-eIDAS-v2</artifactId>
@@ -50,6 +50,15 @@
<artifactId>eaaf-core</artifactId>
</dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_sp</artifactId>
+ </dependency>
+
<!-- eIDAS reference implemenation libs -->
<dependency>
<groupId>eu.eidas</groupId>
@@ -83,6 +92,16 @@
<!-- other third party libs -->
<dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-actuator</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
@@ -118,12 +137,25 @@
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
-
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.openapitools</groupId>
+ <artifactId>jackson-databind-nullable</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>io.swagger.parser.v3</groupId>
+ <artifactId>swagger-parser</artifactId>
+ </dependency>
+
<dependency>
<groupId>org.bitbucket.b_c</groupId>
<artifactId>jose4j</artifactId>
</dependency>
-
+
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
@@ -141,14 +173,28 @@
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
-
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.github.skjolber</groupId>
+ <artifactId>mockito-soap-cxf</artifactId>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>core_common_lib</artifactId>
<scope>test</scope>
<type>test-jar</type>
</dependency>
-
+
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf_core_utils</artifactId>
@@ -163,22 +209,23 @@
</dependency>
<dependency>
- <groupId>com.github.skjolber</groupId>
- <artifactId>mockito-soap-cxf</artifactId>
- <scope>test</scope>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
+ <scope>test</scope>
+ <type>test-jar</type>
</dependency>
<dependency>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-module-junit4</artifactId>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_idp</artifactId>
<scope>test</scope>
+ <type>test-jar</type>
</dependency>
<dependency>
- <groupId>org.powermock</groupId>
- <artifactId>powermock-api-mockito2</artifactId>
+ <groupId>com.squareup.okhttp3</groupId>
+ <artifactId>mockwebserver</artifactId>
<scope>test</scope>
</dependency>
-
</dependencies>
<build>
@@ -189,6 +236,9 @@
<resource>
<directory>target/generated-sources/cxf</directory>
</resource>
+ <resource>
+ <directory>target/generated-sources/swagger</directory>
+ </resource>
</resources>
<plugins>
@@ -222,17 +272,37 @@
</dependencies>
<executions>
<execution>
- <id>generate-sources</id>
+ <id>generate-sources-soap</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
- <wsdl>${basedir}/src/main/resources/szr_client/SZR_v4.0.wsdl</wsdl>
+ <wsdl>${basedir}/src/main/resources/wsdl/szr_client/SZR_v4.0.wsdl</wsdl>
<extraargs>
<extraarg>-verbose </extraarg>
</extraargs>
</wsdlOption>
+ <wsdlOption>
+ <wsdl>${basedir}/src/main/resources/wsdl/zmr_client/wsdl/Service.wsdl</wsdl>
+ <extraargs>
+ <extraarg>-verbose </extraarg>
+ </extraargs>
+ </wsdlOption>
+
+ <!--use custom package name for search address Web-Service,
+ because ZMR and address Web-Service use the same XML namespace but defines different schema. -->
+ <wsdlOption>
+ <wsdl>${basedir}/src/main/resources/wsdl/addresssearching_client/wsdl/Service.wsdl</wsdl>
+ <extraargs>
+ <extraarg>-verbose </extraarg>
+ </extraargs>
+ <packagenames>
+ <packagename>http://bmi.gv.at/namespace/zmr-su/base/20040201#=at.gv.bmi.namespace.zmr_su.base._20040201_.address</packagename>
+ <packagename>http://bmi.gv.at/namespace/zmr-su/zmr/20040201#=at.gv.bmi.namespace.zmr_su.zrm._20040201_.address</packagename>
+ </packagenames>
+ </wsdlOption>
+
</wsdlOptions>
</configuration>
<goals>
@@ -241,7 +311,40 @@
</execution>
</executions>
</plugin>
-
+
+ <plugin>
+ <groupId>org.openapitools</groupId>
+ <artifactId>openapi-generator-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate-sources-json</id>
+ <phase>generate-sources</phase>
+ <configuration>
+ <skip>false</skip>
+ <skipOverwrite>false</skipOverwrite>
+ <inputSpec>${project.basedir}/src/main/resources/wsdl/ernp_client/openapi.json</inputSpec>
+ <generatorName>java</generatorName>
+ <output>${project.build.directory}/generated/swagger</output>
+ <apiPackage>at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.api</apiPackage>
+ <modelPackage>at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model</modelPackage>
+ <invokerPackage>at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.invoker</invokerPackage>
+ <configOptions>
+ <configPackage>at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp</configPackage>
+ <delegatePattern>true</delegatePattern>
+ <basePackage>at.asitplus.eidas.specific.modules.auth.eidas.v2</basePackage>
+ <java8>true</java8>
+ <dateLibrary>java8</dateLibrary>
+ <serializationLibrary>jackson</serializationLibrary>
+ <library>resttemplate</library>
+ </configOptions>
+ </configuration>
+ <goals>
+ <goal>generate</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
@@ -263,14 +366,16 @@
<goal>report</goal>
</goals>
<configuration>
- <haltOnFailure>true</haltOnFailure>
+ <haltOnFailure>false</haltOnFailure>
<excludes>
<exclude>**/at/gv/e_government/reference/namespace/persondata/_20020228/*</exclude>
<exclude>**/org/w3/_2000/_09/*</exclude>
<exclude>**/org/w3/_2001/_04/*</exclude>
<exclude>**/szrservices/*</exclude>
- <exclude>**/generated/cxf/*</exclude>
- </excludes>
+ <exclude>**/generated/cxf/*</exclude>
+ <exclude>**at/gv/bmi/namespace/*</exclude>
+ <exclude>**at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/ernp/*</exclude>
+ </excludes>
</configuration>
</execution>
</executions>
@@ -292,4 +397,4 @@
</plugin>
</plugins>
</build>
-</project> \ No newline at end of file
+</project>
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
index 40b953b1..588ea912 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
@@ -27,11 +27,32 @@ import at.gv.egiz.eaaf.core.api.data.EaafConstants;
public class Constants {
+ //TODO: should we make it configurable?
+ public static final String MATCHING_INTERNAL_BPK_TARGET = EaafConstants.URN_PREFIX_CDID + "ZP";
+
+ public static final String ERRORCODE_00 = "module.eidasauth.00";
+
public static final String DATA_REQUESTERID = "req_requesterId";
public static final String DATA_PROVIDERNAME = "req_providerName";
public static final String DATA_REQUESTED_LOA_LIST = "req_requestedLoA";
public static final String DATA_REQUESTED_LOA_COMPERISON = "req_requestedLoAComperision";
public static final String DATA_FULL_EIDAS_RESPONSE = "resp_fulleIDASResponse";
+ public static final String DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE = "resp_fulleIDASResponseAlternative";
+
+ /**
+ * Stored before Step 2 from Matching Concept, input from user eIDAS authn.
+ */
+ public static final String DATA_SIMPLE_EIDAS = "matching_simple_eidas_data";
+
+ /**
+ * Stored intermediate mathing results where matching is still on-going.
+ */
+ public static final String DATA_INTERMEDIATE_RESULT = "matching_intermediate_result";
+
+ /**
+ * Stored after Step 8 from Matching Concept, results from search in registers with MDS.
+ */
+ public static final String DATA_PERSON_MATCH_RESULT = "matching_result";
// templates for post-binding forwarding
public static final String TEMPLATE_POST_FORWARD_NAME = "eidas_node_forward.html";
@@ -43,10 +64,10 @@ public class Constants {
public static final String CONIG_PROPS_EIDAS_PREFIX = "auth.eIDAS";
public static final String CONIG_PROPS_EIDAS_WORKAROUND_STAGING_MS_CONNECTOR =
- CONIG_PROPS_EIDAS_PREFIX + ".workarounds.staging.msconnector.endpoint";
+ CONIG_PROPS_EIDAS_PREFIX + ".workarounds.staging.msconnector.endpoint";
+ public static final String CONIG_PROPS_EIDAS_IS_TEST_IDENTITY =
+ CONIG_PROPS_EIDAS_PREFIX + ".eid.testidentity.default";
- public static final String CONIG_PROPS_EIDAS_IS_TEST_IDENTITY = CONIG_PROPS_EIDAS_PREFIX
- + ".eid.testidentity.default";
public static final String CONIG_PROPS_EIDAS_NODE = CONIG_PROPS_EIDAS_PREFIX + ".node_v2";
public static final String CONIG_PROPS_EIDAS_NODE_COUNTRYCODE = CONIG_PROPS_EIDAS_NODE + ".countrycode";
public static final String CONIG_PROPS_EIDAS_NODE_PUBLICSECTOR_TARGETS = CONIG_PROPS_EIDAS_NODE
@@ -62,20 +83,20 @@ public class Constants {
CONIG_PROPS_EIDAS_NODE + ".attributes.requested.{0}.onlynatural";
public static final String CONIG_PROPS_EIDAS_NODE_ATTRIBUTES_REQUESTED_REPRESENTATION =
CONIG_PROPS_EIDAS_NODE + ".attributes.requested.representation";
-
+
public static final String CONIG_PROPS_EIDAS_NODE_REQUESTERID_USE_HASHED_VERSION =
CONIG_PROPS_EIDAS_NODE + ".requesterId.useHashedForm";
public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_USE_STATIC_REQUESTERID_FOR_LUX =
CONIG_PROPS_EIDAS_NODE + ".requesterId.lu.useStaticRequesterForAll";
-
+
public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_ADD_ALWAYS_PROVIDERNAME =
- CONIG_PROPS_EIDAS_NODE + ".workarounds.addAlwaysProviderName";
+ CONIG_PROPS_EIDAS_NODE + ".workarounds.addAlwaysProviderName";
public static final String CONIG_PROPS_EIDAS_NODE_WORKAROUND_USEREQUESTIDASTRANSACTIONIDENTIFIER =
CONIG_PROPS_EIDAS_NODE + ".workarounds.useRequestIdAsTransactionIdentifier";
-
- public static final String CONFIG_PROP_EIDAS_NODE_NAMEIDFORMAT =
+
+ public static final String CONFIG_PROP_EIDAS_NODE_NAMEIDFORMAT =
CONIG_PROPS_EIDAS_NODE + ".requested.nameIdFormat";
-
+
public static final String CONIG_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = CONIG_PROPS_EIDAS_NODE
+ ".staticProviderNameForPublicSPs";
public static final String DEFAULT_PROPS_EIDAS_NODE_STATIC_PROVIDERNAME_FOR_PUBLIC_SP = "Austria";
@@ -83,6 +104,104 @@ public class Constants {
public static final String FORWARD_METHOD_POST = "POST";
public static final String FORWARD_METHOD_GET = "GET";
+
+ // Common SSL client configuration
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT = CONIG_PROPS_EIDAS_PREFIX + ".client.common";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEYSTORE_PATH = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.keyStore.path";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEYSTORE_PASSWORD = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.keyStore.password";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEYSTORE_TYPE = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.keyStore.type";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEYSTORE_NAME = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.keyStore.name";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEYS_ALIAS = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.key.alias";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_KEY_PASSWORD = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.key.password";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_TRUSTSTORE_PATH = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.trustStore.path";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_TRUSTSTORE_PASSWORD = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.trustStore.password";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_TRUSTSTORE_TYPE = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.trustStore.type";
+ public static final String CONIG_PROPS_EIDAS_COMMON_CLIENT_SSL_TRUSTSTORE_NAME = CONIG_PROPS_EIDAS_COMMON_CLIENT
+ + ".ssl.trustStore.name";
+
+
+ // ZMR Client configuration properties
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT = CONIG_PROPS_EIDAS_PREFIX + ".zmrclient";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_ENDPOINT = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".endpoint";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_DEBUG_TRACEMESSAGES = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".debug.logfullmessages";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_CONNECTION = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".timeout.connection";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_RESPONSE = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".timeout.response";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_ORGANIZATION_NR = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".req.organisation.behoerdennr";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_UPDATE_REASON_CODE = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".req.update.reason.code";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_UPDATE_REASON_TEXT = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".req.update.reason.text";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PATH = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.keyStore.path";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PASSWORD = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.keyStore.password";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_TYPE = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.keyStore.type";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_NAME = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.keyStore.name";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYS_ALIAS = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.key.alias";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEY_PASSWORD = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.key.password";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PATH = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.trustStore.path";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PASSWORD = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.trustStore.password";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_TYPE = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.trustStore.type";
+ public static final String CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_NAME = CONIG_PROPS_EIDAS_ZMRCLIENT
+ + ".ssl.trustStore.name";
+
+ // ErnP Client configuration properties
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT = CONIG_PROPS_EIDAS_PREFIX + ".ernpclient";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_ENDPOINT = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".endpoint";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_PATH = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.keyStore.path";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_PASSWORD = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.keyStore.password";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_TYPE = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.keyStore.type";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_NAME = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.keyStore.name";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYS_ALIAS = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.key.alias";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEY_PASSWORD = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.key.password";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_TRUSTSTORE_PATH = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.trustStore.path";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_TRUSTSTORE_PASSWORD = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.trustStore.password";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_TRUSTSTORE_TYPE = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.trustStore.type";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_TRUSTSTORE_NAME = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".ssl.trustStore.name";
+
+
+
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_TIMEOUT_CONNECTION = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".timeout.connection";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_TIMEOUT_RESPONSE = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".timeout.response";
+ public static final String CONIG_PROPS_EIDAS_ERNPCLIENT_REQ_ORGANIZATION_NR = CONIG_PROPS_EIDAS_ERNPCLIENT
+ + ".req.organisation.behoerdennr";
+
+
+ // SZR Client configuration properties
public static final String CONIG_PROPS_EIDAS_SZRCLIENT = CONIG_PROPS_EIDAS_PREFIX + ".szrclient";
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_USETESTSERVICE = CONIG_PROPS_EIDAS_SZRCLIENT
+ ".useTestService";
@@ -104,10 +223,22 @@ public class Constants {
+ ".ssl.keyStore.path";
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_PASSWORD = CONIG_PROPS_EIDAS_SZRCLIENT
+ ".ssl.keyStore.password";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_TYPE = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.keyStore.type";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_NAME = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.keyStore.name";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYS_ALIAS = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.key.alias";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEY_PASSWORD = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.key.password";
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PATH = CONIG_PROPS_EIDAS_SZRCLIENT
+ ".ssl.trustStore.path";
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PASSWORD = CONIG_PROPS_EIDAS_SZRCLIENT
+ ".ssl.trustStore.password";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_TYPE = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.trustStore.type";
+ public static final String CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_NAME = CONIG_PROPS_EIDAS_SZRCLIENT
+ + ".ssl.trustStore.name";
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_EDOCUMENTTYPE = CONIG_PROPS_EIDAS_SZRCLIENT
+ ".params.documenttype";
@@ -137,10 +268,6 @@ public class Constants {
@Deprecated
public static final String CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_SQLLITEDATASTORE_ACTIVE =
CONIG_PROPS_EIDAS_SZRCLIENT + ".workarounds.datastore.sqlite.active";
-
- public static final String CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_IDA_VSZ_IDL =
- CONIG_PROPS_EIDAS_SZRCLIENT + ".workarounds.use.getidentitylink.for.ida";
-
// http endpoint descriptions
public static final String eIDAS_HTTP_ENDPOINT_SP_POST = "/eidas/light/sp/post";
@@ -159,13 +286,33 @@ public class Constants {
public static final String eIDAS_ATTR_PLACEOFBIRTH = "PlaceOfBirth";
public static final String eIDAS_ATTR_BIRTHNAME = "BirthName";
public static final String eIDAS_ATTR_CURRENTADDRESS = "CurrentAddress";
+ public static final String eIDAS_ATTR_TAXREFERENCE = "TaxReference";
public static final String eIDAS_ATTR_LEGALPERSONIDENTIFIER = "LegalPersonIdentifier";
public static final String eIDAS_ATTR_LEGALNAME = "LegalName";
+
+ //eIDAS attribute URN
+ public static final String eIDAS_ATTRURN_PREFIX = "http://eidas.europa.eu/attributes/";
+ public static final String eIDAS_ATTRURN_PREFIX_NATURAL = eIDAS_ATTRURN_PREFIX + "naturalperson/";
+
+ public static final String eIDAS_ATTRURN_PERSONALIDENTIFIER =
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_PERSONALIDENTIFIER;
+ public static final String eIDAS_ATTRURN_CURRENTGIVENNAME =
+ eIDAS_ATTRURN_PREFIX_NATURAL + "CurrentGivenName";
+ public static final String eIDAS_ATTRURN_CURRENTFAMILYNAME =
+ eIDAS_ATTRURN_PREFIX_NATURAL + "CurrentFamilyName";
+ public static final String eIDAS_ATTRURN_DATEOFBIRTH =
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_DATEOFBIRTH;
+ public static final String eIDAS_ATTRURN_PLACEOFBIRTH =
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_PLACEOFBIRTH;
+ public static final String eIDAS_ATTRURN_BIRTHNAME =
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_BIRTHNAME;
+
+
public static final String eIDAS_REQ_PARAM_SECTOR_PUBLIC = "public";
public static final String eIDAS_REQ_PARAM_SECTOR_PRIVATE = "private";
-
+
public static final String POLICY_DEFAULT_ALLOWED_TARGETS =
EaafConstants.URN_PREFIX_CDID.replaceAll("\\.", "\\\\.").replaceAll("\\+", "\\\\+") + ".*";
@@ -178,8 +325,10 @@ public class Constants {
public static final String SZR_SCHEMA_LOCATIONS =
"urn:SZRServices" + " " + "/szr_client/szr.xsd";
- // Default values for SZR communication
+ // Default values for SZR / ZMR / ERnP communication
public static final String SZR_CONSTANTS_DEFAULT_DOCUMENT_TYPE = "ELEKTR_DOKUMENT";
+ public static final String CLIENT_INFO = "eIDAS MS-Connector v{0}";
+
// TODO remove!!!
public static final String SZR_CONSTANTS_DEFAULT_ISSUING_DATE = "2014-01-01";
@@ -189,4 +338,59 @@ public class Constants {
"AJZyj/+sdCMDRq9RkvbFcgSTVn/OfS8EUE81ddwP8MNuJ1kd1SWBUJPaQX2JLJHrL54mkOhrkhH2M/zcuOTu8nW9TOEg"
+ "XGjrRB/0HpiYKpV+VDJViyyc/GacNLxN4Anw4pima6gHYaJIw9hQkL/nuO2hyh8PGJd7rxeFXJmbLy+X";
+ public static final String COUNTRY_CODE_DE = "DE";
+ public static final String COUNTRY_CODE_IT = "IT";
+
+
+ // UI options
+ public static final String HTML_FORM_CREATE_NEW_ERNP_ENTRY = "createNewErnpEntry";
+ public static final String HTML_FORM_ADVANCED_MATCHING_FAILED = "advancedMatchingFailed";
+ public static final String HTML_FORM_ADVANCED_MATCHING_FAILED_REASON =
+ HTML_FORM_ADVANCED_MATCHING_FAILED + "Reason";
+
+
+ // ProcessEngine context
+ public static final String CONTEXT_FLAG_ADVANCED_MATCHING_FAILED = HTML_FORM_ADVANCED_MATCHING_FAILED;
+ public static final String CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON =
+ HTML_FORM_ADVANCED_MATCHING_FAILED_REASON;
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateNewErnpEntryTask}.
+ */
+ public static final String TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK = "TASK_CreateNewErnpEntryTask";
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateOtherLoginMethodGuiTask}.
+ */
+ public static final String TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK =
+ "TASK_GenerateOtherLoginMethodGuiTask";
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAustrianResidenceGuiTask}.
+ */
+ public static final String TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK =
+ "TASK_GenerateAustrianResidenceGuiTask";
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateNewErnpEntryTask}.
+ */
+ public static final String TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK = "TASK_RequestingNewErnpEntryTask";
+
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateMobilePhoneSignatureRequestTask}.
+ */
+ public static final String TRANSITION_TO_GENERATE_MOBILE_PHONE_SIGNATURE_REQUEST_TASK =
+ "TASK_GenerateMobilePhoneSignatureRequestTask";
+
+ /**
+ * {@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask}.
+ */
+ public static final String TRANSITION_TO_GENERATE_EIDAS_LOGIN = "TASK_GenerateAlternativeEidasAuthn";
+
+
+ /**
+ * Stores login selection from user.
+ */
+ public static final String REQ_SELECTED_LOGIN_METHOD_PARAMETER = "loginSelection";
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasAuthenticationSpringResourceProvider.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasAuthenticationSpringResourceProvider.java
index 535e4f97..e5b10185 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasAuthenticationSpringResourceProvider.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/EidasAuthenticationSpringResourceProvider.java
@@ -45,8 +45,10 @@ public class EidasAuthenticationSpringResourceProvider implements SpringResource
public Resource[] getResourcesToLoad() {
final ClassPathResource eidasAuthConfig = new ClassPathResource("/eidas_v2_auth.beans.xml",
EidasAuthenticationSpringResourceProvider.class);
-
- return new Resource[] { eidasAuthConfig };
+ final ClassPathResource eidasRefImplConfig = new ClassPathResource("/eidas_v2_auth_ref_impl_config.beans.xml",
+ EidasAuthenticationSpringResourceProvider.class);
+
+ return new Resource[] { eidasRefImplConfig, eidasAuthConfig };
}
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java
new file mode 100644
index 00000000..a039881c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/AbstractSoapClient.java
@@ -0,0 +1,199 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients;
+
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.handler.Handler;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.configuration.jsse.TLSClientParameters;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.jaxws.DispatchImpl;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.LoggingHandler;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+import at.gv.egiz.eaaf.core.impl.http.HttpUtils;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class AbstractSoapClient {
+
+ @Autowired
+ protected IConfiguration basicConfig;
+ @Autowired
+ EaafKeyStoreFactory keyStoreFactory;
+
+ @Builder
+ @Getter
+ public static class HttpClientConfig {
+
+ private final String clientName;
+
+ private final String clientUrl;
+ private final String clientType;
+
+ private final String connectionTimeout;
+ private final String responseTimeout;
+
+ private final KeyStoreConfiguration keyStoreConfig;
+ private final String keyAlias;
+ private final String keyPassword;
+
+ private final KeyStoreConfiguration trustStoreConfig;
+
+ @Builder.Default
+ private final boolean trustAll = false;
+
+ }
+
+ /**
+ * Build a validated KeyStore Configuration-Object from configuration keys.
+ *
+ * @param keyStoreTypeKey Configuration key for type
+ * @param keyStorePathKey Configuration key for path
+ * @param keyStorePasswordKey Configuration key for password
+ * @param keyStoreNameKey Configuration key for name
+ * @param friendlyName Friendlyname for logging and errorhandling
+ * @return Valid KeyStore configuration or <code>null</code> if no type was
+ * defined
+ * @throws EaafConfigurationException In case of validation error
+ */
+ @Nullable
+ protected KeyStoreConfiguration buildKeyStoreConfiguration(String keyStoreTypeKey, String keyStorePathKey,
+ String keyStorePasswordKey, String keyStoreNameKey, String friendlyName)
+ throws EaafConfigurationException {
+ if (StringUtils.isNotEmpty(basicConfig.getBasicConfiguration(keyStoreTypeKey))) {
+ log.debug("Starting configuration of: {} ... ", friendlyName);
+ final KeyStoreConfiguration config = new KeyStoreConfiguration();
+ config.setFriendlyName(friendlyName);
+ config.setKeyStoreType(basicConfig.getBasicConfiguration(keyStoreTypeKey, KeyStoreType.PKCS12.name()));
+ config.setKeyStoreName(basicConfig.getBasicConfiguration(keyStoreNameKey));
+ config.setSoftKeyStoreFilePath(basicConfig.getBasicConfiguration(keyStorePathKey));
+ config.setSoftKeyStorePassword(basicConfig.getBasicConfiguration(keyStorePasswordKey));
+
+ // validate keystore configuration
+ config.validate();
+
+ return config;
+
+ } else {
+ log.info("Skipping configuration of: {}", friendlyName);
+ return null;
+
+ }
+
+ }
+
+ protected void injectHttpClient(Object raw, HttpClientConfig config) {
+ // extract client from implementation
+ Client client;
+ if (raw instanceof DispatchImpl<?>) {
+ client = ((DispatchImpl<?>) raw).getClient();
+ } else if (raw instanceof Client) {
+ client = ClientProxy.getClient(raw);
+ } else {
+ throw new RuntimeException("SOAP Client for SZR connection is of UNSUPPORTED type: " + raw.getClass()
+ .getName());
+ }
+
+ // set basic connection policies
+ final HTTPConduit http = (HTTPConduit) client.getConduit();
+
+ // set timeout policy
+ final HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
+ httpClientPolicy.setConnectionTimeout(Integer.parseInt(config.getConnectionTimeout()) * 1000L);
+ httpClientPolicy.setReceiveTimeout(Integer.parseInt(config.getResponseTimeout()) * 1000L);
+ http.setClient(httpClientPolicy);
+
+ // inject SSL context in case of https
+ if (config.getClientUrl().toLowerCase().startsWith("https")) {
+ try {
+ log.debug("Adding SSLContext to client: " + config.getClientType() + " ... ");
+
+ final TLSClientParameters tlsParams = new TLSClientParameters();
+ if (config.getKeyStoreConfig() != null) {
+ final SSLContext sslContext = HttpUtils.buildSslContextWithSslClientAuthentication(
+ keyStoreFactory.buildNewKeyStore(config.getKeyStoreConfig()),
+ config.getKeyAlias(),
+ config.getKeyPassword(),
+ loadTrustStore(config.getTrustStoreConfig(), config.getClientName()),
+ config.isTrustAll(),
+ config.getClientName());
+ tlsParams.setSSLSocketFactory(sslContext.getSocketFactory());
+
+ } else {
+ log.debug(
+ "No KeyStore for SSL Client Auth. found. Initializing SSLContext for: {} without authentication ... ",
+ config.getClientName());
+ tlsParams.setSSLSocketFactory(SSLContextBuilder.create().build().getSocketFactory());
+
+ }
+
+ http.setTlsClientParameters(tlsParams);
+ log.info("SSLContext initialized for client: " + config.getClientType());
+
+ } catch (EaafException | KeyManagementException | NoSuchAlgorithmException e) {
+ log.error("SSLContext initialization FAILED.", e);
+ throw new RuntimeException("SSLContext initialization FAILED.", e);
+
+ }
+ }
+ }
+
+ private Pair<KeyStore, Provider> loadTrustStore(KeyStoreConfiguration trustStoreConfig, String friendlyName)
+ throws EaafException {
+ if (trustStoreConfig != null) {
+ log.info("Build custom SSL truststore for: {}", friendlyName);
+ return keyStoreFactory.buildNewKeyStore(trustStoreConfig);
+
+ } else {
+ log.info("Use default SSL truststore for: {}", friendlyName);
+ return null;
+
+ }
+
+ }
+
+ protected void injectBindingProvider(BindingProvider bindingProvider, String clientType, String szrUrl,
+ boolean enableTraceLogging) {
+ final Map<String, Object> requestContext = bindingProvider.getRequestContext();
+ requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, szrUrl);
+
+ log.trace("Adding JAX-WS request/response trace handler to client: " + clientType);
+ List<Handler> handlerList = bindingProvider.getBinding().getHandlerChain();
+ if (handlerList == null) {
+ handlerList = new ArrayList<>();
+ bindingProvider.getBinding().setHandlerChain(handlerList);
+
+ }
+
+ // add logging handler to trace messages if required
+ if (enableTraceLogging) {
+ final LoggingHandler loggingHandler = new LoggingHandler();
+ handlerList.add(loggingHandler);
+
+ }
+ bindingProvider.getBinding().setHandlerChain(handlerList);
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java
new file mode 100644
index 00000000..6a732a0d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/ErnpRestClient.java
@@ -0,0 +1,857 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp;
+
+import java.io.IOException;
+import java.text.MessageFormat;
+import java.time.LocalDate;
+import java.time.OffsetDateTime;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.PostConstruct;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.client.HttpClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.ClientHttpResponse;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+import org.springframework.web.client.ResponseErrorHandler;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData.SimpleEidasDataBuilder;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.api.DefaultApi;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.invoker.ApiClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Aendern;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.AendernResponse;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Anlegen;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.AnlegenResponse;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Eidas;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.PartialDate;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Person;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.PersonAendern;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.PersonAnlegen;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.PersonSuchen;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Personendaten;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.PersonendatenErgebnis;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.SuchEidas;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Suchdaten;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.SuchenResponse;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Suchoptionen;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ernp.model.Suchoptionen.HistorischEnum;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ErnpRestCommunicationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.VersionHolder;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServiceFault;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.exceptions.EaafAuthenticationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory;
+import at.gv.egiz.eaaf.core.impl.http.HttpClientConfiguration;
+import at.gv.egiz.eaaf.core.impl.http.HttpClientConfiguration.ClientAuthMode;
+import at.gv.egiz.eaaf.core.impl.http.IHttpClientFactory;
+import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Implements an ERnP client that uses REST API for communication.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class ErnpRestClient implements IErnpClient {
+
+ private static final String ERROR_MATCHING_11 = "module.eidasauth.matching.11";
+ //private static final String ERROR_MATCHING_12 = "module.eidasauth.matching.12";
+ private static final String ERROR_MATCHING_99 = "module.eidasauth.matching.99";
+
+ private static final String LOGMSG_MISSING_CONFIG = "Missing configuration with key: {0}";
+ private static final String LOGMSG_ERNP_ERROR =
+ "Receive an error from ERnP during '{}' operation with msg: {}";
+ private static final String LOGMSG_ERNP_RESP_PROCESS =
+ "Proces ERnP response during '{}' operation failes with msg: {}";
+
+ //private static final String LOGMSG_ERNP_REST_ERROR =
+ // "ERnP anwser for transaction: {0} with code: {1} and message: {2}";
+
+ private static final String PROCESS_SEARCH_PERSONAL_IDENTIFIER =
+ "Searching " + Constants.eIDAS_ATTR_PERSONALIDENTIFIER;
+ private static final String PROCESS_SEARCH_MDS_ONLY = "Searching with MDS only";
+ private static final String PROCESS_SEARCH_COUNTRY_SPECIFIC = "Searching {0} specific";
+
+ private static final String PROCESS_KITT_GENERAL = "KITT general-processing";
+ private static final String PROCESS_KITT_IDENITIES_GET = "KITT get-latest-version";
+ private static final String PROCESS_KITT_IDENITIES_UPDATE = "KITT update dataset";
+ private static final String PROCESS_ADD_IDENITY = "Add new person";
+
+ private static final String FRIENDLYNAME_HTTP_CLIENT = "ERnP Client";
+
+ // HTTP header-names from ERnP response
+ private static final String ERNP_RESPONSE_HEADER_SERVER_ID = "Server-Request-Id";
+
+
+ @Autowired
+ IConfiguration basicConfig;
+ @Autowired
+ EaafKeyStoreFactory keyStoreFactory;
+ @Autowired
+ IHttpClientFactory httpClientFactory;
+ @Autowired
+ VersionHolder versionHolder;
+
+ private DefaultApi ernpClient;
+
+ @Override
+ public ErnpRegisterResult searchWithPersonIdentifier(String personIdentifier, String citizenCountryCode)
+ throws EidasSAuthenticationException {
+ try {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepId");
+
+ // build search request
+ final SuchEidas eidasInfos = new SuchEidas();
+ eidasInfos.setArt(Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER);
+ eidasInfos.setWert(personIdentifier);
+ eidasInfos.setStaatscode2(citizenCountryCode);
+
+ final PersonSuchen personSuchen = new PersonSuchen();
+ personSuchen.setSuchoptionen(generateSearchParameters());
+ personSuchen.setBegruendung(PROCESS_SEARCH_PERSONAL_IDENTIFIER);
+ final Suchdaten searchInfos = new Suchdaten();
+ searchInfos.setEidas(Arrays.asList(eidasInfos));
+ personSuchen.setSuchdaten(searchInfos);
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", PROCESS_SEARCH_PERSONAL_IDENTIFIER);
+ final SuchenResponse resp = ernpClient.suchen(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), personSuchen);
+
+ // parse ZMR response
+ return processErnpResponse(resp, citizenCountryCode, true, PROCESS_SEARCH_PERSONAL_IDENTIFIER);
+
+ } catch (RestClientException e) {
+ log.warn(LOGMSG_ERNP_ERROR, PROCESS_SEARCH_PERSONAL_IDENTIFIER, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_SEARCH_PERSONAL_IDENTIFIER, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+ }
+
+ }
+
+ @Override
+ public ErnpRegisterResult searchWithMds(String givenName, String familyName, String dateOfBirth,
+ String citizenCountryCode) throws EidasSAuthenticationException {
+ try {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepMDS");
+
+ // build search request
+ final Suchdaten searchInfos = new Suchdaten();
+ searchInfos.setFamilienname(familyName);
+ searchInfos.setVorname(givenName);
+ searchInfos.setGeburtsdatum(buildErnpBirthday(dateOfBirth));
+
+ final PersonSuchen personSuchen = new PersonSuchen();
+ personSuchen.setSuchoptionen(generateSearchParameters());
+ personSuchen.setBegruendung(PROCESS_SEARCH_MDS_ONLY);
+ personSuchen.setSuchdaten(searchInfos);
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", PROCESS_SEARCH_MDS_ONLY);
+ final SuchenResponse resp = ernpClient.suchen(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), personSuchen);
+
+ // parse ZMR response
+ return processErnpResponse(resp, citizenCountryCode, false, PROCESS_SEARCH_MDS_ONLY);
+
+ } catch (RestClientException e) {
+ log.warn(LOGMSG_ERNP_ERROR, PROCESS_SEARCH_MDS_ONLY, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_SEARCH_MDS_ONLY, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+ }
+ }
+
+ @Override
+ public ErnpRegisterResult searchCountrySpecific(PersonSuchenRequest personSearchDao,
+ String citizenCountryCode) throws EidasSAuthenticationException {
+ String countrySearchMsg = MessageFormat.format(PROCESS_SEARCH_COUNTRY_SPECIFIC, citizenCountryCode);
+
+ try {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepCC");
+
+ // build search request
+ final PersonSuchen personSuchen = new PersonSuchen();
+ personSuchen.setSuchoptionen(generateSearchParameters());
+ personSuchen.setBegruendung(countrySearchMsg);
+ personSuchen.setSuchdaten(mapCountrySpecificSearchData(personSearchDao));
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", countrySearchMsg);
+ final SuchenResponse resp = ernpClient.suchen(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), personSuchen);
+
+ // parse ZMR response
+ return processErnpResponse(resp, citizenCountryCode, true, countrySearchMsg);
+
+ } catch (RestClientException e) {
+ log.warn(LOGMSG_ERNP_ERROR, countrySearchMsg, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ERNP_RESP_PROCESS, countrySearchMsg, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ public ErnpRegisterResult update(RegisterResult registerResult, SimpleEidasData eidData)
+ throws EidasSAuthenticationException {
+ try {
+ //search person with register result, because update needs information from search response
+ Person ernpPersonToKitt = searchPersonForUpdate(registerResult);
+
+ // select elements that have to be updated
+ Collection<? extends Eidas> eidasDocumentToAdd =
+ selectEidasDocumentsToAdd(ernpPersonToKitt, eidData);
+ SimpleEidasData mdsToUpdate = selectMdsInformationToUpdate(ernpPersonToKitt, eidData);
+
+ if (eidasDocumentToAdd.isEmpty() && mdsToUpdate == null) {
+ log.info("Find no eIDAS document or MDS for update during: {}. Nothing todo on ERnP side",
+ PROCESS_KITT_GENERAL);
+ return new ErnpRegisterResult(Arrays.asList(registerResult));
+
+ } else {
+ log.info("Find #{} eIDAS documents for update during: {}", eidasDocumentToAdd.size(), PROCESS_KITT_GENERAL);
+
+ // update entry based on selected update info's and results from search response
+ return updatePersonInErnp(ernpPersonToKitt, eidasDocumentToAdd, mdsToUpdate, eidData.getCitizenCountryCode());
+
+ }
+
+ } catch (RestClientException e) {
+ log.warn(LOGMSG_ERNP_ERROR, PROCESS_KITT_GENERAL, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_KITT_GENERAL, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ public ErnpRegisterResult add(SimpleEidasData eidData) throws EidasSAuthenticationException {
+ try {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepNew");
+
+ // build update request
+ PersonAnlegen ernpReq = new PersonAnlegen();
+ ernpReq.setBegruendung(PROCESS_ADD_IDENITY);
+
+ // inject person data
+ Personendaten person = new Personendaten();
+ person.setFamilienname(eidData.getFamilyName());
+ person.setVorname(eidData.getGivenName());
+ person.setGeburtsdatum(buildErnpBirthday(eidData.getDateOfBirth()));
+ ernpReq.setPersonendaten(person);
+
+ buildNewEidasDocumens(ernpReq, eidData);
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", PROCESS_ADD_IDENITY);
+ AnlegenResponse ernpResp = ernpClient.anlegen(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq);
+ log.trace("Receive response from ERnP for '{}' operation", PROCESS_ADD_IDENITY);
+
+ return new ErnpRegisterResult(Arrays.asList(
+ mapErnpResponseToRegisterResult(ernpResp.getPerson(), eidData.getCitizenCountryCode())));
+
+ } catch (RestClientException e) {
+ log.warn(LOGMSG_ERNP_ERROR, PROCESS_ADD_IDENITY, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_11, new Object[] { e.getMessage() }, e);
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ERNP_RESP_PROCESS, PROCESS_ADD_IDENITY, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ public ErnpRegisterResult searchWithResidenceData(String givenName, String familyName, String dateOfBirth,
+ String zipcode, String city, String street) {
+ log.warn("Matching with residence information is prohibited by design! This requests will be ignored");
+ return new ErnpRegisterResult(Collections.emptyList());
+
+ }
+
+ @PostConstruct
+ private void initialize() throws EaafException {
+ // validate additional Ernp communication parameters
+ valdiateAdditionalConfigParameters();
+
+ // set-up the Ernp client
+ final ApiClient baseClient = new ApiClient(buildRestClient());
+ baseClient.setBasePath(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_ENDPOINT));
+ ernpClient = new DefaultApi(baseClient);
+
+ }
+
+ private void valdiateAdditionalConfigParameters() {
+ checkConfigurationValue(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_ENDPOINT);
+ checkConfigurationValue(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_REQ_ORGANIZATION_NR);
+
+ }
+
+ private void checkConfigurationValue(String key) {
+ if (StringUtils.isEmpty(basicConfig.getBasicConfiguration(key))) {
+ throw new RuntimeException(MessageFormat.format(LOGMSG_MISSING_CONFIG, key));
+
+ }
+ }
+
+ private Suchoptionen generateSearchParameters() {
+ final Suchoptionen options = new Suchoptionen();
+ options.setZmr(false);
+ options.setHistorisch(HistorischEnum.AKTUELLUNDHISTORISCH);
+ options.setSucheMitNamensteilen(false);
+ options.setSuchwizard(false);
+ return options;
+
+ }
+
+ @Nonnull
+ private ErnpRegisterResult processErnpResponse(SuchenResponse resp, @Nonnull String citizenCountryCode,
+ boolean forceSinglePersonMatch, @Nonnull String processStepFiendlyname)
+ throws EaafAuthenticationException {
+ if (resp.getPerson() == null
+ || resp.getPerson().isEmpty()) {
+ log.debug("ERnP result contains NO 'Person' or 'Person' is empty");
+ return new ErnpRegisterResult(Collections.emptyList());
+
+ } else {
+ log.debug("Get #{} person results from '{}' operation",
+ resp.getPerson().size(), processStepFiendlyname);
+
+ if (forceSinglePersonMatch) {
+ return new ErnpRegisterResult(processSearchPersonResponseSingleResult(
+ resp.getPerson(), citizenCountryCode, processStepFiendlyname));
+
+ } else {
+ return new ErnpRegisterResult(processSearchPersonResponse(
+ resp.getPerson(), citizenCountryCode));
+
+ }
+ }
+ }
+
+ @Nonnull
+ private List<RegisterResult> processSearchPersonResponse(
+ @Nonnull List<Person> list,
+ @Nonnull String citizenCountryCode) throws EaafAuthenticationException {
+ return list.stream()
+ .map(el -> mapErnpResponseToRegisterResult(el, citizenCountryCode))
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+
+ }
+
+ @NonNull
+ private List<RegisterResult> processSearchPersonResponseSingleResult(
+ @Nonnull List<Person> persons,
+ @Nonnull String citizenCountryCode, String processStepFiendlyname) throws EaafAuthenticationException {
+ if (persons.size() > 1) {
+ log.error("Find more-than-one ERnP entry with search criteria that has to be unique");
+ throw new WorkflowException(processStepFiendlyname,
+ "Find more-than-one ERnP entry with search criteria that has to be unique", true);
+
+ } else {
+ return Arrays.asList(mapErnpResponseToRegisterResult(persons.get(0), citizenCountryCode));
+
+ }
+ }
+
+ @Nonnull
+ private RegisterResult mapErnpResponseToRegisterResult(@Nonnull Person person,
+ @Nonnull String citizenCountryCode) {
+ // build result
+ return RegisterResult.builder()
+ .pseudonym(selectAllEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER))
+ .familyName(person.getPersonendaten().getFamilienname())
+ .givenName(person.getPersonendaten().getVorname())
+ .dateOfBirth(getTextualBirthday(person.getPersonendaten().getGeburtsdatum()))
+ .bpk(person.getPersonendaten().getBpkZp())
+ .placeOfBirth(selectSingleEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH))
+ .birthName(selectSingleEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_BIRTHNAME))
+ .build();
+
+ }
+
+ private Suchdaten mapCountrySpecificSearchData(PersonSuchenRequest personSearchDao) {
+ final Suchdaten searchInfos = new Suchdaten();
+ searchInfos.setFamilienname(personSearchDao.getNatuerlichePerson().getPersonenName().getFamilienname());
+ searchInfos.setVorname(personSearchDao.getNatuerlichePerson().getPersonenName().getVorname());
+ searchInfos.setGeburtsdatum(buildErnpBirthday(personSearchDao.getNatuerlichePerson().getGeburtsdatum()));
+
+ // map all eIDAS documents into ERnP format
+ searchInfos.setEidas(personSearchDao.getEidasSuchdaten().stream()
+ .map(el -> buildErnpEidasDocument(el))
+ .collect(Collectors.toList()));
+
+ return searchInfos;
+
+ }
+
+ private ErnpRegisterResult updatePersonInErnp(Person ernpPersonToKitt,
+ Collection<? extends Eidas> eidasDocumentToAdd, SimpleEidasData mdsToUpdate, String citizenCountryCode)
+ throws ServiceFault {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepKittUpdate");
+
+ // build update request
+ PersonAendern ernpReq = new PersonAendern();
+ ernpReq.setBegruendung(PROCESS_KITT_IDENITIES_UPDATE);
+
+ // set reference elements for person update
+ ernpReq.setEntityId(ernpPersonToKitt.getEntityId());
+ ernpReq.setVersion(ernpPersonToKitt.getVersion());
+
+ // add new eIDAS attributes
+ if (!eidasDocumentToAdd.isEmpty()) {
+ log.debug("Find eIDAS Documents to update. Injection update entries into ERnP request ... ");
+ ernpReq.setAnlegen(new Anlegen());
+ eidasDocumentToAdd.stream().forEach(el -> ernpReq.getAnlegen().addEidasItem(el));
+
+ }
+
+ // update MDS if required
+ if (mdsToUpdate != null) {
+ log.debug("Find MDS to update. Injection update entries into ERnP request ... ");
+ ernpReq.setAendern(generateMdsChangeRequest(ernpPersonToKitt, mdsToUpdate));
+
+ }
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE);
+ AendernResponse ernpResp = ernpClient.aendern(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), ernpReq);
+ log.trace("Receive response from ERnP for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE);
+
+ return new ErnpRegisterResult(Arrays.asList(
+ mapErnpResponseToRegisterResult(ernpResp.getPerson(), citizenCountryCode)));
+
+ }
+
+ private Collection<? extends Eidas> selectEidasDocumentsToAdd(
+ Person ernpPersonToKitt, SimpleEidasData eidData) {
+
+ //TODO: maybe we should re-factor SimpleEidasData to a generic data-model to facilitate arbitrary eIDAS attributes
+ Set<Eidas> result = new HashSet<>();
+ addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym(), true);
+ addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth(), false);
+ addEidasDocumentIfNotAvailable(result, ernpPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName(), false);
+
+ return result;
+
+ }
+
+ private void addEidasDocumentIfNotAvailable(Set<Eidas> result,
+ Person ernpPersonToKitt, String citizenCountryCode,
+ String attrName, String attrValue, boolean allowMoreThanOneEntry) {
+
+ if (StringUtils.isEmpty(attrValue)) {
+ log.trace("No eIDAS document: {}. Nothing todo for KITT process ... ", attrName);
+ return;
+
+ }
+
+ // check if eIDAS attribute is already includes an eIDAS-Document
+ boolean alreadyExist = ernpPersonToKitt.getEidas().stream()
+ .filter(el -> el.getWert().equals(attrValue)
+ && el.getArt().equals(attrName)
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .findAny()
+ .isPresent();
+
+ if (!alreadyExist) {
+ // check eIDAS documents already contains a document with this pair of country-code and attribute-name
+ Optional<Eidas> oneDocWithNameExists = ernpPersonToKitt.getEidas().stream()
+ .filter(el -> el.getStaatscode2().equals(citizenCountryCode)
+ && el.getArt().equals(attrName))
+ .findAny();
+
+ if (!allowMoreThanOneEntry && oneDocWithNameExists.isPresent()
+ && !oneDocWithNameExists.get().getWert().equals(attrValue)) {
+ log.warn("eIDAS document: {} already exists for country: {} but attribute-value does not match. "
+ + "Skip update process because no multi-value allowed for this ... ",
+ attrName, citizenCountryCode);
+
+ } else {
+
+ Eidas eidasDocToAdd = new Eidas();
+ eidasDocToAdd.setStaatscode2(citizenCountryCode);
+ eidasDocToAdd.setArt(attrName);
+ eidasDocToAdd.setWert(attrValue);
+ log.info("Add eIDAS document: {} for country: {} to ERnP person", attrName, citizenCountryCode);
+ result.add(eidasDocToAdd);
+
+ }
+
+ } else {
+ log.debug("eIDAS document: {} already exists for country: {}. Skip update process for this ... ",
+ attrName, citizenCountryCode);
+
+ }
+ }
+
+ private Person searchPersonForUpdate(RegisterResult registerResult) throws WorkflowException {
+ // build generic request metadata
+ final GenericRequestParams generic = buildGenericRequestParameters("stepKittSearch");
+
+ // build search request
+ final Suchdaten searchInfos = new Suchdaten();
+ searchInfos.setBpkZp(registerResult.getBpk());
+ searchInfos.setFamilienname(registerResult.getFamilyName());
+ searchInfos.setVorname(registerResult.getGivenName());
+ searchInfos.setGeburtsdatum(buildErnpBirthday(registerResult.getDateOfBirth()));
+
+ final PersonSuchen personSuchen = new PersonSuchen();
+ personSuchen.setSuchoptionen(generateSearchParameters());
+ personSuchen.setBegruendung(PROCESS_KITT_IDENITIES_GET);
+ personSuchen.setSuchdaten(searchInfos);
+
+ // request ERnP
+ log.trace("Requesting ERnP for '{}' operation", PROCESS_KITT_IDENITIES_GET);
+ final SuchenResponse resp = ernpClient.suchen(generic.getClientBehkz(), generic.clientName,
+ generic.getClientRequestTime(), generic.getClientRequestId(), personSuchen);
+
+ // perform shot validation of ERnP response
+ if (resp.getPerson() == null || resp.getPerson().size() != 1) {
+ log.error("ERnP result contains NO 'Person' or 'Person' is empty");
+ throw new WorkflowException(PROCESS_KITT_IDENITIES_GET,
+ "Find NO data-set with already matchted eID during ERnP KITT process");
+
+ } else {
+ log.debug("Find person for '{}' operation", PROCESS_KITT_IDENITIES_GET);
+ return resp.getPerson().get(0);
+
+ }
+ }
+
+ private void buildNewEidasDocumens(PersonAnlegen ernpReq, SimpleEidasData eidData) {
+ ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym()));
+
+ if (StringUtils.isNotEmpty(eidData.getPlaceOfBirth())) {
+ ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth()));
+
+ }
+
+ if (StringUtils.isNotEmpty(eidData.getBirthName())) {
+ ernpReq.addEidasItem(buildNewEidasDocument(eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName()));
+
+ }
+ }
+
+ private Eidas buildNewEidasDocument(String citizenCountryCode, String eidasAttrName,
+ String eidasAddrValue) {
+ Eidas el = new Eidas();
+ el.setArt(eidasAttrName);
+ el.setWert(eidasAddrValue);
+ el.setStaatscode2(citizenCountryCode);
+ return el;
+ }
+
+ private SimpleEidasData selectMdsInformationToUpdate(Person ernpPersonToKitt, SimpleEidasData eidData) {
+ PersonendatenErgebnis person = ernpPersonToKitt.getPersonendaten();
+ SimpleEidasDataBuilder builder = SimpleEidasData.builder()
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth());
+
+ boolean findMatch = person.getVorname().equals(eidData.getGivenName())
+ && person.getFamilienname().equals(eidData.getFamilyName())
+ && getTextualBirthday(person.getGeburtsdatum()).equals(eidData.getDateOfBirth());
+ return findMatch ? null : builder.build();
+
+ }
+
+ private Aendern generateMdsChangeRequest(Person ernpPersonToKitt, SimpleEidasData mdsToUpdate) {
+ Aendern el = new Aendern();
+ Personendaten person = new Personendaten();
+ person.setEntityId(ernpPersonToKitt.getPersonendaten().getEntityId());
+ el.setPersonendaten(person);
+ person.setFamilienname(mdsToUpdate.getFamilyName());
+ person.setVorname(mdsToUpdate.getGivenName());
+ person.setGeburtsdatum(buildErnpBirthday(mdsToUpdate.getDateOfBirth()));
+ return el;
+
+ }
+
+ /**
+ * Map an AT specific Date String 'yyyy-MM-dd' to ERnP birthday representation.
+ *
+ * <p>
+ * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also
+ * a valid birthday.
+ * </p>
+ *
+ * @param dateOfBirth in 'yyyy-MM-dd' format
+ * @return ERnP birthday representation
+ */
+ private PartialDate buildErnpBirthday(String dateOfBirth) {
+ String[] elements = dateOfBirth.split("-");
+ Assert.isTrue(elements.length == 3, "Find invalid dateOfBirth element: " + dateOfBirth);
+
+ PartialDate result = new PartialDate();
+ result.setJahr(Integer.valueOf(elements[0]));
+ result.setMonat(Integer.valueOf(elements[1]));
+ result.setTag(Integer.valueOf(elements[2]));
+ return result;
+
+ }
+
+ /**
+ * Map eIDAS search-data from ZMR model into ERnP model.
+ *
+ * @param daten eIDAS document as ZMR model
+ * @return the same eIDAS document as an ERnP model
+ */
+ private SuchEidas buildErnpEidasDocument(EidasSuchdatenType daten) {
+ return new SuchEidas()
+ .art(daten.getEidasArt())
+ .wert(daten.getEidasWert())
+ .staatscode2(daten.getStaatscode2());
+ }
+
+
+ /**
+ * Build AT specific Date String 'yyyy-MM-dd' from ERnP birthday representation.
+ *
+ * <p>
+ * <b>Info:</b> {@link LocalDate} can not be used, because '1940-00-00' is also
+ * a valid birthday on ERnP site.
+ * </p>
+ *
+ * @param geburtsdatum ERnP birthday representation
+ * @return birthday in 'yyyy-MM-dd' format
+ */
+ private String getTextualBirthday(PartialDate geburtsdatum) {
+ return MessageFormat.format("{0}-{1}-{2}",
+ String.valueOf(geburtsdatum.getJahr()),
+ String.format("%02d", geburtsdatum.getMonat()),
+ String.format("%02d", geburtsdatum.getTag()));
+
+ }
+
+
+ /**
+ * Get all eIDAS document with the specified country code and document type.
+ *
+ * @param person Person information from ERnP
+ * @param citizenCountryCode Country code of the eIDAS attribute
+ * @param eidasAttrurnPersonalidentifier eIDAS attribute identifier
+ * @return {@link List} of eIDAS attribute values or an empty list if's not
+ * found
+ */
+ @NonNull
+ private List<String> selectAllEidasDocument(Person person, String citizenCountryCode,
+ String eidasAttrurnPersonalidentifier) {
+ if (person.getEidas() != null) {
+ return person.getEidas().stream()
+ .filter(el -> eidasAttrurnPersonalidentifier.equals(el.getArt())
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .map(el -> el.getWert())
+ .collect(Collectors.toList());
+
+ } else {
+ return Collections.emptyList();
+
+ }
+
+ }
+
+ /**
+ * Get the first eIDAS document with the specified country code and document
+ * type.
+ *
+ * @param person Person information from ERnP
+ * @param citizenCountryCode Country code of the eIDAS attribute
+ * @param eidasAttrurnPersonalidentifier eIDAS attribute identifier
+ * @return Value of this eIDAS attribute or <code>null</code> if's not found
+ */
+ @Nullable
+ private String selectSingleEidasDocument(Person person, String citizenCountryCode,
+ String eidasAttrurnPersonalidentifier) {
+ if (person.getEidas() != null) {
+ return person.getEidas().stream()
+ .filter(el -> eidasAttrurnPersonalidentifier.equals(el.getArt())
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .findFirst()
+ .map(el -> el.getWert())
+ .orElse(null);
+
+ } else {
+ return null;
+
+ }
+ }
+
+ private RestTemplate buildRestClient() throws EaafException {
+ log.debug("Building REST-Client for ERnP communication ... ");
+ final HttpClient httpClient = httpClientFactory.getHttpClient(buildHttpClientConfiguration());
+ final ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
+ final RestTemplate springClient = new RestTemplate(requestFactory);
+ springClient.setErrorHandler(buildErrorHandler());
+ springClient.getMessageConverters().add(0, buildCustomJacksonObjectMapper());
+ return springClient;
+
+ }
+
+ private HttpMessageConverter<?> buildCustomJacksonObjectMapper() {
+ final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+ converter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
+ converter.getObjectMapper().setSerializationInclusion(Include.NON_NULL);
+
+ converter.getObjectMapper().registerModule(new JavaTimeModule());
+ converter.getObjectMapper().configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ return converter;
+
+ }
+
+ @Nonnull
+ private ResponseErrorHandler buildErrorHandler() {
+ return new ResponseErrorHandler() {
+
+ @Override
+ public boolean hasError(ClientHttpResponse response) throws IOException {
+ return response.getStatusCode().is4xxClientError()
+ || response.getStatusCode().is5xxServerError();
+
+ }
+
+ @Override
+ public void handleError(ClientHttpResponse response) throws IOException {
+ // TODO: opimize errorHandling based on response info's from real ERnP
+
+ List<String> serverId = response.getHeaders().getOrEmpty(ERNP_RESPONSE_HEADER_SERVER_ID);
+ log.warn("Receive http-error: {} from ERnP with serverTransactionId {}",
+ response.getRawStatusCode(), serverId.isEmpty() ? "'not set'" : serverId.get(0));
+ log.warn(" Full ERnP response-body: {}", IOUtils.toString(response.getBody(), "UTF-8"));
+ throw new ErnpRestCommunicationException(response.getRawStatusCode());
+
+ }
+ };
+ }
+
+ @Nonnull
+ private HttpClientConfiguration buildHttpClientConfiguration() throws EaafException {
+ final HttpClientConfiguration config = new HttpClientConfiguration(FRIENDLYNAME_HTTP_CLIENT);
+ config.setAuthMode(ClientAuthMode.SSL.getMode());
+
+ // Set keystore configuration
+ config.buildKeyStoreConfig(
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_TYPE),
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_PATH),
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_PASSWORD),
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYSTORE_NAME));
+
+ // Set key information
+ config.setSslKeyAlias(
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEYS_ALIAS));
+ config.setSslKeyPassword(
+ basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ERNPCLIENT_SSL_KEY_PASSWORD));
+
+ // Set connection parameters
+ // TODO: update EAAF-components to allow custom HTTP Connection-Timeouts
+
+ return config;
+ }
+
+ @AllArgsConstructor
+ @Getter
+ public static class ErnpRegisterResult {
+ private final List<RegisterResult> personResult;
+
+ }
+
+ private GenericRequestParams buildGenericRequestParameters(String operationIdentifier) {
+ return GenericRequestParams.builder()
+ .clientBehkz(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_ORGANIZATION_NR))
+ .clientName(MessageFormat.format(Constants.CLIENT_INFO, versionHolder.getVersion()))
+ .clientRequestTime(OffsetDateTime.now())
+ .clientRequestId(TransactionIdUtils.getTransactionId() + "_" + operationIdentifier)
+ .build();
+
+ }
+
+ @Builder
+ @Getter
+ private static class GenericRequestParams {
+ String clientBehkz;
+ String clientName;
+ OffsetDateTime clientRequestTime;
+ String clientRequestId;
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/IErnpClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/IErnpClient.java
new file mode 100644
index 00000000..7a957531
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/ernp/IErnpClient.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp;
+
+import javax.annotation.Nonnull;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+public interface IErnpClient {
+
+ /**
+ * Search person based on eIDAS personal identifier.
+ *
+ * @param personIdentifier Full eIDAS personal identifier with prefix
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ErnpRegisterResult searchWithPersonIdentifier(@Nonnull String personIdentifier,
+ @Nonnull String citizenCountryCode) throws EidasSAuthenticationException;
+
+ /**
+ * Search person based on eIDSA MDS information.
+ *
+ * @param givenName eIDAS given name
+ * @param familyName eIDAS principle name
+ * @param dateOfBirth eIDAS date-of-birth
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ErnpRegisterResult searchWithMds(@Nonnull String givenName, @Nonnull String familyName,
+ @Nonnull String dateOfBirth, @Nonnull String citizenCountryCode)
+ throws EidasSAuthenticationException;
+
+ /**
+ * Search person based on country-specific natural person set.
+ *
+ * @param personSearchDao Specific set of natural person informations.
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ErnpRegisterResult searchCountrySpecific(@Nonnull PersonSuchenRequest personSearchDao,
+ @Nonnull String citizenCountryCode) throws EidasSAuthenticationException;
+
+ /**
+ * Update ERnP entry to KITT existing ERnP identity with this eIDAS authentication.
+ *
+ * @param registerResult Already matched eIDAS identity that should be KITT
+ * @param eidData eIDAS eID information from current authentication process
+ * @return Update result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ErnpRegisterResult update(RegisterResult registerResult, SimpleEidasData eidData)
+ throws EidasSAuthenticationException;
+
+
+ /**
+ * Add new entry into ERnP by using identity from this eIDAS authentication.
+ *
+ * @param eidData eIDAS eID information from current authentication process
+ * @return Update result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ErnpRegisterResult add(SimpleEidasData eidData) throws EidasSAuthenticationException;
+
+
+ /**
+ * Search person based on address information.
+ *
+ * @param givenName eIDAS given name
+ * @param familyName eIDAS principle name
+ * @param dateOfBirth eIDAS date-of-birth
+ * @param zipcode ZipCode
+ * @param city City
+ * @param street Street
+ * @return Search result but never <code>null</code>
+ */
+ @Nonnull
+ ErnpRegisterResult searchWithResidenceData(String givenName, String familyName,
+ String dateOfBirth, String zipcode, String city, String street);
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrClient.java
new file mode 100644
index 00000000..8c294c97
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrClient.java
@@ -0,0 +1,479 @@
+/*
+ * Copyright 2018 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.xml.XMLConstants;
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.Marshaller;
+import javax.xml.namespace.QName;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Dispatch;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.xpath.XPathAPI;
+import org.springframework.stereotype.Service;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.AbstractSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.AbstractSoapClient.HttpClientConfig.HttpClientConfigBuilder;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
+import at.gv.e_government.reference.namespace.persondata._20020228.AlternativeNameType;
+import at.gv.e_government.reference.namespace.persondata._20020228.IdentificationType;
+import at.gv.e_government.reference.namespace.persondata._20020228.PersonNameType;
+import at.gv.e_government.reference.namespace.persondata._20020228.PhysicalPersonType;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
+import at.gv.egiz.eaaf.core.api.data.XmlNamespaceConstants;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
+import lombok.extern.slf4j.Slf4j;
+import szrservices.GetBPK;
+import szrservices.GetBPKResponse;
+import szrservices.GetIdentityLinkEidas;
+import szrservices.GetIdentityLinkEidasResponse;
+import szrservices.IdentityLinkType;
+import szrservices.JwsHeaderParam;
+import szrservices.ObjectFactory;
+import szrservices.PersonInfoType;
+import szrservices.SZR;
+import szrservices.SZRException_Exception;
+import szrservices.SignContent;
+import szrservices.SignContentEntry;
+import szrservices.SignContentResponseType;
+import szrservices.TravelDocumentType;
+
+
+@Slf4j
+@Service("SZRClientForeIDAS")
+public class SzrClient extends AbstractSoapClient {
+
+ private static final String CLIENT_DEFAULT = "DefaultClient";
+ private static final String CLIENT_RAW = "RawClient";
+
+ private static final String ATTR_NAME_VSZ = "urn:eidgvat:attributes.vsz.value";
+ private static final String ATTR_NAME_PUBKEYS = "urn:eidgvat:attributes.user.pubkeys";
+ private static final String ATTR_NAME_STATUS = "urn:eidgvat:attributes.eid.status";
+ private static final String KEY_BC_BIND = "bcBindReq";
+ private static final String JOSE_HEADER_USERCERTPINNING_TYPE = "urn:at.gv.eid:bindtype";
+ private static final String JOSE_HEADER_USERCERTPINNING_EIDASBIND = "urn:at.gv.eid:eidasBind";
+ public static final String ATTR_NAME_MDS = "urn:eidgvat:mds";
+
+ // client for anything, without identitylink
+ private SZR szr = null;
+
+ // RAW client is needed for identitylink
+ private Dispatch<Source> dispatch = null;
+
+ final ObjectMapper mapper = new ObjectMapper();
+
+
+ /**
+ * Get IdentityLink of a person.
+ *
+ *
+ * @param matchedPersonData eID information of an already matched person.
+ * @return IdentityLink
+ * @throws SzrCommunicationException In case of a SZR error
+ */
+ public IdentityLinkType getIdentityLinkInRawMode(MatchedPersonResult matchedPersonData)
+ throws SzrCommunicationException {
+ try {
+ final GetIdentityLinkEidas getIdl = new GetIdentityLinkEidas();
+ getIdl.setPersonInfo(generateSzrRequest(matchedPersonData));
+
+ return getIdentityLinkGeneric(getIdl);
+
+ } catch (final Exception e) {
+ log.warn("SZR communication FAILED for operation: {} Reason: {}",
+ "GetIdentityLinkEidas", e.getMessage(), e);
+ throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
+
+ }
+ }
+
+ /**
+ * Get bPK of person.
+ *
+ *
+ * @param eidData Minimum dataset of person
+ * @param target requested bPK target
+ * @param vkz Verfahrenskennzeichen
+ * @return bPK for this person
+ * @throws SzrCommunicationException In case of a SZR error
+ */
+ public List<String> getBpk(SimpleEidasData eidData, String target, String vkz)
+ throws SzrCommunicationException {
+ try {
+ final GetBPK parameters = new GetBPK();
+ parameters.setPersonInfo(generateSzrRequest(eidData));
+ parameters.getBereichsKennung().add(target);
+ parameters.setVKZ(vkz);
+ final GetBPKResponse result = this.szr.getBPK(parameters);
+
+ return result.getGetBPKReturn();
+
+ } catch (final SZRException_Exception e) {
+ log.warn("SZR communication FAILED for operation: {} Reason: {}",
+ "GetBPK", e.getMessage(), e);
+ throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
+
+ }
+
+ }
+
+ /**
+ * Request a encrypted baseId from SZR.
+ *
+ * @param matchedPersonData eID information of an already matched person.
+ * @return encrypted baseId
+ * @throws SzrCommunicationException In case of a SZR error
+ */
+ public String getEncryptedStammzahl(MatchedPersonResult matchedPersonData) throws SzrCommunicationException {
+ final String resp;
+ try {
+ resp = this.szr.getStammzahlEncrypted(generateSzrRequest(matchedPersonData), false);
+
+ } catch (SZRException_Exception e) {
+ throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
+
+ }
+
+ if (StringUtils.isEmpty(resp)) {
+ throw new SzrCommunicationException("ernb.01", new Object[]{"Stammzahl response empty"}); // TODO error handling
+
+ }
+
+ return resp;
+ }
+
+ /**
+ * Sign an eidasBind data-structure that combines vsz with user's pubKey and E-ID status.
+ *
+ * @param vsz encrypted baseId
+ * @param bindingPubKey binding PublicKey as PKCS1# (ASN.1) container
+ * @param eidStatus Status of the E-ID
+ * @param eidData eID information that was used for ERnP registration
+ * @return bPK for this person
+ * @throws SzrCommunicationException In case of a SZR error
+ */
+ public String getEidasBind(final String vsz, final String bindingPubKey, final String eidStatus,
+ SimpleEidasData eidData)throws SzrCommunicationException {
+
+ final Map<String, Object> eidsaBindMap = new HashMap<>();
+ eidsaBindMap.put(ATTR_NAME_VSZ, vsz);
+ eidsaBindMap.put(ATTR_NAME_STATUS, eidStatus);
+ eidsaBindMap.put(ATTR_NAME_PUBKEYS, Collections.singletonList(bindingPubKey));
+ eidsaBindMap.put(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, eidData.getCitizenCountryCode());
+ injectMdsIfAvailableAndActive(eidsaBindMap, eidData);
+
+ try {
+ final String serializedEidasBind = mapper.writeValueAsString(eidsaBindMap);
+ final SignContent req = new SignContent();
+ final SignContentEntry eidasBindInfo = new SignContentEntry();
+ eidasBindInfo.setKey(KEY_BC_BIND);
+ eidasBindInfo.setValue(serializedEidasBind);
+ req.getIn().add(eidasBindInfo);
+ req.setAppendCert(false);
+ final JwsHeaderParam eidasBindJoseHeader = new JwsHeaderParam();
+ eidasBindJoseHeader.setKey(JOSE_HEADER_USERCERTPINNING_TYPE);
+ eidasBindJoseHeader.setValue(JOSE_HEADER_USERCERTPINNING_EIDASBIND);
+ req.getJWSHeaderParam().add(eidasBindJoseHeader);
+
+ log.trace("Requesting SZR to sign bcBind datastructure ... ");
+ final SignContentResponseType resp = szr.signContent(req.isAppendCert(), req.getJWSHeaderParam(), req.getIn());
+ log.trace("Receive SZR response on bcBind siging operation ");
+
+ if (resp == null || resp.getOut() == null
+ || resp.getOut().isEmpty()
+ || StringUtils.isEmpty(resp.getOut().get(0).getValue())) {
+ throw new SzrCommunicationException("ernb.01", new Object[]{"BcBind response empty"});
+ }
+
+ return resp.getOut().get(0).getValue();
+
+ } catch (final JsonProcessingException | SZRException_Exception e) {
+ log.warn("SZR communication FAILED for operation: {} Reason: {}",
+ "SignContent", e.getMessage(), e);
+ throw new SzrCommunicationException("ernb.02",
+ new Object[]{e.getMessage()}, e);
+ }
+ }
+
+ private PersonInfoType generateSzrRequest(MatchedPersonResult matchedPersonData) {
+ log.trace("Starting connecting SZR Gateway");
+ final PersonInfoType personInfo = new PersonInfoType();
+ final PersonNameType personName = new PersonNameType();
+ final PhysicalPersonType naturalPerson = new PhysicalPersonType();
+ IdentificationType bpk = new IdentificationType();
+
+ naturalPerson.setName(personName);
+ personInfo.setPerson(naturalPerson);
+ naturalPerson.setIdentification(bpk);
+
+ // person information
+ personName.setFamilyName(matchedPersonData.getFamilyName());
+ personName.setGivenName(matchedPersonData.getGivenName());
+ naturalPerson.setDateOfBirth(matchedPersonData.getDateOfBirth());
+ bpk.setValue(matchedPersonData.getBpk());
+ bpk.setType(EaafConstants.URN_PREFIX_CDID + "ZP");
+
+ return personInfo;
+ }
+
+ private PersonInfoType generateSzrRequest(SimpleEidasData eidData) {
+ log.trace("Starting connecting SZR Gateway");
+ final PersonInfoType personInfo = new PersonInfoType();
+ final PersonNameType personName = new PersonNameType();
+ final PhysicalPersonType naturalPerson = new PhysicalPersonType();
+ final TravelDocumentType eDocument = new TravelDocumentType();
+
+ naturalPerson.setName(personName);
+ personInfo.setPerson(naturalPerson);
+ personInfo.setTravelDocument(eDocument);
+
+ // person information
+ personName.setFamilyName(eidData.getFamilyName());
+ personName.setGivenName(eidData.getGivenName());
+ naturalPerson.setDateOfBirth(eidData.getDateOfBirth());
+
+ //TODO: need to be updated to new eIDAS document interface!!!!
+ eDocument.setIssuingCountry(eidData.getCitizenCountryCode());
+ eDocument.setDocumentNumber(eidData.getPseudonym());
+
+ // eID document information
+ String documentType = basicConfig
+ .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_EDOCUMENTTYPE,
+ Constants.SZR_CONSTANTS_DEFAULT_DOCUMENT_TYPE);
+ eDocument.setDocumentType(documentType);
+
+ // set PlaceOfBirth if available
+ if (eidData.getPlaceOfBirth() != null) {
+ log.trace("Find 'PlaceOfBirth' attribute: " + eidData.getPlaceOfBirth());
+ boolean setPlaceOfBirth = basicConfig
+ .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_SETPLACEOFBIRTHIFAVAILABLE, true);
+ if (setPlaceOfBirth) {
+ naturalPerson.setPlaceOfBirth(eidData.getPlaceOfBirth());
+ log.trace("Adding 'PlaceOfBirth' to ERnB request ... ");
+ }
+ }
+
+ // set BirthName if available
+ if (eidData.getBirthName() != null) {
+ log.trace("Find 'BirthName' attribute: " + eidData.getBirthName());
+ boolean setBirthName = basicConfig
+ .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_SETBIRTHNAMEIFAVAILABLE, true);
+ if (setBirthName) {
+ final AlternativeNameType alternativeName = new AlternativeNameType();
+ naturalPerson.setAlternativeName(alternativeName);
+ alternativeName.setFamilyName(eidData.getBirthName());
+ log.trace("Adding 'BirthName' to ERnB request ... ");
+ }
+ }
+
+ return personInfo;
+ }
+
+ private IdentityLinkType getIdentityLinkGeneric(GetIdentityLinkEidas getIdl) throws Exception {
+ final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
+ final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
+
+ final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ jaxbMarshaller.marshal(getIdl, outputStream);
+ outputStream.flush();
+
+ final Source source = new StreamSource(new ByteArrayInputStream(outputStream.toByteArray()));
+ outputStream.close();
+
+ log.trace("Requesting SZR ... ");
+ final Source response = dispatch.invoke(source);
+ log.trace("Receive RAW response from SZR");
+
+ final byte[] szrResponse = sourceToByteArray(response);
+ final GetIdentityLinkEidasResponse jaxbElement = (GetIdentityLinkEidasResponse) jaxbContext
+ .createUnmarshaller().unmarshal(new ByteArrayInputStream(szrResponse));
+
+ // build response
+ log.trace(new String(szrResponse, StandardCharsets.UTF_8));
+
+ // ok, we have success
+ final Document doc = DomUtils.parseDocument(
+ new ByteArrayInputStream(szrResponse),
+ true,
+ XmlNamespaceConstants.ALL_SCHEMA_LOCATIONS + " " + Constants.SZR_SCHEMA_LOCATIONS,
+ null, null);
+ final String xpathExpression = "//saml:Assertion";
+ final Element nsNode = doc.createElementNS("urn:oasis:names:tc:SAML:1.0:assertion", "saml:NSNode");
+
+ log.trace("Selecting signed doc " + xpathExpression);
+ final Element documentNode = (Element) XPathAPI.selectSingleNode(doc,
+ xpathExpression, nsNode);
+ log.trace("Signed document: " + DomUtils.serializeNode(documentNode));
+
+ final IdentityLinkType idl = new IdentityLinkType();
+ idl.setAssertion(documentNode);
+ idl.setPersonInfo(jaxbElement.getGetIdentityLinkReturn().getPersonInfo());
+
+ return idl;
+
+ }
+
+ @PostConstruct
+ private void initialize() throws EaafConfigurationException {
+ log.info("Starting SZR-Client initialization .... ");
+ final URL url = SzrClient.class.getResource("/wsdl/szr_client/SZR_v4.0.wsdl");
+
+ final boolean useTestSzr = basicConfig.getBasicConfigurationBoolean(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_USETESTSERVICE,
+ true);
+
+ SzrService szrService;
+ QName qname;
+ String szrUrl;
+ if (useTestSzr) {
+ log.debug("Initializing SZR test environment configuration.");
+ qname = SzrService.SZRTestumgebung;
+ szrService = new SzrService(url, new QName("urn:SZRServices", "SZRService"));
+ szr = szrService.getSzrTestumgebung();
+ szrUrl = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_ENDPOINT_TEST);
+
+ } else {
+ log.debug("Initializing SZR productive configuration.");
+ qname = SzrService.SZRProduktionsumgebung;
+ szrService = new SzrService(url, new QName("urn:SZRServices", "SZRService"));
+ szr = szrService.getSzrProduktionsumgebung();
+ szrUrl = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_ENDPOINT_PROD);
+
+ }
+
+ // create raw client;
+ dispatch = szrService.createDispatch(qname, Source.class, javax.xml.ws.Service.Mode.PAYLOAD);
+
+ if (StringUtils.isEmpty(szrUrl)) {
+ log.error("No SZR service-URL found. SZR-Client initalisiation failed.");
+ throw new RuntimeException("No SZR service URL found. SZR-Client initalisiation failed.");
+
+ }
+
+ // check if Clients can be initialized
+ if (szr == null) {
+ log.error("SZR " + CLIENT_DEFAULT + " is 'NULL'. Something goes wrong");
+ throw new RuntimeException("SZR " + CLIENT_DEFAULT + " is 'NULL'. Something goes wrong");
+
+ }
+ if (dispatch == null) {
+ log.error("SZR " + CLIENT_RAW + " is 'NULL'. Something goes wrong");
+ throw new RuntimeException("SZR " + CLIENT_RAW + " is 'NULL'. Something goes wrong");
+
+ }
+
+ // inject handler
+ log.info("Use SZR service-URL: " + szrUrl);
+ injectBindingProvider((BindingProvider) szr, CLIENT_DEFAULT, szrUrl,
+ basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_TRACEMESSAGES, false));
+ injectBindingProvider(dispatch, CLIENT_RAW, szrUrl,
+ basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_TRACEMESSAGES, false));
+
+ // inject http parameters and SSL context
+ log.debug("Inject HTTP client settings ... ");
+ HttpClientConfigBuilder httpClientBuilder = HttpClientConfig.builder()
+ .clientName("SZR Client")
+ .clientUrl(szrUrl)
+ .connectionTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_TIMEOUT_CONNECTION,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_CONNECTION))
+ .responseTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_TIMEOUT_RESPONSE,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_RESPONSE))
+ .keyStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_NAME,
+ "SZR SSL Client-Authentication KeyStore"))
+ .keyAlias(basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYS_ALIAS))
+ .keyPassword(basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEY_PASSWORD))
+ .trustAll(false)
+ .trustStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_NAME,
+ "SZR SSL Client-Authentication KeyStore"));
+
+ injectHttpClient(szr, httpClientBuilder.clientType(CLIENT_DEFAULT).build());
+ injectHttpClient(dispatch, httpClientBuilder.clientType(CLIENT_RAW).build());
+
+ log.info("SZR-Client initialization successfull");
+ }
+
+ private void injectMdsIfAvailableAndActive(Map<String, Object> eidsaBindMap, SimpleEidasData eidData) {
+ if (basicConfig.getBasicConfigurationBoolean(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SET_MDS_TO_EIDASBIND, false)) {
+ log.info("Injecting MDS into eidasBind ... ");
+ final Map<String, Object> mds = new HashMap<>();
+ mds.put(PvpAttributeDefinitions.PRINCIPAL_NAME_NAME, eidData.getFamilyName());
+ mds.put(PvpAttributeDefinitions.GIVEN_NAME_NAME, eidData.getGivenName());
+ mds.put(PvpAttributeDefinitions.BIRTHDATE_NAME, eidData.getDateOfBirth());
+ eidsaBindMap.put(ATTR_NAME_MDS, mds);
+
+ }
+ }
+
+ private byte[] sourceToByteArray(Source result) throws TransformerException {
+ final TransformerFactory factory = TransformerFactory.newInstance();
+ factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
+ final Transformer transformer = factory.newTransformer();
+ transformer.setOutputProperty("omit-xml-declaration", "yes");
+ transformer.setOutputProperty("method", "xml");
+ final ByteArrayOutputStream out = new ByteArrayOutputStream();
+ final StreamResult streamResult = new StreamResult();
+ streamResult.setOutputStream(out);
+ transformer.transform(result, streamResult);
+ return out.toByteArray();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrService.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrService.java
index dde868b1..590f88a4 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrService.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/szr/SzrService.java
@@ -21,7 +21,7 @@
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
-package at.asitplus.eidas.specific.modules.auth.eidas.v2.szr;
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr;
import java.net.URL;
@@ -52,7 +52,7 @@ public class SzrService extends Service {
"SZRBusinesspartnerTestumgebung");
static {
- URL url = SzrService.class.getResource("./src/main/resources/szr_client/SZR-1.WSDL");
+ URL url = SzrService.class.getResource("./src/main/resources/wsdl/szr_client/SZR-1.WSDL");
if (url == null) {
url = SzrService.class.getClassLoader().getResource("/szr_client/SZR-1.WSDL");
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/IZmrClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/IZmrClient.java
new file mode 100644
index 00000000..f3c32c96
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/IZmrClient.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr;
+
+import java.math.BigInteger;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+public interface IZmrClient {
+
+ /**
+ * Search person based on eIDAS personal identifier.
+ *
+ * @param zmrProzessId ProcessId from ZMR or <code>null</code> if no processId exists
+ * @param personIdentifier Full eIDAS personal identifier with prefix
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ZmrRegisterResult searchWithPersonIdentifier(@Nullable BigInteger zmrProzessId, @Nonnull String personIdentifier,
+ @Nonnull String citizenCountryCode) throws EidasSAuthenticationException;
+
+ /**
+ * Search person based on eIDSA MDS information.
+ *
+ * @param zmrProzessId ProcessId from ZMR or <code>null</code> if no processId exists
+ * @param givenName eIDAS given name
+ * @param familyName eIDAS principle name
+ * @param dateOfBirth eIDAS date-of-birth
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ZmrRegisterResult searchWithMds(@Nullable BigInteger zmrProzessId, @Nonnull String givenName,
+ @Nonnull String familyName, @Nonnull String dateOfBirth, @Nonnull String citizenCountryCode)
+ throws EidasSAuthenticationException;
+
+ /**
+ * Search person based on country-specific natural person set.
+ *
+ * @param zmrProzessId ProcessId from ZMR or <code>null</code> if no processId exists
+ * @param personSearchDao Specific set of natural person informations.
+ * @param citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ZmrRegisterResult searchCountrySpecific(@Nullable BigInteger zmrProzessId,
+ @Nonnull PersonSuchenRequest personSearchDao, @Nonnull String citizenCountryCode)
+ throws EidasSAuthenticationException;
+
+ /**
+ * Search person based on MDS information and Austrian residence.
+ *
+ * @param zmrProzessId zmrProzessId zmrProzessId ProcessId from ZMR or <code>null</code> if no processId exists
+ * @param givenName eIDAS given name
+ * @param familyName eIDAS principle name
+ * @param dateOfBirth eIDAS date-of-birth
+ * @param citizenCountryCode citizenCountryCode CountryCode of the eIDAS proxy-service
+ * @param address Address information for searching
+ * @return Search result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ZmrRegisterResult searchWithResidenceData(@Nullable BigInteger zmrProzessId, @Nonnull String givenName,
+ @Nonnull String familyName, @Nonnull String dateOfBirth, @Nonnull String citizenCountryCode,
+ @Nonnull AdresssucheOutput address) throws EidasSAuthenticationException;
+
+ /**
+ * Update ZMR entry to KITT existing ZMR identity with this eIDAS authentication.
+ *
+ * @param zmrProzessId zmrProzessId ProcessId from ZMR or <code>null</code> if no processId exists
+ * @param registerResult Already matched eIDAS identity that should be KITT
+ * @param eidData eIDAS eID information from current authentication process
+ * @return Update result but never <code>null</code>
+ * @throws EidasSAuthenticationException In case of a communication error
+ */
+ @Nonnull
+ ZmrRegisterResult update(@Nullable BigInteger zmrProzessId, RegisterResult registerResult, SimpleEidasData eidData)
+ throws EidasSAuthenticationException;
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrAddressSoapClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrAddressSoapClient.java
new file mode 100644
index 00000000..6e146ddf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrAddressSoapClient.java
@@ -0,0 +1,286 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr;
+
+import java.math.BigInteger;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.PostConstruct;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.Nullable;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.AbstractSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ZmrCommunicationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.VersionHolder;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.ClientInfoType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.Organisation;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.RequestType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.Service;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.ServiceFault_Exception;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.ServicePort;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.WorkflowInfoClient;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.address.WorkflowInfoServer;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.Adressdaten;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.AdresssucheInfoType;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.AdresssucheRequest;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.AdresssuchergebnisType;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * ZMR SOAP client for search-address operations.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class ZmrAddressSoapClient extends AbstractSoapClient {
+
+ private static final String CLIENT_DEFAULT = "ZMR-AddressSearch Client";
+ private static final String CLIENT_INFO = "eIDAS MS-Connector v{0}";
+
+ private static final String LOGMSG_ZMR_SOAP_ERROR =
+ "ZMR anwser for transaction: {0} with code: {1} and message: {2}";
+ private static final String LOGMSG_ZMR_ERROR =
+ "Receive an error from ZMR during '{}' operation with msg: {}";
+ private static final String LOGMSG_ZMR_RESP_PROCESS =
+ "Proces ZMR response during '{}' operation failes with msg: {}";
+
+ private static final String ERROR_MATCHING_07 = "module.eidasauth.matching.07";
+ private static final String ERROR_MATCHING_99 = "module.eidasauth.matching.99";
+
+ private static final String PROCESS_GENERAL = "GP_Abfragen";
+ private static final String PROCESS_TASK_ADDRESS_WIZZARD = "ZMR_VO_Adresssuche_im_GWR__6";
+
+ private static final String PROCESS_TASK_RESPONSE_LEVEL_CITY = "Ortschaft";
+ private static final String PROCESS_TASK_RESPONSE_LEVEL_STREET = "Strassenname";
+ private static final String PROCESS_TASK_RESPONSE_LEVEL_NUMBER = "Orientierungsnummer";
+
+
+ private static final String PROCESS_ADDRESS_WIZZARD = "PROCESS_SEARCH_WITH_ADDRESS_WIZZARD";
+
+ private static final String SEARCH_TYPE = "ADRESSSUCHE";
+
+
+ @Autowired VersionHolder versionHolder;
+ private ServicePort zmrClient;
+
+ @Getter
+ @AllArgsConstructor
+ public static class AddressInfo {
+ private final BigInteger processId;
+ private final List<Adressdaten> personResult;
+ private final DetailLevel level;
+
+ }
+
+ public enum DetailLevel { CITY, STREET, NUMBER, UNKNOWN }
+
+ /**
+ * Get address information based on ZMR data.
+ *
+ * @param addressInfo Search parameters
+ * @return Address data
+ * @throws EidasSAuthenticationException In case of an error
+ */
+ public AddressInfo searchAddress(@NonNull Adressdaten addressInfo)
+ throws EidasSAuthenticationException {
+ return searchAddress(addressInfo, null);
+
+ }
+
+ /**
+ * Get address information based on ZMR data.
+ *
+ * @param addressInfo Search parameters
+ * @param prozessInstanzId processId in case of associated requests
+ * @return Address data
+ * @throws EidasSAuthenticationException In case of an error
+ */
+ public AddressInfo searchAddress(@NonNull Adressdaten addressInfo, @Nullable BigInteger prozessInstanzId)
+ throws EidasSAuthenticationException {
+ try {
+ RequestType req = new RequestType();
+
+ // set generic informations
+ req.setClientInfo(generateClientInfos());
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_ADDRESS_WIZZARD, null));
+
+ AdresssucheRequest search = new AdresssucheRequest();
+ req.setAdresssucheRequest(search);
+
+ // set static search type
+ AdresssucheInfoType searchType = new AdresssucheInfoType();
+ searchType.setSuchart(SEARCH_TYPE);
+ search.setAdresssucheInfo(searchType);
+
+ // set search parameters
+ search.setAdressdaten(addressInfo);
+
+ // request ZMR address services
+ log.debug("Requesting ZMR for adddress search ....");
+ ResponseType resp = zmrClient.service(req, null);
+ log.debug("Receice response for address search with #{} elements",
+ resp.getAdresssucheResponse().getAdresssuchergebnis().getGefundeneSaetze());
+
+ return new AddressInfo(
+ extractZmrProcessId(resp.getWorkflowInfoServer()),
+ resp.getAdresssucheResponse().getAdresssuchergebnis().getAdressdaten(),
+ extractAddressDetailLevel(resp.getAdresssucheResponse().getAdresssuchergebnis()));
+
+ } catch (final ServiceFault_Exception e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, PROCESS_ADDRESS_WIZZARD, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_07, new Object[] { errorMsg }, e);
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, PROCESS_ADDRESS_WIZZARD, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @PostConstruct
+ private void initialize() throws EaafConfigurationException {
+ // set-up the ZMR client
+ initializeTechnicalZmrClient();
+
+ }
+
+ private void initializeTechnicalZmrClient() throws EaafConfigurationException {
+ log.info("Starting ZMR-AddressSearch Client initialization .... ");
+ final URL url = ZmrAddressSoapClient.class.getResource("/wsdl/addresssearching_client/wsdl/Service.wsdl");
+ final Service zmrService = new Service(url);
+ zmrClient = zmrService.getService();
+
+ final String zmrServiceUrl = basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_ENDPOINT);
+ if (StringUtils.isEmpty(zmrServiceUrl)) {
+ log.error("No ZMR-AddressSearch service-URL found. ZMR-AddressSearch-Client initalisiation failed.");
+ throw new RuntimeException(
+ "No ZMR-AddressSearch service URL found. ZMR-AddressSearch-Client initalisiation failed.");
+
+ }
+
+ // inject handler
+ log.info("Use ZMR-AddressSearch service-URL: " + zmrServiceUrl);
+ injectBindingProvider((BindingProvider) zmrClient, CLIENT_DEFAULT, zmrServiceUrl,
+ basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_DEBUG_TRACEMESSAGES,
+ false));
+
+ // inject http parameters and SSL context
+ log.debug("Inject HTTP client settings ... ");
+ injectHttpClient(zmrClient, HttpClientConfig.builder()
+ .clientName(CLIENT_DEFAULT)
+ .clientType(CLIENT_DEFAULT)
+ .clientUrl(zmrServiceUrl)
+ .connectionTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_CONNECTION,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_CONNECTION))
+ .responseTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_RESPONSE,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_RESPONSE))
+ .keyStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_NAME,
+ "ZMR-AddressSearch SSL Client-Authentication KeyStore"))
+ .keyAlias(basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYS_ALIAS))
+ .keyPassword(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEY_PASSWORD))
+ .trustAll(false)
+ .trustStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_NAME,
+ "ZMR-AddressSearch SSL Client-Authentication TrustStore"))
+ .build());
+
+ }
+
+ @Nonnull
+ private ClientInfoType generateClientInfos() {
+ final ClientInfoType clientInfo = new ClientInfoType();
+ final Organisation clientOrganisation = new Organisation();
+ clientInfo.setOrganisation(clientOrganisation);
+
+ // set client information
+ clientInfo.setClient(MessageFormat.format(CLIENT_INFO, versionHolder.getVersion()));
+
+ // set Behoerdennummer as organization identifier
+ clientOrganisation.setBehoerdenNr(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_ORGANIZATION_NR));
+
+ return clientInfo;
+ }
+
+ @Nonnull
+ private static String extractReasonFromError(ServiceFault_Exception e) {
+ if (e.getFaultInfo() != null) {
+ return MessageFormat.format(LOGMSG_ZMR_SOAP_ERROR,
+ e.getFaultInfo().getServerTransaktionNr().toString(),
+ e.getFaultInfo().getErrorCode(),
+ e.getFaultInfo().getErrorMessage());
+
+ } else {
+ log.error("ZMR response without error code", e);
+ return e.getMessage();
+
+ }
+ }
+
+ @Nonnull
+ private static WorkflowInfoClient generateWorkFlowInfos(@Nonnull String subStepName,
+ @Nullable BigInteger prozessInstanzId) {
+ final WorkflowInfoClient infos = new WorkflowInfoClient();
+ infos.setProzessName(PROCESS_GENERAL);
+ infos.setVorgangName(subStepName);
+
+ //set processId that we received from ZMR before, if already available
+ if (prozessInstanzId != null) {
+ infos.setProzessInstanzID(prozessInstanzId);
+
+ }
+
+ return infos;
+
+ }
+
+ private static BigInteger extractZmrProcessId(WorkflowInfoServer workflowInfoServer) {
+ return workflowInfoServer != null ? workflowInfoServer.getProzessInstanzID() : null;
+
+ }
+
+ private static DetailLevel extractAddressDetailLevel(AdresssuchergebnisType value) {
+ if (value.getDetailgrad() == null) {
+ return DetailLevel.UNKNOWN;
+ }
+ switch (value.getDetailgrad()) {
+ case PROCESS_TASK_RESPONSE_LEVEL_CITY:
+ return DetailLevel.CITY;
+
+ case PROCESS_TASK_RESPONSE_LEVEL_STREET:
+ return DetailLevel.STREET;
+
+ case PROCESS_TASK_RESPONSE_LEVEL_NUMBER:
+ return DetailLevel.NUMBER;
+
+ default:
+ return DetailLevel.UNKNOWN;
+
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java
new file mode 100644
index 00000000..8dbd0632
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java
@@ -0,0 +1,874 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr;
+
+import java.math.BigInteger;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+import javax.annotation.PostConstruct;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.lang.NonNull;
+import org.springframework.lang.Nullable;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.AbstractSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ZmrCommunicationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.VersionHolder;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ClientInfoType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.Organisation;
+import at.gv.bmi.namespace.zmr_su.base._20040201.RequestType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.WorkflowInfoClient;
+import at.gv.bmi.namespace.zmr_su.base._20040201.WorkflowInfoServer;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.Service;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServiceFault;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetAnlageType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.ErgebniskriterienType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.NatuerlichePersonErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonAendernInfoType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonAendernRequest;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonErgebnisSatzType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonErgebnisType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonReferenzType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenResponse;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonensucheInfoType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.SuchkriterienType;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.IdentificationType;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.NatuerlichePersonTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PersonenNameTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PostAdresseTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.ZustelladresseTyp;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.exceptions.EaafAuthenticationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * ZMR client implementation for eIDAS matching operations.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class ZmrSoapClient extends AbstractSoapClient implements IZmrClient {
+
+ private static final String ERROR_MATCHING_01 = "module.eidasauth.matching.01";
+ private static final String ERROR_MATCHING_02 = "module.eidasauth.matching.02";
+ private static final String ERROR_MATCHING_99 = "module.eidasauth.matching.99";
+
+ private static final String LOGMSG_MISSING_CONFIG = "Missing configuration with key: {0}";
+
+ private static final String LOGMSG_ZMR_ERROR =
+ "Receive an error from ZMR during '{}' operation with msg: {}";
+ private static final String LOGMSG_ZMR_RESP_PROCESS =
+ "Proces ZMR response during '{}' operation failes with msg: {}";
+
+ private static final String LOGMSG_ZMR_SOAP_ERROR =
+ "ZMR anwser for transaction: {0} with code: {1} and message: {2}";
+
+ private static final String PROCESS_GENERAL = "GP_EIDAS";
+ private static final String PROCESS_TASK_SEARCH = "ZPR_VO_Person_suchen_Meldevorgang";
+ //private static final String PROCESS_TASK_ADD = "ZPR_VO_Person_anlegen";
+ private static final String PROCESS_TASK_UPDATE = "ZPR_VO_Person_aendern";
+
+ private static final String PROCESS_SEARCH_PERSONAL_IDENTIFIER =
+ "Searching " + Constants.eIDAS_ATTR_PERSONALIDENTIFIER;
+ private static final String PROCESS_SEARCH_MDS_ONLY = "Searching with MDS only";
+ private static final String PROCESS_SEARCH_COUNTRY_SPECIFIC = "Searching {0} specific";
+ private static final String PROCESS_SEARCH_BY_RESIDENCE = "Searching by residence";
+
+ private static final String PROCESS_KITT_GENERAL = "KITT general-processing";
+ private static final String PROCESS_KITT_IDENITIES_GET = "KITT get-latest-version";
+ private static final String PROCESS_KITT_IDENITIES_UPDATE = "KITT update dataset";
+
+ private static final String CLIENT_DEFAULT = "ZMR Client";
+
+
+ @Autowired VersionHolder versionHolder;
+
+ private ServicePort zmrClient;
+
+
+ @AllArgsConstructor
+ @Getter
+ public static class ZmrRegisterResult {
+ private final List<RegisterResult> personResult;
+ private final BigInteger processId;
+
+ }
+
+ @Override
+ public ZmrRegisterResult searchWithPersonIdentifier(BigInteger zmrProzessId, String personPseudonym,
+ String citizenCountryCode) throws EidasSAuthenticationException {
+
+ try {
+ // build search request
+ final RequestType req = new RequestType();
+
+ // set eIDAS person information
+ final PersonSuchenRequest searchPersonReq = new PersonSuchenRequest();
+ req.setPersonSuchenRequest(searchPersonReq);
+ final EidasSuchdatenType eidasInfos = new EidasSuchdatenType();
+ searchPersonReq.getEidasSuchdaten().add(eidasInfos);
+ eidasInfos.setEidasArt(Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER);
+ eidasInfos.setEidasWert(personPseudonym);
+ eidasInfos.setStaatscode2(citizenCountryCode);
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_SEARCH, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ // set additionl search parameters
+ searchPersonReq.setPersonensucheInfo(generateSearchCriteria(
+ PROCESS_SEARCH_PERSONAL_IDENTIFIER, false, true, false));
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", PROCESS_SEARCH_PERSONAL_IDENTIFIER);
+ final ResponseType resp = zmrClient.service(req, null);
+
+ // parse ZMR response
+ return processZmrResponse(resp, citizenCountryCode, true, PROCESS_SEARCH_PERSONAL_IDENTIFIER);
+
+ } catch (final ServiceFault e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, PROCESS_SEARCH_PERSONAL_IDENTIFIER, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_01, new Object[] { errorMsg }, e);
+
+ } catch (EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, PROCESS_SEARCH_PERSONAL_IDENTIFIER, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ public ZmrRegisterResult searchWithMds(BigInteger zmrProzessId, String givenName, String familyName,
+ String dateOfBirth, String citizenCountryCode) throws EidasSAuthenticationException {
+ try {
+ // build search request
+ final RequestType req = new RequestType();
+
+ // set eIDAS person information
+ final PersonSuchenRequest searchPersonReq = new PersonSuchenRequest();
+ req.setPersonSuchenRequest(searchPersonReq);
+ searchPersonReq.setNatuerlichePerson(buildSearchNatPerson(givenName, familyName, dateOfBirth));
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_SEARCH, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ // set additionl search parameters
+ searchPersonReq.setPersonensucheInfo(generateSearchCriteria(
+ PROCESS_SEARCH_MDS_ONLY, false, true, false));
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", PROCESS_SEARCH_MDS_ONLY);
+ final ResponseType resp = zmrClient.service(req, null);
+
+ // parse ZMR response
+ return processZmrResponse(resp, citizenCountryCode, false, PROCESS_SEARCH_MDS_ONLY);
+
+ } catch (final ServiceFault e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, PROCESS_SEARCH_MDS_ONLY, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_01, new Object[] { errorMsg }, e);
+
+ } catch (EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, PROCESS_SEARCH_MDS_ONLY, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+
+ }
+
+ @Override
+ public ZmrRegisterResult searchCountrySpecific(BigInteger zmrProzessId, PersonSuchenRequest personSearchDao,
+ String citizenCountryCode)
+ throws EidasSAuthenticationException {
+ final String friendlyMsg = MessageFormat.format(PROCESS_SEARCH_COUNTRY_SPECIFIC, citizenCountryCode);
+
+ try {
+ // build search request
+ final RequestType req = new RequestType();
+
+ // set eIDAS person information
+ req.setPersonSuchenRequest(personSearchDao);
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_SEARCH, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ // set additionl search parameters
+ personSearchDao.setPersonensucheInfo(generateSearchCriteria(friendlyMsg, false, true, false));
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", friendlyMsg);
+ final ResponseType resp = zmrClient.service(req, null);
+
+ // parse ZMR response
+ return processZmrResponse(resp, citizenCountryCode, true,
+ friendlyMsg);
+
+ } catch (final ServiceFault e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, friendlyMsg, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_01, new Object[] { errorMsg }, e);
+
+ } catch (EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, friendlyMsg, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ public ZmrRegisterResult update(BigInteger zmrProzessId, RegisterResult registerResult,
+ SimpleEidasData eidData) throws EidasSAuthenticationException {
+ try {
+ //search person with register result, because update needs information from search response
+ PersonErgebnisType zmrPersonToKitt = searchPersonForUpdate(zmrProzessId, registerResult);
+
+ // select elements that have to be updated
+ Collection<? extends EidasIdentitaetAnlageType> eidasDocumentToAdd =
+ selectEidasDocumentsToAdd(zmrPersonToKitt, eidData);
+
+ /*TODO: Is there a requirement to change 'eIDAS-Documents'?
+ * We add MDS information as 'eIDAS-Documents' too. Maybe, we should update that in a later version.
+ */
+
+ if (eidasDocumentToAdd.isEmpty()) {
+ log.info("Find no eIDAS document for update during: {}. Nothing todo on ZMR side",
+ PROCESS_KITT_GENERAL);
+ return new ZmrRegisterResult(Arrays.asList(registerResult), zmrProzessId);
+
+ } else {
+ log.info("Find #{} eIDAS documents for update during: {}", eidasDocumentToAdd.size(), PROCESS_KITT_GENERAL);
+
+ // update entry based on selected update info's and results from search response
+ return updatePersonInZmr(zmrProzessId, zmrPersonToKitt, eidasDocumentToAdd, eidData.getCitizenCountryCode());
+
+ }
+
+ } catch (final ServiceFault e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, PROCESS_KITT_GENERAL, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_01, new Object[] { errorMsg }, e);
+
+ } catch (EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, PROCESS_KITT_GENERAL, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+
+ }
+
+ @Override
+ public ZmrRegisterResult searchWithResidenceData(BigInteger zmrProzessId, String givenName, String familyName,
+ String dateOfBirth, String citizenCountryCode, AdresssucheOutput address)
+ throws EidasSAuthenticationException {
+ try {
+ // build search request
+ final RequestType req = new RequestType();
+
+ // set person information
+ final PersonSuchenRequest searchPersonReq = new PersonSuchenRequest();
+ req.setPersonSuchenRequest(searchPersonReq);
+ searchPersonReq.setNatuerlichePerson(buildSearchNatPerson(givenName, familyName, dateOfBirth));
+ searchPersonReq.setPostAdresse(buildSearchAddress(address));
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_SEARCH, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ // set additionl search parameters
+ searchPersonReq.setPersonensucheInfo(generateSearchCriteria(
+ PROCESS_SEARCH_BY_RESIDENCE, false, true, false));
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", PROCESS_SEARCH_BY_RESIDENCE);
+ final ResponseType resp = zmrClient.service(req, null);
+
+ // parse ZMR response
+ return processZmrResponse(resp, citizenCountryCode, false, PROCESS_SEARCH_BY_RESIDENCE);
+
+ } catch (final ServiceFault e) {
+ final String errorMsg = extractReasonFromError(e);
+ log.warn(LOGMSG_ZMR_ERROR, PROCESS_SEARCH_BY_RESIDENCE, errorMsg);
+ throw new ZmrCommunicationException(ERROR_MATCHING_01, new Object[] { errorMsg }, e);
+
+ } catch (EidasSAuthenticationException e) {
+ throw e;
+
+ } catch (final Exception e) {
+ log.warn(LOGMSG_ZMR_RESP_PROCESS, PROCESS_SEARCH_BY_RESIDENCE, e.getMessage());
+ throw new EidasSAuthenticationException(ERROR_MATCHING_99, new Object[] { e.getMessage() }, e);
+
+ }
+ }
+
+ @PostConstruct
+ private void initialize() throws EaafConfigurationException {
+ // set-up the ZMR client
+ initializeTechnicalZmrClient();
+
+ // validate additional ZMR communication parameters
+ valdiateAdditionalConfigParameters();
+
+ }
+
+ private void initializeTechnicalZmrClient() throws EaafConfigurationException {
+ log.info("Starting ZMR-Client initialization .... ");
+ final URL url = ZmrSoapClient.class.getResource("/wsdl/zmr_client/wsdl/Service.wsdl");
+ final Service zmrService = new Service(url);
+ zmrClient = zmrService.getService();
+
+ final String zmrServiceUrl = basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_ENDPOINT);
+ if (StringUtils.isEmpty(zmrServiceUrl)) {
+ log.error("No ZMR service-URL found. ZMR-Client initalisiation failed.");
+ throw new RuntimeException("No ZMR service URL found. ZMR-Client initalisiation failed.");
+
+ }
+
+ // inject handler
+ log.info("Use ZMR service-URL: " + zmrServiceUrl);
+ injectBindingProvider((BindingProvider) zmrClient, CLIENT_DEFAULT, zmrServiceUrl,
+ basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_DEBUG_TRACEMESSAGES,
+ false));
+
+ // inject http parameters and SSL context
+ log.debug("Inject HTTP client settings ... ");
+ injectHttpClient(zmrClient, HttpClientConfig.builder()
+ .clientName(CLIENT_DEFAULT)
+ .clientType(CLIENT_DEFAULT)
+ .clientUrl(zmrServiceUrl)
+ .connectionTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_CONNECTION,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_CONNECTION))
+ .responseTimeout(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_TIMEOUT_RESPONSE,
+ Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_RESPONSE))
+ .keyStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYSTORE_NAME,
+ "ZMR SSL Client-Authentication KeyStore"))
+ .keyAlias(basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEYS_ALIAS))
+ .keyPassword(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_KEY_PASSWORD))
+ .trustAll(false)
+ .trustStoreConfig(buildKeyStoreConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_TYPE,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PATH,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_PASSWORD,
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_SSL_TRUSTSTORE_NAME,
+ "ZMR SSL Client-Authentication TrustStore"))
+ .build());
+
+ }
+
+ private void valdiateAdditionalConfigParameters() {
+ checkConfigurationValue(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_ORGANIZATION_NR);
+ checkConfigurationValue(Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_UPDATE_REASON_CODE);
+
+ }
+
+ private void checkConfigurationValue(String key) {
+ if (StringUtils.isEmpty(basicConfig.getBasicConfiguration(key))) {
+ throw new RuntimeException(MessageFormat.format(LOGMSG_MISSING_CONFIG, key));
+
+ }
+ }
+
+ @Nonnull
+ private WorkflowInfoClient generateWorkFlowInfos(@Nonnull String subStepName,
+ @Nullable BigInteger prozessInstanzId) {
+ final WorkflowInfoClient infos = new WorkflowInfoClient();
+ infos.setProzessName(PROCESS_GENERAL);
+ infos.setVorgangName(subStepName);
+
+ //set processId that we received from ZMR before, if already available
+ if (prozessInstanzId != null) {
+ infos.setProzessInstanzID(prozessInstanzId);
+
+ }
+
+ return infos;
+
+ }
+
+ @Nonnull
+ private PersonensucheInfoType generateSearchCriteria(String infoElement, boolean searchInErnp,
+ boolean searchInZmrHistory, boolean includeHistoryResults) {
+ final PersonensucheInfoType personSearchInfo = new PersonensucheInfoType();
+ final SuchkriterienType searchCriteria = new SuchkriterienType();
+ final ErgebniskriterienType resultCriteria = new ErgebniskriterienType();
+
+ personSearchInfo.setBezugsfeld(infoElement);
+ personSearchInfo.setSuchkriterien(searchCriteria);
+ personSearchInfo.setErgebniskriterien(resultCriteria);
+
+ // TODO: are these flags valid?
+ searchCriteria.setInclusivERnP(searchInErnp);
+ searchCriteria.setInclusivHistorie(searchInZmrHistory);
+
+ // TODO: check 'processSearchPersonResponse' if we change this to 'true'
+ resultCriteria.setInclusivHistorie(includeHistoryResults);
+
+ // TODO: are these flags valid?
+ personSearchInfo.setAnzahlSaetze(10);
+
+ return personSearchInfo;
+
+ }
+
+ @Nonnull
+ private ClientInfoType generateClientInfos() {
+ final ClientInfoType clientInfo = new ClientInfoType();
+ final Organisation clientOrganisation = new Organisation();
+ clientInfo.setOrganisation(clientOrganisation);
+
+ // set client information
+ clientInfo.setClient(MessageFormat.format(Constants.CLIENT_INFO, versionHolder.getVersion()));
+
+ // set Behoerdennummer as organization identifier
+ clientOrganisation.setBehoerdenNr(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_ORGANIZATION_NR));
+
+ return clientInfo;
+ }
+
+ @Nonnull
+ private String extractReasonFromError(ServiceFault e) {
+ if (e.getFaultInfo() != null) {
+ return MessageFormat.format(LOGMSG_ZMR_SOAP_ERROR,
+ e.getFaultInfo().getServerTransaktionNr().toString(),
+ e.getFaultInfo().getErrorCode(),
+ e.getFaultInfo().getErrorMessage());
+
+ } else {
+ log.error("ZMR response without error code", e);
+ return e.getMessage();
+
+ }
+ }
+
+ @Nonnull
+ private ZmrRegisterResult processZmrResponse(@Nonnull ResponseType resp,
+ @Nonnull String citizenCountryCode,
+ boolean forceSinglePersonMatch, @Nonnull String processStepFiendlyname)
+ throws EaafAuthenticationException {
+ final PersonSuchenResponse searchPersonResp = resp.getPersonSuchenResponse();
+ if (searchPersonResp.getPersonensuchergebnis() == null
+ || searchPersonResp.getPersonensuchergebnis().getPersonErgebnisSatz().isEmpty()) {
+ log.debug("ZMR result contains NO 'Personensuchergebnis' or 'PersonErgebnisSatz' is empty");
+ return new ZmrRegisterResult(Collections.emptyList(), extractZmrProcessId(resp.getWorkflowInfoServer()));
+
+ } else {
+ log.debug("Get #{} person results from '{}' operation",
+ searchPersonResp.getPersonensuchergebnis().getGefundeneSaetze(), processStepFiendlyname);
+
+ if (forceSinglePersonMatch) {
+ return new ZmrRegisterResult(processSearchPersonResponseSingleResult(
+ searchPersonResp.getPersonensuchergebnis().getPersonErgebnisSatz(),
+ citizenCountryCode, processStepFiendlyname),
+ extractZmrProcessId(resp.getWorkflowInfoServer()));
+
+ } else {
+ return new ZmrRegisterResult(processSearchPersonResponse(
+ searchPersonResp.getPersonensuchergebnis().getPersonErgebnisSatz(), citizenCountryCode),
+ extractZmrProcessId(resp.getWorkflowInfoServer()));
+
+ }
+ }
+ }
+
+ private BigInteger extractZmrProcessId(WorkflowInfoServer workflowInfoServer) {
+ return workflowInfoServer != null ? workflowInfoServer.getProzessInstanzID() : null;
+
+ }
+
+ @Nonnull
+ private List<RegisterResult> processSearchPersonResponse(
+ @Nonnull List<PersonErgebnisSatzType> personErgebnisSatz,
+ @Nonnull String citizenCountryCode) throws EaafAuthenticationException {
+
+ return personErgebnisSatz.stream()
+ .map(el -> {
+ try {
+ return processPersonResult(el, citizenCountryCode);
+
+ } catch (final EaafAuthenticationException e) {
+ log.warn("Skip ZMR person result by reason: {}", e.getMessage(), e);
+ return null;
+
+ }
+ })
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList());
+
+ }
+
+ @NonNull
+ private List<RegisterResult> processSearchPersonResponseSingleResult(
+ @Nonnull List<PersonErgebnisSatzType> personErgebnisSatz,
+ @Nonnull String citizenCountryCode, String processStepFiendlyname) throws EaafAuthenticationException {
+ if (personErgebnisSatz.size() > 1) {
+ log.error("Find more-than-one ZMR entry with search criteria that has to be unique");
+ throw new WorkflowException(processStepFiendlyname,
+ "Find more-than-one ZMR entry with search criteria that has to be unique", true);
+
+ } else {
+ return Arrays.asList(processPersonResult(personErgebnisSatz.get(0), citizenCountryCode));
+
+ }
+ }
+
+ @Nonnull
+ private RegisterResult processPersonResult(
+ @Nonnull PersonErgebnisSatzType personEl, @Nonnull String citizenCountryCode)
+ throws EaafAuthenticationException {
+ // TODO: maybe check on 'null' if ERnP data is also allowed
+ log.debug("Find #{} data sets in person information",
+ personEl.getPersonendaten().getPersonErgebnis().size());
+
+ if (personEl.getPersonendaten().getPersonErgebnis().size() > 1) {
+ log.error("Find more than on PersoenErgebnis in Personendaten.");
+ throw new EaafAuthenticationException(ERROR_MATCHING_02, null);
+
+ } else {
+ return mapZmrResponseToRegisterResult(
+ personEl.getPersonendaten().getPersonErgebnis().get(0), citizenCountryCode);
+
+ }
+
+ }
+
+ @Nonnull
+ private RegisterResult mapZmrResponseToRegisterResult(@Nonnull PersonErgebnisType person,
+ @Nonnull String citizenCountryCode) {
+ // TODO: kann ich bei historischen daten davon ausgehen dass die Reihenfolge der
+ // Ergebnisse von aktuell --> alt ist?
+
+ // build result
+ return RegisterResult.builder()
+ .pseudonym(selectAllEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER))
+ .familyName(person.getNatuerlichePerson().getPersonenName().getFamilienname())
+ .givenName(person.getNatuerlichePerson().getPersonenName().getVorname())
+ .dateOfBirth(person.getNatuerlichePerson().getGeburtsdatum())
+ .bpk(extractBpkZp(person.getNatuerlichePerson()))
+ .placeOfBirth(selectSingleEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH))
+ .birthName(selectSingleEidasDocument(person, citizenCountryCode,
+ Constants.eIDAS_ATTRURN_BIRTHNAME))
+ .build();
+
+ }
+
+ private String extractBpkZp(NatuerlichePersonErgebnisType natuerlichePerson) {
+ String bpk = natuerlichePerson.getIdentification().stream()
+ .filter(el -> Constants.MATCHING_INTERNAL_BPK_TARGET.equals(el.getType()))
+ .findFirst()
+ .map(el -> el.getValue())
+ .orElse(null);
+ if (StringUtils.isEmpty(bpk)) {
+ //TODO: should we throw an error in that case?
+ log.warn("ZMR response contains no 'bPK' for target: 'ZP'");
+
+ }
+ return bpk;
+
+ }
+
+ /**
+ * Get all eIDAS document with the specified country code and document type.
+ *
+ * @param person Person information from ZMR
+ * @param citizenCountryCode Country code of the eIDAS attribute
+ * @param eidasAttrurnPersonalidentifier eIDAS attribute identifier
+ * @return {@link List} of eIDAS attribute values or an empty list if's not
+ * found
+ */
+ @NonNull
+ private List<String> selectAllEidasDocument(PersonErgebnisType person, String citizenCountryCode,
+ String eidasAttrurnPersonalidentifier) {
+ return person.getEidasIdentitaet().stream()
+ .filter(el -> eidasAttrurnPersonalidentifier.equals(el.getEidasArt())
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .map(el -> el.getEidasWert())
+ .collect(Collectors.toList());
+
+ }
+
+ /**
+ * Get the first eIDAS document with the specified country code and document
+ * type.
+ *
+ * @param person Person information from ZMR
+ * @param citizenCountryCode Country code of the eIDAS attribute
+ * @param eidasAttrurnPersonalidentifier eIDAS attribute identifier
+ * @return Value of this eIDAS attribute or <code>null</code> if's not found
+ */
+ @Nullable
+ private String selectSingleEidasDocument(PersonErgebnisType person, String citizenCountryCode,
+ String eidasAttrurnPersonalidentifier) {
+ return person.getEidasIdentitaet().stream()
+ .filter(el -> eidasAttrurnPersonalidentifier.equals(el.getEidasArt())
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .findFirst()
+ .map(el -> el.getEidasWert())
+ .orElse(null);
+
+ }
+
+ private PersonErgebnisType searchPersonForUpdate(BigInteger zmrProzessId, RegisterResult registerResult)
+ throws ServiceFault, WorkflowException {
+ // build search request
+ final RequestType req = new RequestType();
+
+ // set eIDAS person information
+ final PersonSuchenRequest searchPersonReq = new PersonSuchenRequest();
+ req.setPersonSuchenRequest(searchPersonReq);
+ NatuerlichePersonTyp natPersonInfos = new NatuerlichePersonTyp();
+ searchPersonReq.setNatuerlichePerson(natPersonInfos);
+ PersonenNameTyp nameInfo = new PersonenNameTyp();
+ natPersonInfos.setPersonenName(nameInfo);
+ IdentificationType bpkInfo = new IdentificationType();
+ natPersonInfos.getIdentification().add(bpkInfo);
+
+ // set MDS
+ nameInfo.setVorname(registerResult.getGivenName());
+ nameInfo.setFamilienname(registerResult.getFamilyName());
+ natPersonInfos.setGeburtsdatum(registerResult.getDateOfBirth());
+
+ //set bPK
+ bpkInfo.setValue(registerResult.getBpk());
+ bpkInfo.setType(EaafConstants.URN_PREFIX_CDID + "ZP");
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_SEARCH, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ // set additionl search parameters
+ searchPersonReq.setPersonensucheInfo(generateSearchCriteria(
+ PROCESS_KITT_IDENITIES_GET, false, true, false));
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", PROCESS_KITT_IDENITIES_GET);
+ ResponseType resp = zmrClient.service(req, null);
+ log.trace("Receive response from ZMR for '{}' operation", PROCESS_KITT_IDENITIES_GET);
+
+ return extractPersonResultForUpdaste(resp);
+
+ }
+
+ private PersonErgebnisType extractPersonResultForUpdaste(ResponseType resp) throws WorkflowException {
+ final PersonSuchenResponse searchPersonResp = resp.getPersonSuchenResponse();
+ if (searchPersonResp.getPersonensuchergebnis() == null
+ || searchPersonResp.getPersonensuchergebnis().getPersonErgebnisSatz().isEmpty()) {
+ log.error("ZMR result contains NO 'Personensuchergebnis' or 'PersonErgebnisSatz' is empty");
+ throw new WorkflowException(PROCESS_KITT_IDENITIES_GET,
+ "Find NO data-set with already matchted eID during ZMR KITT process");
+
+ } else {
+ List<PersonErgebnisSatzType> personErgebnisSatz =
+ searchPersonResp.getPersonensuchergebnis().getPersonErgebnisSatz();
+ if (personErgebnisSatz.size() > 1) {
+ log.error("Find more than on person with aleady matched information.");
+ throw new WorkflowException(PROCESS_KITT_IDENITIES_GET,
+ "Find MORE-THAN-ONE data-sets with already matchted eID during ZMR KITT process");
+
+ } else {
+ return personErgebnisSatz.get(0).getPersonendaten().getPersonErgebnis().get(0);
+
+ }
+ }
+ }
+
+ private NatuerlichePersonTyp buildSearchNatPerson(String givenName, String familyName, String dateOfBirth) {
+ final NatuerlichePersonTyp searchNatPerson = new NatuerlichePersonTyp();
+ final PersonenNameTyp searchNatPersonName = new PersonenNameTyp();
+ searchNatPerson.setPersonenName(searchNatPersonName);
+ searchNatPersonName.setFamilienname(familyName);
+ searchNatPersonName.setVorname(givenName);
+ searchNatPerson.setGeburtsdatum(dateOfBirth);
+ return searchNatPerson;
+
+ }
+
+ private PostAdresseTyp buildSearchAddress(AdresssucheOutput address) {
+ PostAdresseTyp postAdresse = new PostAdresseTyp();
+ if (StringUtils.isNotBlank(address.getPostleitzahl())) {
+ postAdresse.setPostleitzahl(address.getPostleitzahl());
+ }
+ if (StringUtils.isNotBlank(address.getMunicipality())) {
+ postAdresse.setGemeinde(address.getMunicipality());
+ }
+ if (StringUtils.isNotBlank(address.getVillage())) {
+ postAdresse.setOrtschaft(address.getVillage());
+ }
+ if (StringUtils.isNotBlank(address.getStreet()) || StringUtils.isNotBlank(address.getNumber())) {
+ ZustelladresseTyp zustelladresse = new ZustelladresseTyp();
+ if (StringUtils.isNotBlank(address.getStreet())) {
+ zustelladresse.setStrassenname(address.getStreet());
+ }
+ if (StringUtils.isNotBlank(address.getNumber())) {
+ zustelladresse.setOrientierungsnummer(address.getNumber());
+ }
+ postAdresse.setZustelladresse(zustelladresse);
+ }
+
+ return postAdresse;
+
+ }
+
+ private Collection<? extends EidasIdentitaetAnlageType> selectEidasDocumentsToAdd(
+ PersonErgebnisType zmrPersonToKitt, SimpleEidasData eidData) {
+
+ //TODO: maybe we should re-factor SimpleEidasData to a generic data-model to facilitate arbitrary eIDAS attributes
+ Set<EidasIdentitaetAnlageType> result = new HashSet<>();
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER, eidData.getPseudonym(), true);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth(), false);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName(), false);
+
+ // add MDS attributes as 'eIDAS-Documents' too, because ZMR does not allow a MDS update on regular places.
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_CURRENTGIVENNAME, eidData.getGivenName(), false);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_CURRENTFAMILYNAME, eidData.getFamilyName(), false);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_DATEOFBIRTH, eidData.getDateOfBirth(), false);
+
+ return result;
+
+ }
+
+ private void addEidasDocumentIfNotAvailable(Set<EidasIdentitaetAnlageType> result,
+ PersonErgebnisType zmrPersonToKitt, String citizenCountryCode,
+ String attrName, String attrValue, boolean allowMoreThanOneEntry) {
+
+ if (StringUtils.isEmpty(attrValue)) {
+ log.trace("No eIDAS document: {}. Nothing todo for KITT process ... ", attrName);
+ return;
+
+ }
+
+ // check if eIDAS attribute is already includes an eIDAS-Document
+ boolean alreadyExist = zmrPersonToKitt.getEidasIdentitaet().stream()
+ .filter(el -> el.getEidasWert().equals(attrValue)
+ && el.getEidasArt().equals(attrName)
+ && el.getStaatscode2().equals(citizenCountryCode))
+ .findAny()
+ .isPresent();
+
+ if (!alreadyExist) {
+ // check eIDAS documents already contains a document with this pair of country-code and attribute-name
+ Optional<EidasIdentitaetErgebnisType> oneDocWithNameExists = zmrPersonToKitt.getEidasIdentitaet().stream()
+ .filter(el -> el.getStaatscode2().equals(citizenCountryCode)
+ && el.getEidasArt().equals(attrName))
+ .findAny();
+
+ if (!allowMoreThanOneEntry && oneDocWithNameExists.isPresent()
+ && !oneDocWithNameExists.get().getEidasWert().equals(attrValue)) {
+ log.warn("eIDAS document: {} already exists for country: {} but attribute-value does not match. "
+ + "Skip update process because no multi-value allowed for this ... ",
+ attrName, citizenCountryCode);
+
+ } else {
+ EidasIdentitaetAnlageType eidasDocToAdd = new EidasIdentitaetAnlageType();
+ eidasDocToAdd.setStaatscode2(citizenCountryCode);
+ eidasDocToAdd.setEidasArt(attrName);
+ eidasDocToAdd.setEidasWert(attrValue);
+ log.info("Add eIDAS document: {} for country: {} to ZMR person", attrName, citizenCountryCode);
+ result.add(eidasDocToAdd);
+
+ }
+
+ } else {
+ log.debug("eIDAS document: {} already exists for country: {}. Skip update process for this ... ",
+ attrName, citizenCountryCode);
+
+ }
+ }
+
+ private ZmrRegisterResult updatePersonInZmr(BigInteger zmrProzessId, PersonErgebnisType zmrPersonToKitt,
+ Collection<? extends EidasIdentitaetAnlageType> eidasDocumentToAdd, String citizenCountryCode)
+ throws ServiceFault {
+ final RequestType req = new RequestType();
+
+ // set work-flow client information
+ req.setWorkflowInfoClient(generateWorkFlowInfos(PROCESS_TASK_UPDATE, zmrProzessId));
+ req.setClientInfo(generateClientInfos());
+
+ PersonAendernRequest updateReq = new PersonAendernRequest();
+ req.setPersonAendernRequest(updateReq);
+
+ // set reference elements for person update
+ PersonReferenzType updateRef = new PersonReferenzType();
+ updateRef.setTechnisch(zmrPersonToKitt.getEntityErgebnisReferenz().getTechnisch());
+ updateRef.setZMRZahl(zmrPersonToKitt.getZMRZahl());
+ updateReq.setPersonReferenz(updateRef);
+
+ // set reason from this update
+ PersonAendernInfoType updateInfo = new PersonAendernInfoType();
+ updateInfo.setGrundCode(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_UPDATE_REASON_CODE));
+ updateInfo.setGrundFreitext(basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_ZMRCLIENT_REQ_UPDATE_REASON_TEXT));
+ updateReq.setPersonAendernInfo(updateInfo);
+
+ // add new eIDAS documents that should be added
+ updateReq.getEidasIdentitaetAnlage().addAll(eidasDocumentToAdd);
+
+ // request ZMR
+ log.trace("Requesting ZMR for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE);
+ ResponseType resp = zmrClient.service(req, null);
+ log.trace("Receive response from ZMR for '{}' operation", PROCESS_KITT_IDENITIES_UPDATE);
+
+ return new ZmrRegisterResult(Arrays.asList(
+ mapZmrResponseToRegisterResult(resp.getPersonAendernResponse().getPersonErgebnis(), citizenCountryCode)),
+ extractZmrProcessId(resp.getWorkflowInfoServer()));
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/config/EidasConnectorMessageSource.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/config/EidasConnectorMessageSource.java
new file mode 100644
index 00000000..7a9f472a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/config/EidasConnectorMessageSource.java
@@ -0,0 +1,21 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.config;
+
+import java.util.Arrays;
+import java.util.List;
+
+import at.gv.egiz.eaaf.core.api.logging.IMessageSourceLocation;
+
+/**
+ * Inject eIDAS Connector specific messages into Spring based message-source.
+ *
+ * @author tlenz
+ *
+ */
+public class EidasConnectorMessageSource implements IMessageSourceLocation {
+
+ @Override
+ public List<String> getMessageSourceLocation() {
+ return Arrays.asList("classpath:/messages/eidas_connector_message");
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/controller/AdresssucheController.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/controller/AdresssucheController.java
new file mode 100644
index 00000000..6f49c700
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/controller/AdresssucheController.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.controller;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.CompareToBuilder;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrAddressSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.Adressdaten;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PostAdresseTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.ZustelladresseTyp;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy;
+import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Default process-engine signaling controller.
+ *
+ * @author tlenz
+ */
+@Controller
+@Slf4j
+public class AdresssucheController {
+
+ public static final String PARAM_POSTLEITZAHL = "postleitzahl";
+ public static final String PARAM_MUNIPICALITY = "municipality";
+ public static final String PARAM_VILLAGE = "village";
+ public static final String PARAM_STREET = "street";
+ public static final String PARAM_NUMBER = "number";
+
+ @Autowired
+ private ZmrAddressSoapClient client;
+
+ @Autowired
+ private IPendingRequestIdGenerationStrategy pendingReqGeneration;
+
+ /**
+ * Performs search for addresses in ZMR.
+ */
+ @RequestMapping(value = {MsEidasNodeConstants.ENDPOINT_RESIDENCY_SEARCH}, method = {RequestMethod.POST})
+ public ResponseEntity<AdresssucheResult> search(
+ @RequestParam(PARAM_POSTLEITZAHL) String postleitzahl,
+ @RequestParam(PARAM_MUNIPICALITY) String municipality,
+ @RequestParam(PARAM_VILLAGE) String village,
+ @RequestParam(PARAM_STREET) String street,
+ @RequestParam(PARAM_NUMBER) String number,
+ @RequestParam(EaafConstants.PARAM_HTTP_TARGET_PENDINGREQUESTID) String pendingId) {
+ log.info("Search with '{}', '{}', '{}', '{}', '{}'",
+ postleitzahl.replaceAll("[\r\n]", ""),
+ municipality.replaceAll("[\r\n]", ""),
+ village.replaceAll("[\r\n]", ""),
+ street.replaceAll("[\r\n]", ""),
+ number.replaceAll("[\r\n]", ""));
+ try {
+ pendingReqGeneration.validateAndGetPendingRequestId(pendingId);
+
+ } catch (PendingReqIdValidationException e) {
+ log.warn("Search with pendingId '{}' is not valid", pendingId.replaceAll("[\r\n]", ""));
+ return ResponseEntity.badRequest().build();
+
+ }
+
+ try {
+ Adressdaten searchInput = buildSearchInput(postleitzahl, municipality, village, street, number);
+ ZmrAddressSoapClient.AddressInfo searchOutput = client.searchAddress(searchInput);
+ AdresssucheResult output = buildResponse(searchOutput);
+ return ResponseEntity.ok(output);
+
+ } catch (EidasSAuthenticationException e) {
+ log.warn("Search failed", e);
+ return ResponseEntity.badRequest().build();
+
+ }
+ }
+
+ private AdresssucheResult buildResponse(ZmrAddressSoapClient.AddressInfo searchOutput) {
+ if (searchOutput.getPersonResult().isEmpty()) {
+ log.warn("No result from ZMR");
+ return new AdresssucheResult(Collections.emptyList(), 0);
+
+ }
+
+ log.info("Result level is {}", searchOutput.getLevel());
+ Set<AdresssucheOutput> result = searchOutput.getPersonResult().stream()
+ .map(Adressdaten::getPostAdresse)
+ .map(it -> new AdresssucheOutput(it.getPostleitzahl(), it.getGemeinde(), it.getOrtschaft(),
+ it.getZustelladresse().getStrassenname(), it.getZustelladresse().getOrientierungsnummer()))
+ .collect(Collectors.toSet());
+ // TODO Add configuration option for the limit of 30
+ List<AdresssucheOutput> sorted = result.stream().sorted().limit(30).collect(Collectors.toList());
+ return new AdresssucheResult(sorted, result.size());
+
+ }
+
+ private Adressdaten buildSearchInput(String postleitzahl,
+ String municipality,
+ String village,
+ String street,
+ String number) {
+ PostAdresseTyp postAdresse = new PostAdresseTyp();
+ if (StringUtils.isNotBlank(postleitzahl)) {
+ postAdresse.setPostleitzahl(postleitzahl);
+ }
+ if (StringUtils.isNotBlank(municipality)) {
+ postAdresse.setGemeinde(municipality);
+ }
+ if (StringUtils.isNotBlank(village)) {
+ postAdresse.setOrtschaft(village);
+ }
+ if (StringUtils.isNotBlank(street) || StringUtils.isNotBlank(number)) {
+ ZustelladresseTyp zustelladresse = new ZustelladresseTyp();
+ if (StringUtils.isNotBlank(street)) {
+ zustelladresse.setStrassenname(street);
+ }
+ if (StringUtils.isNotBlank(number)) {
+ zustelladresse.setOrientierungsnummer(number);
+ }
+ postAdresse.setZustelladresse(zustelladresse);
+ }
+ Adressdaten searchInput = new Adressdaten();
+ searchInput.setPostAdresse(postAdresse);
+ return searchInput;
+
+ }
+
+ @Data
+ @AllArgsConstructor
+ public static class AdresssucheResult {
+ private final Collection<AdresssucheOutput> results;
+ private final int resultCount;
+ }
+
+ @Data
+ @AllArgsConstructor
+ @Builder
+ public static class AdresssucheOutput implements Comparable<AdresssucheOutput> {
+ private final String postleitzahl;
+ private final String municipality;
+ private final String village;
+ private final String street;
+ private final String number;
+
+ @Override
+ public int compareTo(@NotNull AdresssucheOutput o) {
+ return new CompareToBuilder()
+ .append(this.postleitzahl, o.postleitzahl)
+ .append(this.municipality, o.municipality)
+ .append(this.village, o.village)
+ .append(this.street, o.street)
+ .append(this.number, o.number)
+ .toComparison();
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MatchedPersonResult.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MatchedPersonResult.java
new file mode 100644
index 00000000..1dcea7fc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/MatchedPersonResult.java
@@ -0,0 +1,45 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao;
+
+import java.io.Serializable;
+
+import lombok.Builder;
+import lombok.Getter;
+
+/**
+ * Information about a natural person that is already matched.
+ *
+ * @author tlenz
+ *
+ */
+@Getter
+@Builder
+public class MatchedPersonResult implements Serializable {
+
+ private static final long serialVersionUID = 9110998952621456281L;
+
+ /**
+ * Matched person result from matching result.
+ *
+ * @param matchingResult Result of the matching process
+ * @param citizenCountryCode Country-Code of the eIDAS Proxy-Service
+ */
+ public static MatchedPersonResult generateFormMatchingResult(RegisterResult matchingResult,
+ String citizenCountryCode) {
+ return MatchedPersonResult.builder()
+ .familyName(matchingResult.getFamilyName())
+ .givenName(matchingResult.getGivenName())
+ .dateOfBirth(matchingResult.getDateOfBirth())
+ .bpk(matchingResult.getBpk())
+ .countryCode(citizenCountryCode)
+ .build();
+ }
+
+ private final String countryCode;
+ private final String givenName;
+ private final String familyName;
+ private final String dateOfBirth;
+ private final String bpk;
+
+ private String vsz;
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java
new file mode 100644
index 00000000..e5878ff3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/RegisterResult.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao;
+
+import java.io.Serializable;
+import java.util.List;
+
+import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType;
+import lombok.Builder;
+import lombok.Getter;
+
+@Builder
+@Getter
+public class RegisterResult implements Serializable {
+
+ private static final long serialVersionUID = 762728480185716130L;
+
+ // MDS
+ private final List<String> pseudonym;
+ private final String givenName;
+ private final String familyName;
+ private final String dateOfBirth;
+
+ // additional attributes
+ private String placeOfBirth;
+ private String birthName;
+ private String taxNumber;
+ private PostalAddressType address;
+
+ private String bpk;
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SelectedLoginMethod.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SelectedLoginMethod.java
new file mode 100644
index 00000000..70904e4f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SelectedLoginMethod.java
@@ -0,0 +1,5 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao;
+
+public enum SelectedLoginMethod {
+ EIDAS_LOGIN, MOBILE_PHONE_SIGNATURE_LOGIN, NO_OTHER_LOGIN, ADD_ME_AS_NEW
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java
new file mode 100644
index 00000000..aca5025f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleEidasData.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+
+import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder(toBuilder = true)
+public class SimpleEidasData implements Serializable {
+
+ private static final long serialVersionUID = 2848914124372968418L;
+
+ /**
+ * Full eIDAS personal identifier with prefix.
+ */
+ private final String personalIdentifier;
+
+ /**
+ * Citizen country-code from eIDAS personal-identifier.
+ */
+ private final String citizenCountryCode;
+
+ // MDS
+ /**
+ * eIDAS personal identifier without prefix.
+ */
+ private final String pseudonym;
+ private final String givenName;
+ private final String familyName;
+ private final String dateOfBirth;
+
+ // additional attributes
+ private final String placeOfBirth;
+ private final String birthName;
+ private final PostalAddressType address;
+ private final String taxNumber;
+
+ /**
+ * Compares the register result with the EIDAS data (given name, family name, date of birth, personal identifier).
+ *
+ * @param result The register data to use for comparison
+ * @return whether the data (given name, family name, date of birth, personal identifier) match
+ */
+ public boolean equalsRegisterData(RegisterResult result) {
+ return new EqualsBuilder()
+ .append(result.getGivenName(), givenName)
+ .append(result.getFamilyName(), familyName)
+ .append(result.getDateOfBirth(), dateOfBirth)
+ .appendSuper(result.getPseudonym().stream().anyMatch(el -> el.equals(pseudonym)))
+ .appendSuper(checkOptionalAttributes(result.getPlaceOfBirth(), placeOfBirth))
+ .appendSuper(checkOptionalAttributes(result.getBirthName(), birthName))
+ .isEquals();
+
+ }
+
+ /**
+ * Checks if the MDS (<code>givenName</code>, <code>familyName</code>,
+ * <code>dateOfBirth</code>) matches.
+ */
+ public boolean equalsMds(SimpleEidasData other) {
+ return new EqualsBuilder()
+ .append(other.givenName, givenName)
+ .append(other.familyName, familyName)
+ .append(other.dateOfBirth, dateOfBirth)
+ .isEquals();
+ }
+
+ /**
+ * Check if eIDAS attribute is available.
+ *
+ * @param registerData Attribute value from register
+ * @param eidasData Attribute value from eIDAS
+ * @return <code>true</code> if eidasData is <code>null</code> or eidasData does not match to register value,
+ * otherwise <code>false</code>
+ */
+ private static boolean checkOptionalAttributes(String registerData, String eidasData) {
+ return eidasData == null || eidasData.equals(registerData);
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleMobileSignatureData.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleMobileSignatureData.java
new file mode 100644
index 00000000..54cb3f31
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/dao/SimpleMobileSignatureData.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.dao;
+
+import java.io.Serializable;
+
+import org.apache.commons.lang3.builder.EqualsBuilder;
+
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+public class SimpleMobileSignatureData implements Serializable {
+
+ private static final long serialVersionUID = 7775305733438275312L;
+
+ private final String bpk;
+ private final String givenName;
+ private final String familyName;
+ private final String dateOfBirth;
+
+ /**
+ * Compares the received authentication data from the mobile phone signature with the eid data received via eIDAS.
+ *
+ * @param simpleEidasData The extracted eIDAS data
+ * @return Returns true, if the eIDAS data matches the mobile phone signature data and false otherwise.
+ */
+ public boolean equalsSimpleEidasData(SimpleEidasData simpleEidasData) {
+ return new EqualsBuilder()
+ .append(simpleEidasData.getGivenName(), givenName)
+ .append(simpleEidasData.getFamilyName(), familyName)
+ .append(simpleEidasData.getDateOfBirth(), dateOfBirth)
+ .isEquals();
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java
new file mode 100644
index 00000000..dabb73dc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/ernp/DummyErnpClient.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.ernp;
+
+import java.util.Collections;
+
+import org.springframework.stereotype.Service;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+@Service("ErnbClientForeIDAS")
+public class DummyErnpClient implements IErnpClient {
+
+
+ @Override
+ public ErnpRegisterResult searchWithPersonIdentifier(String personIdentifier, String citizenCountryCode)
+ throws EidasSAuthenticationException {
+ return buildEmptyResult();
+ }
+
+ @Override
+ public ErnpRegisterResult searchWithMds(String givenName, String familyName, String dateOfBirth,
+ String citizenCountryCode) throws EidasSAuthenticationException {
+ return buildEmptyResult();
+ }
+
+ @Override
+ public ErnpRegisterResult searchCountrySpecific(PersonSuchenRequest personSearchDao,
+ String citizenCountryCode) throws EidasSAuthenticationException {
+ return buildEmptyResult();
+ }
+
+ @Override
+ public ErnpRegisterResult update(RegisterResult registerResult, SimpleEidasData eidData)
+ throws EidasSAuthenticationException {
+ return buildEmptyResult();
+ }
+
+ @Override
+ public ErnpRegisterResult searchWithResidenceData(String givenName, String familyName, String dateOfBirth,
+ String zipcode, String city, String street) {
+ return buildEmptyResult();
+ }
+
+ private static ErnpRegisterResult buildEmptyResult() {
+ return new ErnpRegisterResult(Collections.emptyList());
+
+ }
+
+ @Override
+ public ErnpRegisterResult add(SimpleEidasData eidData) throws EidasSAuthenticationException {
+ return buildEmptyResult();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ErnpRestCommunicationException.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ErnpRestCommunicationException.java
new file mode 100644
index 00000000..566a8fa4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ErnpRestCommunicationException.java
@@ -0,0 +1,29 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.exception;
+
+import java.io.IOException;
+
+import lombok.Getter;
+
+/**
+ * ERnP exception in case of a REST communication error.
+ *
+ * @author tlenz
+ *
+ */
+public class ErnpRestCommunicationException extends IOException {
+ private static final long serialVersionUID = -3178689122077228976L;
+
+ @Getter
+ int httpStatusCode;
+
+ /**
+ * ERnP communication error on HTTP REST level.
+ *
+ * @param rawStatusCode HTTP statuscode
+ */
+ public ErnpRestCommunicationException(int rawStatusCode) {
+ super("ERnP service answers with an error and HTTP status-code: " + rawStatusCode);
+ this.httpStatusCode = rawStatusCode;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java
new file mode 100644
index 00000000..cf69bd2c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ManualFixNecessaryException.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+*/
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.exception;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+
+public class ManualFixNecessaryException extends EidasSAuthenticationException {
+ private static final long serialVersionUID = 1L;
+
+ //TODO: should we pass some infos?
+ public ManualFixNecessaryException(String personIdentifier) {
+ super("module.eidasauth.matching.04", new Object[] { personIdentifier });
+ }
+
+ public ManualFixNecessaryException(SimpleEidasData eidData) {
+ super("module.eidasauth.matching.04", new Object[] { eidData.getPseudonym() });
+ }
+
+ public ManualFixNecessaryException(SimpleEidasData eidData, Throwable e) {
+ super("module.eidasauth.matching.04", new Object[] { eidData.getPseudonym() }, e);
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java
new file mode 100644
index 00000000..795b4386
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/WorkflowException.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.exception;
+
+import lombok.Getter;
+
+@Getter
+public class WorkflowException extends EidasSAuthenticationException {
+ private static final long serialVersionUID = 1L;
+
+ private String processStepName;
+ private String errorReason;
+ private boolean requiresManualFix = false;
+
+ /**
+ * In case of a error during matching work-flow.
+ *
+ * @param processStep Matching step identifier
+ * @param errorReason Reason for this error
+ */
+ public WorkflowException(String processStep, String errorReason) {
+ super("module.eidasauth.matching.03", new Object[]{processStep, errorReason});
+ this.processStepName = processStep;
+ this.errorReason = errorReason;
+
+ }
+
+ /**
+ * In case of a error during matching work-flow.
+ *
+ * @param processStep Matching step identifier
+ * @param errorReason Reason for this error
+ * @param e Catched exception
+ */
+ public WorkflowException(String processStep, String errorReason, Throwable e) {
+ super("module.eidasauth.matching.03", new Object[]{processStep, errorReason}, e);
+ this.processStepName = processStep;
+ this.errorReason = errorReason;
+
+ }
+
+ /**
+ * In case of a error during matching work-flow.
+ *
+ * @param processStep Matching step identifier
+ * @param errorReason Reason for this error
+ * @param needsManualFix Mark this work-flow as manually fixable
+ */
+ public WorkflowException(String processStep, String errorReason, boolean needsManualFix) {
+ super("module.eidasauth.matching.03", new Object[]{processStep, errorReason});
+ this.processStepName = processStep;
+ this.errorReason = errorReason;
+ this.requiresManualFix = needsManualFix;
+
+ }
+
+ /**
+ * In case of a error during matching work-flow.
+ *
+ * @param processStep Matching step identifier
+ * @param errorReason Reason for this error
+ * @param needsManualFix Mark this work-flow as manually fixable
+ * @param e Catched exception
+ */
+ public WorkflowException(String processStep, String errorReason, boolean needsManualFix, Throwable e) {
+ super("module.eidasauth.matching.03", new Object[]{processStep, errorReason}, e);
+ this.processStepName = processStep;
+ this.errorReason = errorReason;
+ this.requiresManualFix = needsManualFix;
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ZmrCommunicationException.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ZmrCommunicationException.java
new file mode 100644
index 00000000..a6978458
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/exception/ZmrCommunicationException.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2018 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+*/
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.exception;
+
+public class ZmrCommunicationException extends EidasSAuthenticationException {
+
+ private static final long serialVersionUID = 1L;
+
+ public ZmrCommunicationException(String internalMsgId, Object[] params) {
+ super(internalMsgId, params);
+ }
+
+ public ZmrCommunicationException(String internalMsgId, Object[] params, Throwable e) {
+ super(internalMsgId, params, e);
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java
index 323a37e2..60138027 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/AbstractEidProcessor.java
@@ -23,6 +23,11 @@
package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;
+
+
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils.processCountryCode;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils.processDateOfBirthToString;
+
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
@@ -33,15 +38,13 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import com.google.common.collect.ImmutableSortedSet;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
@@ -51,15 +54,14 @@ import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.data.EaafConstants;
import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;
import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
-import at.gv.egiz.eaaf.core.impl.data.Triple;
import eu.eidas.auth.commons.attribute.AttributeDefinition;
import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
import eu.eidas.auth.commons.light.impl.LightRequest.Builder;
import eu.eidas.auth.commons.protocol.eidas.SpType;
-import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
+import lombok.extern.slf4j.Slf4j;
+@Slf4j
public abstract class AbstractEidProcessor implements INationalEidProcessor {
- private static final Logger log = LoggerFactory.getLogger(AbstractEidProcessor.class);
@Autowired
protected EidasAttributeRegistry attrRegistry;
@@ -72,39 +74,40 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
buildLevelOfAssurance(pendingReq.getServiceProviderConfiguration(), authnRequestBuilder);
buildProviderNameAndRequesterIdAttribute(pendingReq, authnRequestBuilder);
buildRequestedAttributes(authnRequestBuilder);
-
}
@Override
- public final ErnbEidData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
+ public final SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
EidasAttributeException {
- final ErnbEidData result = new ErnbEidData();
-
- final Object eIdentifierObj = eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
- final Triple<String, String, String> eIdentifier =
- EidasResponseUtils.parseEidasPersonalIdentifier((String) eIdentifierObj);
- result.setCitizenCountryCode(eIdentifier.getFirst());
-
- // MDS attributes
- result.setPseudonym(processPseudonym(eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)));
- result.setFamilyName(processFamilyName(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTFAMILYNAME)));
- result.setGivenName(processGivenName(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTGIVENNAME)));
- result.setDateOfBirth(processDateOfBirth(eidasAttrMap.get(Constants.eIDAS_ATTR_DATEOFBIRTH)));
-
- // additional attributes
- result.setPlaceOfBirth(processPlaceOfBirth(eidasAttrMap.get(Constants.eIDAS_ATTR_PLACEOFBIRTH)));
- result.setBirthName(processBirthName(eidasAttrMap.get(Constants.eIDAS_ATTR_BIRTHNAME)));
- result.setAddress(processAddress(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTADDRESS)));
-
- return result;
-
+ SimpleEidasData.SimpleEidasDataBuilder builder = SimpleEidasData.builder()
+ .personalIdentifier(EidasResponseUtils.processPersonalIdentifier(
+ eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)))
+
+ // MDS attributes
+ .citizenCountryCode(processCountryCode(eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)))
+ .pseudonym(processPseudonym(eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER)))
+ .familyName(processFamilyName(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTFAMILYNAME)))
+ .givenName(processGivenName(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTGIVENNAME)))
+ .dateOfBirth(processDateOfBirthToString(eidasAttrMap.get(Constants.eIDAS_ATTR_DATEOFBIRTH)))
+
+ // additional attributes
+ .placeOfBirth(processPlaceOfBirth(eidasAttrMap.get(Constants.eIDAS_ATTR_PLACEOFBIRTH)))
+ .birthName(processBirthName(eidasAttrMap.get(Constants.eIDAS_ATTR_BIRTHNAME)))
+ .address(processAddress(eidasAttrMap.get(Constants.eIDAS_ATTR_CURRENTADDRESS)));
+
+ if (eidasAttrMap.containsKey(Constants.eIDAS_ATTR_TAXREFERENCE)) {
+ builder.taxNumber(EidasResponseUtils.processTaxReference(eidasAttrMap.get(Constants.eIDAS_ATTR_TAXREFERENCE)));
+
+ }
+
+ return builder.build();
}
-
+
/**
* Get a Map of country-specific requested attributes.
- *
+ *
* @return
*/
@NonNull
@@ -112,7 +115,7 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
/**
* Post-Process the eIDAS CurrentAddress attribute.
- *
+ *
* @param currentAddressObj eIDAS current address information
* @return current address or null if no attribute is available
* @throws EidPostProcessingException if post-processing fails
@@ -120,34 +123,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected PostalAddressType processAddress(Object currentAddressObj) throws EidPostProcessingException,
EidasAttributeException {
-
- if (currentAddressObj != null) {
- if (currentAddressObj instanceof PostalAddress) {
- final PostalAddressType result = new PostalAddressType();
- result.setPostalCode(((PostalAddress) currentAddressObj).getPostCode());
- result.setMunicipality(((PostalAddress) currentAddressObj).getPostName());
-
- // TODO: add more mappings
-
- return result;
-
- } else {
- log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_CURRENTADDRESS + " is of WRONG type");
- throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTADDRESS);
-
- }
-
- } else {
- log.debug("NO '" + Constants.eIDAS_ATTR_CURRENTADDRESS + "' attribute. Post-Processing skipped ... ");
- }
-
- return null;
-
+ return EidasResponseUtils.processAddress(currentAddressObj);
}
/**
* Post-Process the eIDAS BirthName attribute.
- *
+ *
* @param birthNameObj eIDAS birthname information
* @return birthName or null if no attribute is available
* @throws EidPostProcessingException if post-processing fails
@@ -155,27 +136,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected String processBirthName(Object birthNameObj) throws EidPostProcessingException,
EidasAttributeException {
- if (birthNameObj != null) {
- if (birthNameObj instanceof String) {
- return (String) birthNameObj;
-
- } else {
- log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_BIRTHNAME + " is of WRONG type");
- throw new EidasAttributeException(Constants.eIDAS_ATTR_BIRTHNAME);
-
- }
-
- } else {
- log.debug("NO '" + Constants.eIDAS_ATTR_BIRTHNAME + "' attribute. Post-Processing skipped ... ");
- }
-
- return null;
-
+ return EidasResponseUtils.processBirthName(birthNameObj);
}
/**
* Post-Process the eIDAS PlaceOfBirth attribute.
- *
+ *
* @param placeOfBirthObj eIDAS Place-of-Birth information
* @return place of Birth or null if no attribute is available
* @throws EidPostProcessingException if post-processing fails
@@ -183,27 +149,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected String processPlaceOfBirth(Object placeOfBirthObj) throws EidPostProcessingException,
EidasAttributeException {
- if (placeOfBirthObj != null) {
- if (placeOfBirthObj instanceof String) {
- return (String) placeOfBirthObj;
-
- } else {
- log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_PLACEOFBIRTH + " is of WRONG type");
- throw new EidasAttributeException(Constants.eIDAS_ATTR_PLACEOFBIRTH);
-
- }
-
- } else {
- log.debug("NO '" + Constants.eIDAS_ATTR_PLACEOFBIRTH + "' attribute. Post-Processing skipped ... ");
- }
-
- return null;
-
+ return EidasResponseUtils.processPlaceOfBirth(placeOfBirthObj);
}
/**
* Post-Process the eIDAS DateOfBirth attribute.
- *
+ *
* @param dateOfBirthObj eIDAS date-of-birth attribute information
* @return formated user's date-of-birth
* @throws EidasAttributeException if NO attribute is available
@@ -211,17 +162,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected DateTime processDateOfBirth(Object dateOfBirthObj) throws EidPostProcessingException,
EidasAttributeException {
- if (dateOfBirthObj == null || !(dateOfBirthObj instanceof DateTime)) {
- throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);
- }
-
- return (DateTime) dateOfBirthObj;
-
+ return EidasResponseUtils.processDateOfBirth(dateOfBirthObj);
}
/**
* Post-Process the eIDAS GivenName attribute.
- *
+ *
* @param givenNameObj eIDAS givenName attribute information
* @return formated user's givenname
* @throws EidasAttributeException if NO attribute is available
@@ -229,17 +175,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected String processGivenName(Object givenNameObj) throws EidPostProcessingException,
EidasAttributeException {
- if (givenNameObj == null || !(givenNameObj instanceof String)) {
- throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTGIVENNAME);
- }
-
- return (String) givenNameObj;
-
+ return EidasResponseUtils.processGivenName(givenNameObj);
}
/**
* Post-Process the eIDAS FamilyName attribute.
- *
+ *
* @param familyNameObj eIDAS familyName attribute information
* @return formated user's familyname
* @throws EidasAttributeException if NO attribute is available
@@ -247,17 +188,12 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected String processFamilyName(Object familyNameObj) throws EidPostProcessingException,
EidasAttributeException {
- if (familyNameObj == null || !(familyNameObj instanceof String)) {
- throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTFAMILYNAME);
- }
-
- return (String) familyNameObj;
-
+ return EidasResponseUtils.processFamilyName(familyNameObj);
}
/**
* Post-Process the eIDAS pseudonym to ERnB unique identifier.
- *
+ *
* @param personalIdObj eIDAS PersonalIdentifierAttribute
* @return Unique personal identifier without country-code information
* @throws EidasAttributeException if NO attribute is available
@@ -265,15 +201,7 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
*/
protected String processPseudonym(Object personalIdObj) throws EidPostProcessingException,
EidasAttributeException {
- if (personalIdObj == null || !(personalIdObj instanceof String)) {
- throw new EidasAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
- }
-
- final Triple<String, String, String> eIdentifier =
- EidasResponseUtils.parseEidasPersonalIdentifier((String) personalIdObj);
-
- return eIdentifier.getThird();
-
+ return EidasResponseUtils.processPseudonym(personalIdObj);
}
/**
@@ -391,6 +319,7 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
}
protected void buildLevelOfAssurance(ISpConfiguration spConfig, Builder authnRequestBuilder) {
+
// TODO: set matching mode if eIDAS ref. impl. support this method
// TODO: update if eIDAS ref. impl. supports exact matching for non-notified LoA
@@ -412,7 +341,7 @@ public abstract class AbstractEidProcessor implements INationalEidProcessor {
log.debug("Request eIdAS node with LoA: " + loa);
authnRequestBuilder.levelOfAssurance(loa);
-
+
}
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java
new file mode 100644
index 00000000..c2a62f5c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/CountrySpecificDetailSearchProcessor.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;
+
+import javax.annotation.Nonnull;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+public interface CountrySpecificDetailSearchProcessor {
+
+ /**
+ * Get a friendlyName of this post-processor implementation.
+ */
+ String getName();
+
+ /**
+ * Check if this postProcessor is sensitive for a specific country.
+ *
+ * @param countryCode of the eID data that should be processed
+ * @param eidData eID information from eIDAS Proxy-Service
+ * @return true if this implementation can handle the country, otherwise false
+ */
+ boolean canHandle(String countryCode, SimpleEidasData eidData);
+
+ /**
+ * Builds a country-specific search person request for ZMR.
+ *
+ * @param eidData eID information from eIDAS Proxy-Service
+ * @return {@link PersonSuchenRequest} but never <code>null</code>
+ */
+ @Nonnull
+ PersonSuchenRequest generateSearchRequest(SimpleEidasData eidData);
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java
new file mode 100644
index 00000000..e05fe86b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/DeSpecificDetailSearchProcessor.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;
+
+import org.apache.commons.lang3.StringUtils;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.NatuerlichePersonTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PersonenNameTyp;
+
+public class DeSpecificDetailSearchProcessor implements CountrySpecificDetailSearchProcessor {
+
+ @Override
+ public String getName() {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ public boolean canHandle(String countryCode, SimpleEidasData eidData) {
+ return countryCode.equalsIgnoreCase(Constants.COUNTRY_CODE_DE)
+ && StringUtils.isNotEmpty(eidData.getBirthName())
+ && StringUtils.isNotEmpty(eidData.getPlaceOfBirth());
+
+ }
+
+ @Override
+ public PersonSuchenRequest generateSearchRequest(SimpleEidasData eidData) {
+ PersonSuchenRequest req = new PersonSuchenRequest();
+
+ //set basic MDS information
+ final NatuerlichePersonTyp searchNatPerson = new NatuerlichePersonTyp();
+ req.setNatuerlichePerson(searchNatPerson);
+ final PersonenNameTyp searchNatPersonName = new PersonenNameTyp();
+ searchNatPerson.setPersonenName(searchNatPersonName);
+ searchNatPersonName.setFamilienname(eidData.getFamilyName());
+ searchNatPersonName.setVorname(eidData.getGivenName());
+ searchNatPerson.setGeburtsdatum(eidData.getDateOfBirth());
+
+ //add addtional eIDAS attributes from DE
+ req.getEidasSuchdaten().add(buildEidasSuchData(
+ Constants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth()));
+ req.getEidasSuchdaten().add(buildEidasSuchData(
+ Constants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName()));
+
+ return req;
+
+ }
+
+ private EidasSuchdatenType buildEidasSuchData(String attrName, String attrValue) {
+ EidasSuchdatenType eidasInfos = new EidasSuchdatenType();
+ eidasInfos.setStaatscode2(Constants.COUNTRY_CODE_DE);
+ eidasInfos.setEidasArt(attrName);
+ eidasInfos.setEidasWert(attrValue);
+ return eidasInfos;
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/INationalEidProcessor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/INationalEidProcessor.java
index 577efbcd..79a261fe 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/INationalEidProcessor.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/INationalEidProcessor.java
@@ -25,7 +25,7 @@ package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;
import java.util.Map;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
import at.gv.egiz.eaaf.core.api.IRequest;
@@ -36,7 +36,7 @@ public interface INationalEidProcessor {
/**
* Get a friendlyName of this post-processor implementation.
- *
+ *
* @return
*/
String getName();
@@ -46,34 +46,34 @@ public interface INationalEidProcessor {
* If more than one Post-Processor implementations can handle the eID data, the
* post-processor with the highest priority are selected. The Default-Processor
* has priority '0'
- *
+ *
* @return Priority of this handler
*/
int getPriority();
/**
* Check if this postProcessor is sensitive for a specific country.
- *
+ *
* @param countryCode of the eID data that should be processed
* @return true if this implementation can handle the country, otherwise false
- *
+ *
*/
boolean canHandle(String countryCode);
/**
* Post-Process eIDAS eID data into national format.
- *
+ *
* @param eidasAttrMap Map of eIDAS attributes in format friendlyName and
* attribute
* @throws EidPostProcessingException In case of a post-processing error
* @throws EidasAttributeException In case of an invalid eIDAS attribute
*/
- ErnbEidData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
+ SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
EidasAttributeException;
/**
* Pre-Process eIDAS Request to national requirements.
- *
+ *
* @param pendingReq current pending request
* @param authnRequestBuilder eIDAS {@link ILightRequest} builder
*/
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java
new file mode 100644
index 00000000..b49c355d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/handler/ItSpecificDetailSearchProcessor.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.handler;
+
+import org.apache.commons.lang3.StringUtils;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+public class ItSpecificDetailSearchProcessor implements CountrySpecificDetailSearchProcessor {
+
+ @Override
+ public String getName() {
+ return this.getClass().getSimpleName();
+ }
+
+ @Override
+ public boolean canHandle(String countryCode, SimpleEidasData eidData) {
+ return countryCode.equalsIgnoreCase(Constants.COUNTRY_CODE_IT)
+ && StringUtils.isNotEmpty(eidData.getTaxNumber());
+
+ }
+
+ @Override
+ public PersonSuchenRequest generateSearchRequest(SimpleEidasData eidData) {
+
+ //TODO: add IT specific search request if TaxNumber attribute is defined by IT
+ return new PersonSuchenRequest();
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthConstants.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthConstants.java
new file mode 100644
index 00000000..67dfd7d8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthConstants.java
@@ -0,0 +1,102 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient;
+
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
+import at.gv.egiz.eaaf.core.impl.data.Triple;
+
+
+public class IdAustriaClientAuthConstants {
+
+ private IdAustriaClientAuthConstants() {
+
+ }
+
+ public static final String ERRORCODE_02 = "module.eidasauth.idaustria.02";
+ public static final String ERRORCODE_05 = "module.eidasauth.idaustria.05";
+
+ public static final String SAML2_STATUSCODE_USERSTOP = "1005";
+
+ public static final String MODULE_NAME_FOR_LOGGING = "ID Austria Client";
+
+ public static final int METADATA_VALIDUNTIL_IN_HOURS = 24;
+
+ // public static final String HTTP_PARAM_CENTRAL_EIDAS_AUTH_SELECTION =
+ // AuthHandlerConstants.HTTP_PARAM_EIDAS_PROCESS;
+
+ public static final String ENDPOINT_POST = "/sp/idaustria/post";
+ public static final String ENDPOINT_REDIRECT = "/sp/idaustria/redirect";
+ public static final String ENDPOINT_METADATA = "/sp/idaustria/metadata";
+
+ public static final String CONFIG_PROPS_PREFIX = "modules.idaustriaclient.";
+ public static final String CONFIG_PROPS_KEYSTORE_TYPE = CONFIG_PROPS_PREFIX + "keystore.type";
+ public static final String CONFIG_PROPS_KEYSTORE_NAME = CONFIG_PROPS_PREFIX + "keystore.name";
+ public static final String CONFIG_PROPS_KEYSTORE_PATH = CONFIG_PROPS_PREFIX + "keystore.path";
+ public static final String CONFIG_PROPS_KEYSTORE_PASSWORD = CONFIG_PROPS_PREFIX + "keystore.password";
+ public static final String CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD = CONFIG_PROPS_PREFIX
+ + "metadata.sign.password";
+ public static final String CONFIG_PROPS_SIGN_METADATA_ALIAS = CONFIG_PROPS_PREFIX
+ + "metadata.sign.alias";
+ public static final String CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD = CONFIG_PROPS_PREFIX
+ + "request.sign.password";
+ public static final String CONFIG_PROPS_SIGN_SIGNING_ALIAS = CONFIG_PROPS_PREFIX
+ + "request.sign.alias";
+ public static final String CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD = CONFIG_PROPS_PREFIX
+ + "response.encryption.password";
+ public static final String CONFIG_PROPS_ENCRYPTION_ALIAS = CONFIG_PROPS_PREFIX
+ + "response.encryption.alias";
+
+ public static final String CONFIG_PROPS_TRUSTSTORE_TYPE = CONFIG_PROPS_PREFIX + "truststore.type";
+ public static final String CONFIG_PROPS_TRUSTSTORE_NAME = CONFIG_PROPS_PREFIX + "truststore.name";
+ public static final String CONFIG_PROPS_TRUSTSTORE_PATH = CONFIG_PROPS_PREFIX + "truststore.path";
+ public static final String CONFIG_PROPS_TRUSTSTORE_PASSWORD = CONFIG_PROPS_PREFIX + "truststore.password";
+
+ public static final String CONFIG_PROPS_REQUIRED_PVP_ATTRIBUTES_LIST = CONFIG_PROPS_PREFIX
+ + "required.additional.attributes";
+ public static final String CONFIG_PROPS_REQUIRED_LOA = CONFIG_PROPS_PREFIX
+ + "required.loa";
+ public static final String CONFIG_PROPS_ID_AUSTRIA_ENTITYID = CONFIG_PROPS_PREFIX + "idaustria.idp.entityId";
+ public static final String CONFIG_PROPS_ID_AUSTRIA_METADATAURL = CONFIG_PROPS_PREFIX + "idaustria.idp.metadataUrl";
+
+ public static final String CONFIG_DEFAULT_LOA_EIDAS_LEVEL = EaafConstants.EIDAS_LOA_HIGH;
+
+ public static final List<Triple<String, String, Boolean>> DEFAULT_REQUIRED_PVP_ATTRIBUTES =
+ Collections.unmodifiableList(new ArrayList<Triple<String, String, Boolean>>() {
+ private static final long serialVersionUID = 1L;
+
+ {
+ // entity metadata information
+ add(Triple.newInstance(PvpAttributeDefinitions.EID_CITIZEN_EIDAS_QAA_LEVEL_NAME,
+ PvpAttributeDefinitions.EID_CITIZEN_EIDAS_QAA_LEVEL_FRIENDLY_NAME, true));
+ add(Triple.newInstance(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME,
+ PvpAttributeDefinitions.EID_ISSUING_NATION_FRIENDLY_NAME, true));
+
+ add(Triple.newInstance(PvpAttributeDefinitions.PRINCIPAL_NAME_NAME,
+ PvpAttributeDefinitions.PRINCIPAL_NAME_FRIENDLY_NAME, true));
+ add(Triple.newInstance(PvpAttributeDefinitions.GIVEN_NAME_NAME,
+ PvpAttributeDefinitions.GIVEN_NAME_FRIENDLY_NAME, true));
+ add(Triple.newInstance(PvpAttributeDefinitions.BIRTHDATE_NAME,
+ PvpAttributeDefinitions.BIRTHDATE_FRIENDLY_NAME, true));
+ add(Triple.newInstance(PvpAttributeDefinitions.BPK_NAME,
+ PvpAttributeDefinitions.BPK_FRIENDLY_NAME, true));
+
+ }
+ });
+
+ public static final List<String> DEFAULT_REQUIRED_PVP_ATTRIBUTE_NAMES =
+
+ Collections.unmodifiableList(new ArrayList<String>() {
+ private static final long serialVersionUID = 1L;
+
+ {
+ for (final Triple<String, String, Boolean> el : DEFAULT_REQUIRED_PVP_ATTRIBUTES) {
+ add(el.getFirst());
+ }
+ }
+ });
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthEventConstants.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthEventConstants.java
new file mode 100644
index 00000000..03e570fc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthEventConstants.java
@@ -0,0 +1,7 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient;
+
+public class IdAustriaClientAuthEventConstants {
+
+ public static final int AUTHPROCESS_ID_AUSTRIA_RESPONSE_RECEIVED = 6202;
+ public static final int AUTHPROCESS_ID_AUSTRIA_RESPONSE_RECEIVED_ERROR = 6203;
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthMetadataConfiguration.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthMetadataConfiguration.java
new file mode 100644
index 00000000..4527ced4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthMetadataConfiguration.java
@@ -0,0 +1,463 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.opensaml.saml.saml2.core.Attribute;
+import org.opensaml.saml.saml2.core.NameIDType;
+import org.opensaml.saml.saml2.metadata.ContactPerson;
+import org.opensaml.saml.saml2.metadata.Organization;
+import org.opensaml.saml.saml2.metadata.RequestedAttribute;
+import org.opensaml.security.credential.Credential;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+import at.gv.egiz.eaaf.core.impl.data.Triple;
+import at.gv.egiz.eaaf.modules.pvp2.api.IPvp2BasicConfiguration;
+import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvpMetadataBuilderConfiguration;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.builder.PvpAttributeBuilder;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Configuration object to generate PVP S-Profile metadata for SAML2 client.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class IdAustriaClientAuthMetadataConfiguration implements IPvpMetadataBuilderConfiguration {
+
+ private Collection<RequestedAttribute> additionalAttributes = null;
+
+ private final String authUrl;
+ private final IdAustriaClientAuthCredentialProvider credentialProvider;
+ private final IPvp2BasicConfiguration pvpConfiguration;
+
+ /**
+ * Configuration object to create PVP2 S-Profile metadata information.
+ *
+ * @param authUrl Public URL prefix of the application
+ * @param credentialProvider Credentials used by PVP2 S-Profile end-point
+ * @param pvpConfiguration Basic PVP2 S-Profile end-point configuration
+ */
+ public IdAustriaClientAuthMetadataConfiguration(String authUrl,
+ IdAustriaClientAuthCredentialProvider credentialProvider,
+ IPvp2BasicConfiguration pvpConfiguration) {
+ this.authUrl = authUrl;
+ this.credentialProvider = credentialProvider;
+ this.pvpConfiguration = pvpConfiguration;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getMetadataValidUntil()
+ */
+ @Override
+ public int getMetadataValidUntil() {
+ return IdAustriaClientAuthConstants.METADATA_VALIDUNTIL_IN_HOURS;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * buildEntitiesDescriptorAsRootElement()
+ */
+ @Override
+ public boolean buildEntitiesDescriptorAsRootElement() {
+ return false;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * buildIDPSSODescriptor()
+ */
+ @Override
+ public boolean buildIdpSsoDescriptor() {
+ return false;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * buildSPSSODescriptor()
+ */
+ @Override
+ public boolean buildSpSsoDescriptor() {
+ return true;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getEntityIDPostfix()
+ */
+ @Override
+ public String getEntityID() {
+ return authUrl + IdAustriaClientAuthConstants.ENDPOINT_METADATA;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getEntityFriendlyName()
+ */
+ @Override
+ public String getEntityFriendlyName() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getContactPersonInformation()
+ */
+ @Override
+ public List<ContactPerson> getContactPersonInformation() {
+ try {
+ return pvpConfiguration.getIdpContacts();
+
+ } catch (final EaafException e) {
+ log.warn("Can not load Metadata entry: Contect Person", e);
+ return null;
+
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getOrgansiationInformation()
+ */
+ @Override
+ public Organization getOrgansiationInformation() {
+ try {
+ return pvpConfiguration.getIdpOrganisation();
+
+ } catch (final EaafException e) {
+ log.warn("Can not load Metadata entry: Organisation", e);
+ return null;
+
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getMetadataSigningCredentials()
+ */
+ @Override
+ public EaafX509Credential getMetadataSigningCredentials() throws CredentialsNotAvailableException {
+ return credentialProvider.getMetaDataSigningCredential();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getRequestorResponseSigningCredentials()
+ */
+ @Override
+ public Credential getRequestorResponseSigningCredentials() throws CredentialsNotAvailableException {
+ return credentialProvider.getMessageSigningCredential();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getEncryptionCredentials()
+ */
+ @Override
+ public Credential getEncryptionCredentials() throws CredentialsNotAvailableException {
+ return credentialProvider.getMessageEncryptionCredential();
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPWebSSOPostBindingURL()
+ */
+ @Override
+ public String getIdpWebSsoPostBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPWebSSORedirectBindingURL()
+ */
+ @Override
+ public String getIdpWebSsoRedirectBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPSLOPostBindingURL()
+ */
+ @Override
+ public String getIdpSloPostBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPSLORedirectBindingURL()
+ */
+ @Override
+ public String getIdpSloRedirectBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPAssertionConsumerServicePostBindingURL()
+ */
+ @Override
+ public String getSpAssertionConsumerServicePostBindingUrl() {
+ return authUrl + IdAustriaClientAuthConstants.ENDPOINT_POST;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPAssertionConsumerServiceRedirectBindingURL()
+ */
+ @Override
+ public String getSpAssertionConsumerServiceRedirectBindingUrl() {
+ return authUrl + IdAustriaClientAuthConstants.ENDPOINT_REDIRECT;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPSLOPostBindingURL()
+ */
+ @Override
+ public String getSpSloPostBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPSLORedirectBindingURL()
+ */
+ @Override
+ public String getSpSloRedirectBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPSLOSOAPBindingURL()
+ */
+ @Override
+ public String getSpSloSoapBindingUrl() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPPossibleAttributes()
+ */
+ @Override
+ public List<Attribute> getIdpPossibleAttributes() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getIDPPossibleNameITTypes()
+ */
+ @Override
+ public List<String> getIdpPossibleNameIdTypes() {
+ return null;
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPRequiredAttributes()
+ */
+ @Override
+ public Collection<RequestedAttribute> getSpRequiredAttributes() {
+ final Map<String, RequestedAttribute> requestedAttributes = new HashMap<>();
+
+
+ log.trace("Build required attributes for ID Austria operaton ... ");
+ injectDefinedAttributes(requestedAttributes,
+ IdAustriaClientAuthConstants.DEFAULT_REQUIRED_PVP_ATTRIBUTES);
+
+
+
+ if (additionalAttributes != null) {
+ log.trace("Add additional PVP attributes into metadata ... ");
+ for (final RequestedAttribute el : additionalAttributes) {
+ if (requestedAttributes.containsKey(el.getName())) {
+ log.debug("Attribute " + el.getName()
+ + " is already added by default configuration. Overwrite it by user configuration");
+ }
+ requestedAttributes.put(el.getName(), el);
+ }
+ }
+
+ return requestedAttributes.values();
+
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.builder.AbstractPVPMetadataBuilder#
+ * getSPAllowedNameITTypes()
+ */
+ @Override
+ public List<String> getSpAllowedNameIdTypes() {
+ return Arrays.asList(NameIDType.PERSISTENT);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPMetadataBuilderConfiguration#getSPNameForLogging()
+ */
+ @Override
+ public String getSpNameForLogging() {
+ return IdAustriaClientAuthConstants.MODULE_NAME_FOR_LOGGING;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPMetadataBuilderConfiguration#wantAssertionSigned()
+ */
+ @Override
+ public boolean wantAssertionSigned() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPMetadataBuilderConfiguration#wantAuthnRequestSigned()
+ */
+ @Override
+ public boolean wantAuthnRequestSigned() {
+ return true;
+ }
+
+ /**
+ * Add additonal PVP attributes that are required by this deployment.
+ *
+ * @param additionalAttr List of PVP attribute name and isRequired flag
+ */
+ public void setAdditionalRequiredAttributes(List<Pair<String, Boolean>> additionalAttr) {
+ if (additionalAttr != null && !additionalAttr.isEmpty()) {
+ additionalAttributes = new ArrayList<>();
+ for (final Pair<String, Boolean> el : additionalAttr) {
+ final Attribute attributBuilder = PvpAttributeBuilder.buildEmptyAttribute(el.getFirst());
+ if (attributBuilder != null) {
+ additionalAttributes.add(
+ PvpAttributeBuilder.buildReqAttribute(
+ attributBuilder.getName(),
+ attributBuilder.getFriendlyName(),
+ el.getSecond()));
+
+ } else {
+ log.info("NO PVP attribute with name: " + el.getFirst());
+ }
+
+ }
+ }
+ }
+
+ private void injectDefinedAttributes(Map<String, RequestedAttribute> requestedAttributes,
+ List<Triple<String, String, Boolean>> attributes) {
+ for (final Triple<String, String, Boolean> el : attributes) {
+ requestedAttributes.put(el.getFirst(), PvpAttributeBuilder.buildReqAttribute(el.getFirst(), el
+ .getSecond(), el.getThird()));
+
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthRequestBuilderConfiguration.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthRequestBuilderConfiguration.java
new file mode 100644
index 00000000..65b6a198
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/IdAustriaClientAuthRequestBuilderConfiguration.java
@@ -0,0 +1,300 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient;
+
+import java.util.List;
+
+import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
+import at.gv.egiz.eaaf.modules.pvp2.api.reqattr.EaafRequestedAttribute;
+import at.gv.egiz.eaaf.modules.pvp2.sp.api.IPvpAuthnRequestBuilderConfiguruation;
+
+import org.opensaml.saml.saml2.core.AuthnContextComparisonTypeEnumeration;
+import org.opensaml.saml.saml2.core.NameIDType;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.w3c.dom.Element;
+
+public class IdAustriaClientAuthRequestBuilderConfiguration implements IPvpAuthnRequestBuilderConfiguruation {
+
+ private boolean isPassive;
+ private String spEntityId;
+ private String qaaLevel;
+ private EntityDescriptor idpEntity;
+ private EaafX509Credential signCred;
+ private String scopeRequesterId;
+ private String providerName;
+ private List<EaafRequestedAttribute> requestedAttributes;
+ private String reqId;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#isPassivRequest()
+ */
+ @Override
+ public Boolean isPassivRequest() {
+ return this.isPassive;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getAssertionConsumerServiceId()
+ */
+ @Override
+ public Integer getAssertionConsumerServiceId() {
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getEntityID()
+ */
+ @Override
+ public String getSpEntityID() {
+ return this.spEntityId;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getNameIDPolicy()
+ */
+ @Override
+ public String getNameIdPolicyFormat() {
+ return NameIDType.PERSISTENT;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getNameIDPolicy()
+ */
+ @Override
+ public boolean getNameIdPolicyAllowCreation() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getAuthnContextClassRef()
+ */
+ @Override
+ public String getAuthnContextClassRef() {
+ return this.qaaLevel;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getAuthnContextComparison()
+ */
+ @Override
+ public AuthnContextComparisonTypeEnumeration getAuthnContextComparison() {
+ return AuthnContextComparisonTypeEnumeration.MINIMUM;
+ }
+
+ /**
+ * Set isPassive flag in SAML2 request.
+ *
+ * @param isPassive the isPassive to set.
+ */
+ public void setPassive(boolean isPassive) {
+ this.isPassive = isPassive;
+ }
+
+ /**
+ * Set the requester EntityId.
+ *
+ * @param spEntityId EntityId of SP
+ */
+ public void setSpEntityID(String spEntityId) {
+ this.spEntityId = spEntityId;
+ }
+
+ /**
+ * Set required LoA.
+ *
+ * @param loa the LoA to set.
+ */
+ public void setRequestedLoA(String loa) {
+ qaaLevel = loa;
+ }
+
+ /**
+ * Set EntityId of IDP.
+ *
+ * @param idpEntity the idpEntity to set.
+ */
+ public void setIdpEntity(EntityDescriptor idpEntity) {
+ this.idpEntity = idpEntity;
+ }
+
+ /**
+ * Set message signing credentials.
+ *
+ * @param signCred the signCred to set.
+ */
+ public void setSignCred(EaafX509Credential signCred) {
+ this.signCred = signCred;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getAuthnRequestSigningCredential()
+ */
+ @Override
+ public EaafX509Credential getAuthnRequestSigningCredential() {
+ return this.signCred;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getIDPEntityDescriptor()
+ */
+ @Override
+ public EntityDescriptor getIdpEntityDescriptor() {
+ return this.idpEntity;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSubjectNameID()
+ */
+ @Override
+ public String getSubjectNameID() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSPNameForLogging()
+ */
+ @Override
+ public String getSpNameForLogging() {
+ return IdAustriaClientAuthConstants.MODULE_NAME_FOR_LOGGING;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSubjectNameIDFormat()
+ */
+ @Override
+ public String getSubjectNameIdFormat() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getRequestID()
+ */
+ @Override
+ public String getRequestID() {
+ return this.reqId;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSubjectNameIDQualifier()
+ */
+ @Override
+ public String getSubjectNameIdQualifier() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSubjectConformationMethode()
+ */
+ @Override
+ public String getSubjectConformationMethode() {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.gv.egovernment.moa.id.protocols.pvp2x.config.
+ * IPVPAuthnRequestBuilderConfiguruation#getSubjectConformationDate()
+ */
+ @Override
+ public Element getSubjectConformationDate() {
+ return null;
+ }
+
+ @Override
+ public List<EaafRequestedAttribute> getRequestedAttributes() {
+ return this.requestedAttributes;
+
+ }
+
+ @Override
+ public String getProviderName() {
+ return this.providerName;
+ }
+
+ @Override
+ public String getScopeRequesterId() {
+ return this.scopeRequesterId;
+ }
+
+ /**
+ * Set the entityId of the SP that requests the proxy for eIDAS authentication.
+ *
+ * @param scopeRequesterId RequestId in SAML2 Proxy extension
+ */
+ public void setScopeRequesterId(String scopeRequesterId) {
+ this.scopeRequesterId = scopeRequesterId;
+ }
+
+ /**
+ * Set a friendlyName for the SP that requests the proxy for eIDAS
+ * authentication.
+ *
+ * @param providerName SAML2 provider-name attribute-value
+ */
+ public void setProviderName(String providerName) {
+ this.providerName = providerName;
+ }
+
+ /**
+ * Set a Set of PVP attributes that a requested by using requested attributes.
+ *
+ * @param requestedAttributes Requested SAML2 attributes
+ */
+ public void setRequestedAttributes(List<EaafRequestedAttribute> requestedAttributes) {
+ this.requestedAttributes = requestedAttributes;
+ }
+
+ /**
+ * Set a RequestId for this Authn. Request.
+ *
+ * @param reqId SAML2 message requestId
+ */
+ public void setRequestId(String reqId) {
+ this.reqId = reqId;
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthMetadataController.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthMetadataController.java
new file mode 100644
index 00000000..1e4b27f7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthMetadataController.java
@@ -0,0 +1,122 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller;
+
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.google.common.net.MediaType;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthMetadataConfiguration;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.gv.egiz.eaaf.core.exceptions.EaafAuthenticationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.http.HttpUtils;
+import at.gv.egiz.eaaf.core.impl.idp.controller.AbstractController;
+import at.gv.egiz.eaaf.modules.pvp2.api.IPvp2BasicConfiguration;
+import at.gv.egiz.eaaf.modules.pvp2.impl.builder.PvpMetadataBuilder;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Controller that generates SAML2 metadata for eIDAS authentication client.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+@Controller
+public class IdAustriaClientAuthMetadataController extends AbstractController {
+
+ private static final String ERROR_CODE_INTERNAL_00 = "eaaf.core.00";
+
+ @Autowired
+ PvpMetadataBuilder metadatabuilder;
+ @Autowired
+ IdAustriaClientAuthCredentialProvider credentialProvider;
+ @Autowired
+ IPvp2BasicConfiguration pvpConfiguration;
+
+ /**
+ * Default construction with logging.
+ *
+ */
+ public IdAustriaClientAuthMetadataController() {
+ super();
+ log.debug("Registering servlet " + getClass().getName()
+ + " with mappings '" + IdAustriaClientAuthConstants.ENDPOINT_METADATA
+ + "'.");
+
+ }
+
+ /**
+ * End-point that produce PVP2 metadata for eIDAS authentication client.
+ *
+ * @param req http Request
+ * @param resp http Response
+ * @throws IOException In case of an I/O error
+ * @throws EaafException In case of a metadata generation error
+ */
+ @RequestMapping(value = IdAustriaClientAuthConstants.ENDPOINT_METADATA,
+ method = { RequestMethod.GET })
+ public void getSpMetadata(HttpServletRequest req, HttpServletResponse resp) throws IOException,
+ EaafException {
+ // check PublicURL prefix
+ try {
+ final String authUrl = getAuthUrlFromHttpContext(req);
+
+ // initialize metadata builder configuration
+ final IdAustriaClientAuthMetadataConfiguration metadataConfig =
+ new IdAustriaClientAuthMetadataConfiguration(authUrl, credentialProvider, pvpConfiguration);
+ // metadataConfig.setAdditionalRequiredAttributes(getAdditionalRequiredAttributes());
+
+ // build metadata
+ final String xmlMetadata = metadatabuilder.buildPvpMetadata(metadataConfig);
+
+ // write response
+ final byte[] content = xmlMetadata.getBytes("UTF-8");
+ resp.setStatus(HttpServletResponse.SC_OK);
+ resp.setContentLength(content.length);
+ resp.setContentType(MediaType.XML_UTF_8.toString());
+ resp.getOutputStream().write(content);
+
+ } catch (final Exception e) {
+ log.warn("Build federated-authentication PVP metadata FAILED.", e);
+ protAuthService.handleErrorNoRedirect(e, req, resp, false);
+
+ }
+
+ }
+
+ private String getAuthUrlFromHttpContext(HttpServletRequest req) throws EaafException {
+ // check if End-Point is valid
+ final String authUrlString = HttpUtils.extractAuthUrlFromRequest(req);
+ URL authReqUrl;
+ try {
+ authReqUrl = new URL(authUrlString);
+
+ } catch (final MalformedURLException e) {
+ log.warn("Requested URL: {} is not a valid URL.", authUrlString);
+ throw new EaafAuthenticationException(ERROR_CODE_INTERNAL_00, new Object[] { authUrlString }, e);
+
+ }
+
+ final String idpAuthUrl = authConfig.validateIdpUrl(authReqUrl);
+ if (idpAuthUrl == null) {
+ log.warn("Requested URL: {} is NOT found in configuration.", authReqUrl);
+ throw new EaafAuthenticationException(ERROR_CODE_INTERNAL_00, new Object[] { authUrlString });
+
+ }
+
+ return idpAuthUrl;
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthSignalController.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthSignalController.java
new file mode 100644
index 00000000..eca21683
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/controller/IdAustriaClientAuthSignalController.java
@@ -0,0 +1,95 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller;
+
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.text.StringEscapeUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.idp.controller.AbstractProcessEngineSignalController;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * IdAustria client controller that receives the response from ID Austria system.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+@Controller
+public class IdAustriaClientAuthSignalController extends AbstractProcessEngineSignalController {
+
+ public static final String HTTP_PARAM_RELAYSTATE = "RelayState";
+
+ /**
+ * Default constructor with logging.
+ *
+ */
+ public IdAustriaClientAuthSignalController() {
+ super();
+ log.debug("Registering servlet " + getClass().getName()
+ + " with mappings '" + IdAustriaClientAuthConstants.ENDPOINT_POST
+ + "' and '" + IdAustriaClientAuthConstants.ENDPOINT_REDIRECT + "'.");
+
+ }
+
+ /**
+ * HTTP end-point for incoming SAML2 Response from ID Austria system.
+ *
+ * @param req HTTP request
+ * @param resp HTTP response
+ * @throws IOException In case of a HTTP communication error
+ * @throws EaafException In case of a state-validation problem
+ */
+ @RequestMapping(value = { IdAustriaClientAuthConstants.ENDPOINT_POST,
+ IdAustriaClientAuthConstants.ENDPOINT_REDIRECT },
+ method = { RequestMethod.POST, RequestMethod.GET })
+ public void performAuthentication(HttpServletRequest req, HttpServletResponse resp)
+ throws IOException, EaafException {
+ signalProcessManagement(req, resp);
+
+ }
+
+ /**
+ * Read the PendingRequestId from SAML2 RelayState parameter.
+ */
+ @Override
+ public String getPendingRequestId(HttpServletRequest request) {
+ String relayState = StringEscapeUtils.escapeHtml4(request.getParameter(HTTP_PARAM_RELAYSTATE));
+ if (StringUtils.isNotEmpty(relayState)) {
+ try {
+ String pendingReqId = transactionStorage.get(relayState, String.class);
+ if (StringUtils.isNotEmpty(pendingReqId)) {
+
+ return pendingReqId;
+
+ } else {
+ log.info("SAML2 RelayState from request is unknown. Can NOT restore session ... ");
+
+ }
+
+ } catch (EaafException e) {
+ log.error("Can NOT map SAML2 RelayState to pendingRequestId", e);
+
+ } finally {
+ transactionStorage.remove(relayState);
+
+ }
+
+ } else {
+ log.info("No SAML2 relaystate. Can NOT restore session ... ");
+
+ }
+
+ return null;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthCredentialProvider.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthCredentialProvider.java
new file mode 100644
index 00000000..5b6085c1
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthCredentialProvider.java
@@ -0,0 +1,132 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.AbstractCredentialProvider;
+
+/**
+ * Credential provider for eIDAS PVP S-Profile client.
+ *
+ * @author tlenz
+ *
+ */
+public class IdAustriaClientAuthCredentialProvider extends AbstractCredentialProvider {
+
+ @Autowired
+ IConfiguration authConfig;
+
+ private static final String FRIENDLYNAME = "ID Austria authentication";
+
+ @Override
+ public KeyStoreConfiguration getBasicKeyStoreConfig() throws EaafConfigurationException {
+ final KeyStoreConfiguration keyStoreConfig = new KeyStoreConfiguration();
+ keyStoreConfig.setFriendlyName(FRIENDLYNAME);
+ keyStoreConfig.setKeyStoreType(
+ authConfig.getBasicConfiguration(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_TYPE,
+ KeyStoreType.PKCS12.getKeyStoreType()));
+ keyStoreConfig.setKeyStoreName(
+ authConfig.getBasicConfiguration(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_NAME));
+ keyStoreConfig.setSoftKeyStoreFilePath(getKeyStoreFilePath());
+ keyStoreConfig.setSoftKeyStorePassword(
+ authConfig.getBasicConfiguration(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PASSWORD));
+
+ return keyStoreConfig;
+
+ }
+
+ private String getKeyStoreFilePath() throws EaafConfigurationException {
+ final String path = authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH);
+ if (path == null) {
+ throw new EaafConfigurationException(Constants.ERRORCODE_00,
+ new Object[] { IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH });
+
+ }
+ return path;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getMetadataKeyAlias()
+ */
+ @Override
+ public String getMetadataKeyAlias() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getMetadataKeyPassword()
+ */
+ @Override
+ public String getMetadataKeyPassword() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getSignatureKeyAlias()
+ */
+ @Override
+ public String getSignatureKeyAlias() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getSignatureKeyPassword()
+ */
+ @Override
+ public String getSignatureKeyPassword() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getEncryptionKeyAlias()
+ */
+ @Override
+ public String getEncryptionKeyAlias() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.gv.egovernment.moa.id.protocols.pvp2x.signer.AbstractCredentialProvider#
+ * getEncryptionKeyPassword()
+ */
+ @Override
+ public String getEncryptionKeyPassword() {
+ return authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD);
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthHealthCheck.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthHealthCheck.java
new file mode 100644
index 00000000..bd5e220b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthHealthCheck.java
@@ -0,0 +1,80 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.boot.actuate.health.HealthIndicator;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import lombok.extern.slf4j.Slf4j;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+/**
+ * Spring Actuator HealthCheck for ID Austria client that evaluates the current status of
+ * ID Austria SAML2 metadata that are loaded into MS-Connector.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class IdAustriaClientAuthHealthCheck implements HealthIndicator {
+
+ private static final int DEADLINE = 3;
+
+ @Autowired IConfiguration authConfig;
+ @Autowired IdAustriaClientAuthMetadataProvider metadataService;
+
+ @Override
+ public Health health() {
+ String msNodeEntityID = authConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID);
+
+ if (StringUtils.isEmpty(msNodeEntityID)) {
+ log.trace("No ID Austria EntityId in configuration. Skipping tests ... ");
+ return Health.unknown().build();
+
+ }
+
+ CompletableFuture<Health> asynchTestOperation = new CompletableFuture<>();
+ Executors.newCachedThreadPool().submit(() -> runConnectionTest(asynchTestOperation, msNodeEntityID));
+ try {
+ return asynchTestOperation.get(DEADLINE, TimeUnit.SECONDS);
+
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ log.info("Receive no respose from Health-Check after {} seconds.", DEADLINE);
+ return Health.outOfService().withException(e).build();
+
+ }
+
+
+ }
+
+
+ private void runConnectionTest(CompletableFuture<Health> completableFuture, String entityId) {
+ try {
+ EntityDescriptor connectorMetadata =
+ metadataService.getEntityDescriptor(entityId);
+ if (connectorMetadata != null) {
+ completableFuture.complete(Health.up().build());
+
+ } else {
+ completableFuture.complete(Health.outOfService().withDetail("Reason", "No SAML2 metadata").build());
+
+ }
+
+ } catch (ResolverException e) {
+ completableFuture.complete(Health.down(e).build());
+
+ }
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthMetadataProvider.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthMetadataProvider.java
new file mode 100644
index 00000000..7c87548f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/idaustriaclient/provider/IdAustriaClientAuthMetadataProvider.java
@@ -0,0 +1,169 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider;
+
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.Provider;
+import java.security.cert.CertificateException;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+
+import org.apache.commons.lang3.StringUtils;
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.opensaml.saml.metadata.resolver.filter.MetadataFilter;
+import org.opensaml.saml.metadata.resolver.filter.MetadataFilterChain;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.credential.EaafKeyStoreFactory;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration;
+import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+import at.gv.egiz.eaaf.core.impl.http.IHttpClientFactory;
+import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2MetadataException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.AbstractChainingMetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.PvpMetadataResolverFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SchemaValidationFilter;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SimpleMetadataSignatureVerificationFilter;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * SAML2 metadata-provider implementation for ID Austria client.
+ *
+ * @author tlenz
+ *
+ */
+@Slf4j
+public class IdAustriaClientAuthMetadataProvider extends AbstractChainingMetadataProvider {
+
+ private static final String FRIENDLYNAME_METADATA_TRUSTSTORE = "'ID Austria client metadata truststore'";
+ private static final String PROVIDER_ID_PATTERN = "eIDAS resolver: {0}";
+ public static final String PROVIDER_ID = "'ID Austria client metadata-provider'";
+
+ @Autowired
+ private IConfiguration basicConfig;
+
+ @Autowired
+ private PvpMetadataResolverFactory metadataProviderFactory;
+ @Autowired
+ private IHttpClientFactory httpClientFactory;
+
+ @Autowired
+ private EaafKeyStoreFactory keyStoreFactory;
+
+ private Pair<KeyStore, Provider> metadataSigningTrustStore;
+
+ @Override
+ protected String getMetadataUrl(String entityId) throws EaafConfigurationException {
+ log.trace("ID Austria. uses SAML2 well-known location approach. EntityId is Metadata-URL");
+ return entityId;
+
+ }
+
+ @Override
+ protected MetadataResolver createNewMetadataProvider(String entityId) throws EaafConfigurationException,
+ IOException, CertificateException {
+ final List<MetadataFilter> filterList = new ArrayList<>();
+ filterList.add(new SchemaValidationFilter(true));
+ filterList.add(new SimpleMetadataSignatureVerificationFilter(
+ metadataSigningTrustStore.getFirst(), entityId));
+
+ final MetadataFilterChain filter = new MetadataFilterChain();
+ filter.setFilters(filterList);
+
+ try {
+ return metadataProviderFactory.createMetadataProvider(getMetadataUrl(entityId),
+ filter,
+ MessageFormat.format(PROVIDER_ID_PATTERN, entityId),
+ httpClientFactory.getHttpClient());
+
+ } catch (final Pvp2MetadataException e) {
+ log.info("Can NOT build metadata provider for entityId: {}", entityId);
+ throw new EaafConfigurationException(IdAustriaClientAuthConstants.ERRORCODE_05,
+ new Object[] { entityId, e.getMessage() }, e);
+
+ }
+ }
+
+ @Override
+ protected List<String> getAllMetadataUrlsFromConfiguration() throws EaafConfigurationException {
+ return Collections.emptyList();
+
+ }
+
+ @Override
+ protected String getMetadataProviderId() {
+ return PROVIDER_ID;
+
+ }
+
+ @Override
+ public void runGarbageCollector() {
+ log.trace("Garbage collection is NOT supported by: {}", getId());
+ }
+
+ @Override
+ public void doDestroy() {
+ super.fullyDestroy();
+
+ }
+
+ @PostConstruct
+ private void initialize() throws EaafException {
+ // initialize truststore to validate metadata signing certificates
+ initializeTrustStore();
+
+ // load metadata with metadataURL, as backup
+ initializeFileSystemMetadata();
+
+ }
+
+ private void initializeFileSystemMetadata() {
+ try {
+ final String metadataUrl = basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_METADATAURL);
+ if (StringUtils.isNotEmpty(metadataUrl)) {
+ log.info("Use not recommended metadata-provider initialization!"
+ + " SAML2 'Well-Known-Location' is the preferred methode.");
+ log.info("Initialize 'ms-specific eIDAS node' metadata-provider with URL: {}", metadataUrl);
+
+ addMetadataResolverIntoChain(createNewMetadataProvider(metadataUrl));
+ }
+
+ } catch (final EaafConfigurationException | CertificateException | IOException e) {
+ log.warn("Can NOT inject static eIDAS Node metadata-soure.", e);
+ log.warn("eIDAS Node communication can be FAIL.");
+
+ }
+ }
+
+ private void initializeTrustStore() throws EaafException {
+ // set configuration
+ final KeyStoreConfiguration trustStoreConfig = new KeyStoreConfiguration();
+ trustStoreConfig.setFriendlyName(FRIENDLYNAME_METADATA_TRUSTSTORE);
+ trustStoreConfig.setKeyStoreType(basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_TRUSTSTORE_TYPE,
+ KeyStoreType.JKS.getKeyStoreType()));
+ trustStoreConfig.setKeyStoreName(basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_TRUSTSTORE_NAME));
+ trustStoreConfig.setSoftKeyStoreFilePath(basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_TRUSTSTORE_PATH));
+ trustStoreConfig.setSoftKeyStorePassword(basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_TRUSTSTORE_PASSWORD));
+
+ // validate configuration
+ trustStoreConfig.validate();
+
+ // open new TrustStore
+ metadataSigningTrustStore = keyStoreFactory.buildNewKeyStore(trustStoreConfig);
+
+ }
+
+}
+
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/CcSpecificEidProcessingService.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/CcSpecificEidProcessingService.java
index 230d6052..b5493edb 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/CcSpecificEidProcessingService.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/CcSpecificEidProcessingService.java
@@ -32,6 +32,7 @@ import java.util.Map.Entry;
import javax.annotation.PostConstruct;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,7 +41,6 @@ import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.INationalEidProcessor;
@@ -104,7 +104,7 @@ public class CcSpecificEidProcessingService implements ICcSpecificEidProcessingS
}
@Override
- public ErnbEidData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
+ public SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
EidasAttributeException {
// extract citizen country from eIDAS unique identifier
final Object eIdentifierObj = eidasAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/ICcSpecificEidProcessingService.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/ICcSpecificEidProcessingService.java
index ebbc15e4..fb9ba318 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/ICcSpecificEidProcessingService.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/ICcSpecificEidProcessingService.java
@@ -25,7 +25,7 @@ package at.asitplus.eidas.specific.modules.auth.eidas.v2.service;
import java.util.Map;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
import at.gv.egiz.eaaf.core.api.IRequest;
@@ -36,20 +36,20 @@ public interface ICcSpecificEidProcessingService {
/**
* Post-process eIDAS eID attributes into national format.
- *
+ *
* @param eidasAttrMap Map of eIDAS attributes in format friendlyName and
* attribute
- *
+ *
* @return eID attributes for SZR request
* @throws EidPostProcessingException In case of a post-processing error
* @throws EidasAttributeException In case of an invalid eIDAS attribute value
*/
- ErnbEidData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
+ SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException,
EidasAttributeException;
/**
* Pre Process eIDAS request into national requirements.
- *
+ *
* @param selectedCC Citizen Country from selection
* @param pendingReq current pending request
* @param authnRequestBuilder eIDAS {@link ILightRequest} builder
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java
new file mode 100644
index 00000000..5e1e4839
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/service/RegisterSearchService.java
@@ -0,0 +1,447 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.service;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import org.jetbrains.annotations.Nullable;
+import org.springframework.lang.NonNull;
+import org.springframework.stereotype.Service;
+
+import com.google.common.collect.Streams;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.IZmrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ZmrCommunicationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.CountrySpecificDetailSearchProcessor;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Service("registerSearchService")
+public class RegisterSearchService {
+
+ private static final String LOG_MSG_RESULTS = "Matching operation: {} results: ZMR: {} | ERnP: {}";
+
+ private final IZmrClient zmrClient;
+ private final IErnpClient ernpClient;
+
+ private final List<CountrySpecificDetailSearchProcessor> handlers;
+
+ /**
+ * Service that combines ZMR and ERnP register search operations.
+ *
+ * @param handlers Available country-specific search processors
+ * @param zmrClient ZMR client
+ * @param ernpClient ERnP client
+ */
+ public RegisterSearchService(List<CountrySpecificDetailSearchProcessor> handlers, IZmrClient zmrClient,
+ IErnpClient ernpClient) {
+ this.zmrClient = zmrClient;
+ this.ernpClient = ernpClient;
+ this.handlers = handlers;
+ log.info("Init with #{} search services for country-specific details", handlers.size());
+
+ }
+
+ /**
+ * Search with Person Identifier (eIDAS Pseudonym) in ZMR and ERnP.
+ *
+ * @param eidasData Received eIDAS data
+ * @throws WorkflowException In case of a register interaction error
+ */
+ @Nonnull
+ public RegisterStatusResults searchWithPersonIdentifier(SimpleEidasData eidasData)
+ throws WorkflowException {
+ return searchWithPersonIdentifier(null, eidasData);
+
+ }
+
+ /**
+ * Search with Person Identifier (eIDAS Pseudonym) in ZMR and ERnP.
+ *
+ * @param operationStatus Current register-operation status that contains processing informations
+ * @param eidasData Received eIDAS data
+ * @throws WorkflowException In case of a register interaction error
+ */
+ @Nonnull
+ public RegisterStatusResults searchWithPersonIdentifier(@Nullable RegisterOperationStatus operationStatus,
+ @Nonnull SimpleEidasData eidasData) throws WorkflowException {
+ try {
+ final ZmrRegisterResult resultsZmr = zmrClient.searchWithPersonIdentifier(
+ operationStatus != null ? operationStatus.getZmrProcessId() : null,
+ eidasData.getPseudonym(), eidasData.getCitizenCountryCode());
+ final ErnpRegisterResult resultsErnp = ernpClient.searchWithPersonIdentifier(
+ eidasData.getPseudonym(), eidasData.getCitizenCountryCode());
+
+ log.debug(LOG_MSG_RESULTS, "seachByPersonalId",
+ resultsZmr.getPersonResult().size(), resultsErnp.getPersonResult().size());
+
+ return RegisterStatusResults.fromZmrAndErnp(resultsZmr, resultsErnp);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("searchWithPersonalIdentifier", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+
+ }
+ }
+
+ /**
+ * Search with MDS (Given Name, Family Name, Date of Birth) in ZMR and ERnP.
+ *
+ * @param operationStatus Current register-operation status that contains processing informations
+ * @param eidasData Received eIDAS data
+ * @throws WorkflowException In case of a register interaction error
+ */
+ @Nonnull
+ public RegisterStatusResults searchWithMds(RegisterOperationStatus operationStatus, SimpleEidasData eidasData)
+ throws WorkflowException {
+ try {
+ final ZmrRegisterResult resultsZmr =
+ zmrClient.searchWithMds(operationStatus.getZmrProcessId(), eidasData.getGivenName(),
+ eidasData.getFamilyName(), eidasData.getDateOfBirth(), eidasData.getCitizenCountryCode());
+
+ final ErnpRegisterResult resultsErnp =
+ ernpClient.searchWithMds(eidasData.getGivenName(),
+ eidasData.getFamilyName(), eidasData.getDateOfBirth(), eidasData.getCitizenCountryCode());
+
+ log.debug(LOG_MSG_RESULTS, "seachByMDS",
+ resultsZmr.getPersonResult().size(), resultsErnp.getPersonResult().size());
+
+ return RegisterStatusResults.fromZmrAndErnp(resultsZmr, resultsErnp);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("searchWithMDSOnly", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+
+ }
+ }
+
+ /**
+ * Search with country-specific parameters based on information from available
+ * {@link CountrySpecificDetailSearchProcessor} implementations.
+ *
+ * @param operationStatus Current register-operation status that contains processing informations
+ * @param eidasData Receive eIDAS eID information
+ * @return Results from ZMR or ERnP search
+ * @throws WorkflowException In case of a register interaction error
+ */
+ @Nonnull
+ public RegisterStatusResults searchWithCountrySpecifics(RegisterOperationStatus operationStatus,
+ SimpleEidasData eidasData) throws WorkflowException {
+ try {
+ @Nullable final CountrySpecificDetailSearchProcessor ccSpecificProcessor = findSpecificProcessor(eidasData);
+ if (ccSpecificProcessor != null) {
+ log.debug("Selecting country-specific search processor: {}", ccSpecificProcessor.getName());
+ PersonSuchenRequest ccSpecificSearchReq = ccSpecificProcessor.generateSearchRequest(eidasData);
+
+ // search in ZMR
+ final ZmrRegisterResult resultsZmr =
+ zmrClient.searchCountrySpecific(operationStatus.getZmrProcessId(),
+ ccSpecificSearchReq, eidasData.getCitizenCountryCode());
+
+ //search in ERnP
+ ErnpRegisterResult resultErnp = ernpClient.searchCountrySpecific(
+ ccSpecificSearchReq, eidasData.getCitizenCountryCode());
+
+ log.debug(LOG_MSG_RESULTS, "seachByCountrySpecifics",
+ resultsZmr.getPersonResult().size(), resultErnp.getPersonResult().size());
+
+ return RegisterStatusResults.fromZmrAndErnp(resultsZmr, resultErnp);
+
+ } else {
+ return RegisterStatusResults.fromEmpty(operationStatus);
+
+ }
+
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("searchWithCountrySpecifics", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+
+ }
+ }
+
+ /**
+ * Search with residence infos.
+ *
+ * @param operationStatus Current register-operation status that contains processing informations
+ * @param eidasData Receive eIDAS eID information
+ * @param address Address information provided by user
+ * @return Results from ZMR or ERnP search
+ * @throws WorkflowException In case of a register interaction error
+ */
+ public RegisterStatusResults searchWithResidence(RegisterOperationStatus operationStatus, SimpleEidasData eidasData,
+ AdresssucheOutput address) throws WorkflowException {
+ try {
+ final ZmrRegisterResult resultsZmr = zmrClient.searchWithResidenceData(
+ operationStatus.getZmrProcessId(), eidasData.getGivenName(), eidasData.getFamilyName(),
+ eidasData.getDateOfBirth(), eidasData.getCitizenCountryCode(), address);
+
+ /* ERnP search is not used here,
+ * because we only search for people with Austrian residence and they are in ZMR only
+ */
+
+ log.debug(LOG_MSG_RESULTS, "seachByResidence",
+ resultsZmr.getPersonResult().size(), 0);
+
+ return RegisterStatusResults.fromZmr(resultsZmr);
+
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("searchWithResidenceInformation", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+
+ }
+ }
+
+ /**
+ * Automatic process to fix the register entries.
+ * Called when the initial eIDAS authn leads to a match in a register.
+ *
+ * @param registerResult Result of last register search
+ * @param initialEidasData Received eidas data from initial authn
+ * @return
+ */
+ @NonNull
+ public RegisterStatusResults step7aKittProcess(RegisterStatusResults registerResult,
+ SimpleEidasData initialEidasData) throws WorkflowException {
+ log.trace("Starting step7aKittProcess");
+
+ // check if only one single result was found
+ if (registerResult.getResultCount() != 1) {
+ throw new WorkflowException("step7aKittProcess", "getResultCount() != 1");
+
+ }
+
+ // perform updated operation in respect to register results
+ try {
+ if (registerResult.getResultsZmr().size() == 1) {
+ RegisterResult entryZmr = registerResult.getResultsZmr().get(0);
+ ZmrRegisterResult updateZmr = zmrClient
+ .update(registerResult.getOperationStatus().getZmrProcessId(), entryZmr, initialEidasData);
+ return RegisterStatusResults.fromZmr(updateZmr);
+
+ } else {
+ RegisterResult entryErnp = registerResult.getResultsErnp().get(0);
+ ErnpRegisterResult updateErnp = ernpClient.update(entryErnp, initialEidasData);
+ return RegisterStatusResults.fromErnp(registerResult.operationStatus, updateErnp);
+
+ }
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("kittMatchedIdentitiess", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+
+ }
+ }
+
+ /**
+ * Automatic process to fix the register entries.
+ * Called when the alternative eIDAS authn leads to a match in a register.
+ *
+ * <p>This method perform two additional operations:
+ * <ul>
+ * <li>Use bPK to check if <i>altSearchResult</i> is part of <i>initialSearchResult</i>.</li>
+ * <li>Update register entry twice, be using information from alternative authentication <i>altEidasData</i>
+ * and from initial authentication <i>initialEidasData</i>.</li>
+ * </ul>
+ * </p>
+ *
+ * @param initialSearchResult Register results from initial authentication
+ * @param initialEidasData Received eIDAS data from initial authentication
+ * @param altSearchResult Register results from alternative authentication
+ * @param altEidasData Received eIDAS data from alternative authentication
+ * @return
+ */
+ public RegisterStatusResults step7bKittProcess(
+ RegisterStatusResults initialSearchResult, SimpleEidasData initialEidasData,
+ RegisterStatusResults altSearchResult, SimpleEidasData altEidasData) throws WorkflowException {
+ log.trace("Starting step7bKittProcess");
+
+ // check if alternative authentication ends in a single result
+ if (altSearchResult.getResultCount() != 1) {
+ throw new WorkflowException("step7bKittProcess", "getResultCount() != 1");
+
+ }
+
+ // check if alternative authentication result is part of initialSearchResults
+ if (!Streams.concat(initialSearchResult.getResultsZmr().stream(), initialSearchResult.getResultsErnp().stream())
+ .filter(el -> {
+ try {
+ return altSearchResult.getResult().getBpk().equals(el.getBpk());
+
+ } catch (WorkflowException e1) {
+ //can not appear because it's already validated above.
+ return false;
+ }
+ })
+ .findFirst()
+ .isPresent()) {
+ throw new WorkflowException("step7bKittProcess",
+ "Register result from alternativ authentication does not fit into intermediate state");
+
+ }
+
+ // perform KITT operations
+ try {
+ if (altSearchResult.getResultsZmr().size() == 1) {
+ RegisterResult entryZmr = altSearchResult.getResultsZmr().get(0);
+
+ // update ZMR entry by using eIDAS information from initial authentication
+ zmrClient.update(altSearchResult.getOperationStatus().getZmrProcessId(), entryZmr, initialEidasData);
+
+ // update ZMR entry by using eIDAS information from alternative authentication
+ ZmrRegisterResult updateAlt = zmrClient.update(
+ altSearchResult.getOperationStatus().getZmrProcessId(), entryZmr, altEidasData);
+
+ return RegisterStatusResults.fromZmr(updateAlt);
+
+ } else {
+ RegisterResult entryErnp = altSearchResult.getResultsErnp().get(0);
+
+ // update ZMR entry by using eIDAS information from initial authentication
+ ernpClient.update(entryErnp, initialEidasData);
+
+ // update ZMR entry by using eIDAS information from alternative authentication
+ ErnpRegisterResult updateAlt = ernpClient.update(entryErnp, altEidasData);
+
+ return RegisterStatusResults.fromErnp(altSearchResult.getOperationStatus(), updateAlt);
+ }
+ } catch (final EidasSAuthenticationException e) {
+ throw new WorkflowException("kittMatchedIdentitiess", e.getMessage(),
+ !(e instanceof ZmrCommunicationException), e);
+ }
+ }
+
+ @Nullable
+ private CountrySpecificDetailSearchProcessor findSpecificProcessor(SimpleEidasData eidasData) {
+ final String citizenCountry = eidasData.getCitizenCountryCode();
+ for (final CountrySpecificDetailSearchProcessor processor : handlers) {
+ if (processor.canHandle(citizenCountry, eidasData)) {
+ log.debug("Found suitable search handler for {} by using: {}", citizenCountry, processor.getName());
+ return processor;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Register releated information that are needed for any request.
+ *
+ * @author tlenz
+ */
+ @AllArgsConstructor
+ @Getter
+ public static class RegisterOperationStatus implements Serializable {
+
+ private static final long serialVersionUID = -1037357883275379796L;
+
+ /**
+ * ZMR internal processId that is required for any further request in the same process.
+ */
+ private BigInteger zmrProcessId;
+
+
+ }
+
+
+ /**
+ * Response container for {@link RegisterSearchService} that holds a set of {@link RegisterResult}.
+ *
+ * @author tlenz
+ */
+ @Getter
+ @RequiredArgsConstructor
+ public static class RegisterStatusResults implements Serializable {
+
+ private static final long serialVersionUID = -2489125033838373511L;
+
+ /**
+ * Operation status for this result.
+ */
+ private final RegisterOperationStatus operationStatus;
+
+ /**
+ * Current ZMR search result.
+ */
+ private final List<RegisterResult> resultsZmr;
+
+ /**
+ * Current ERnP search result.
+ */
+ private final List<RegisterResult> resultsErnp;
+
+ /**
+ * Get sum of ZMR and ERnP results.
+ *
+ * @return number of results
+ */
+ public int getResultCount() {
+ return resultsZmr.size() + resultsErnp.size();
+ }
+
+ /**
+ * Verifies that there is only one match and returns the bpk.
+ *
+ * @return bpk bpk of the match
+ * @throws WorkflowException if multiple results have been found
+ */
+ public String getBpk() throws WorkflowException {
+ if (getResultCount() != 1) {
+ throw new WorkflowException("readRegisterResults", "getResultCount() != 1");
+
+ }
+ return getResult().getBpk();
+ }
+
+ /**
+ * Returns the results, if there is exactly one, throws exception otherwise.
+ *
+ * @return The result
+ * @throws WorkflowException Results does not contain exactly one result
+ */
+ public RegisterResult getResult() throws WorkflowException {
+ if (getResultCount() != 1) {
+ throw new WorkflowException("readRegisterResults", "getResultCount() != 1");
+ }
+ if (resultsZmr.size() == 1) {
+ return resultsZmr.get(0);
+
+ } else {
+ return resultsErnp.get(0);
+
+ }
+ }
+
+ static RegisterStatusResults fromZmr(ZmrRegisterResult result) {
+ return new RegisterStatusResults(new RegisterOperationStatus(result.getProcessId()),
+ result.getPersonResult(), Collections.emptyList());
+ }
+
+ static RegisterStatusResults fromZmrAndErnp(ZmrRegisterResult result, ErnpRegisterResult resultErnp) {
+ return new RegisterStatusResults(new RegisterOperationStatus(result.getProcessId()),
+ result.getPersonResult(), resultErnp.getPersonResult());
+ }
+
+ static RegisterStatusResults fromErnp(RegisterOperationStatus status, ErnpRegisterResult updateErnp) {
+ return new RegisterStatusResults(status, Collections.emptyList(), updateErnp.getPersonResult());
+ }
+
+ static RegisterStatusResults fromEmpty(RegisterOperationStatus status) {
+ return new RegisterStatusResults(status, Collections.emptyList(), Collections.emptyList());
+ }
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrClient.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrClient.java
deleted file mode 100644
index 11b1e589..00000000
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/szr/SzrClient.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
- */
-
-package at.asitplus.eidas.specific.modules.auth.eidas.v2.szr;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.security.KeyManagementException;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
-import java.security.UnrecoverableKeyException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.PostConstruct;
-import javax.net.ssl.KeyManager;
-import javax.net.ssl.KeyManagerFactory;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
-import javax.xml.XMLConstants;
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.ws.BindingProvider;
-import javax.xml.ws.Dispatch;
-import javax.xml.ws.handler.Handler;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.cxf.configuration.jsse.TLSClientParameters;
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.frontend.ClientProxy;
-import org.apache.cxf.jaxws.DispatchImpl;
-import org.apache.cxf.transport.http.HTTPConduit;
-import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
-import org.apache.xpath.XPathAPI;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.LoggingHandler;
-import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
-import at.gv.egiz.eaaf.core.api.data.XmlNamespaceConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
-import at.gv.egiz.eaaf.core.impl.utils.FileUtils;
-import at.gv.egiz.eaaf.core.impl.utils.KeyStoreUtils;
-import lombok.extern.slf4j.Slf4j;
-import szrservices.GetBPK;
-import szrservices.GetBPKResponse;
-import szrservices.GetIdentityLinkEidas;
-import szrservices.GetIdentityLinkEidasResponse;
-import szrservices.IdentityLinkType;
-import szrservices.JwsHeaderParam;
-import szrservices.ObjectFactory;
-import szrservices.PersonInfoType;
-import szrservices.SZR;
-import szrservices.SZRException_Exception;
-import szrservices.SignContent;
-import szrservices.SignContentEntry;
-import szrservices.SignContentResponseType;
-
-
-@Slf4j
-@Service("SZRClientForeIDAS")
-public class SzrClient {
-
- private static final String CLIENT_DEFAULT = "DefaultClient";
- private static final String CLIENT_RAW = "RawClient";
-
- private static final String ATTR_NAME_VSZ = "urn:eidgvat:attributes.vsz.value";
- private static final String ATTR_NAME_PUBKEYS = "urn:eidgvat:attributes.user.pubkeys";
- private static final String ATTR_NAME_STATUS = "urn:eidgvat:attributes.eid.status";
- private static final String KEY_BC_BIND = "bcBindReq";
- private static final String JOSE_HEADER_USERCERTPINNING_TYPE = "urn:at.gv.eid:bindtype";
- private static final String JOSE_HEADER_USERCERTPINNING_EIDASBIND = "urn:at.gv.eid:eidasBind";
- public static final String ATTR_NAME_MDS = "urn:eidgvat:mds";
-
- @Autowired
- private IConfiguration basicConfig;
-
- // client for anything, without identitylink
- private SZR szr = null;
-
- // RAW client is needed for identitylink
- private Dispatch<Source> dispatch = null;
-
- private SzrService szrService = null;
- private String szrUrl = null;
- private QName qname = null;
-
- final ObjectMapper mapper = new ObjectMapper();
-
- /**
- * Get IdentityLink of a person.
- *
- * @param personInfo Person identification information
- * @return IdentityLink
- * @throws SzrCommunicationException In case of a SZR error
- */
- public IdentityLinkType getIdentityLinkInRawMode(PersonInfoType personInfo)
- throws SzrCommunicationException {
- try {
- final GetIdentityLinkEidas getIdl = new GetIdentityLinkEidas();
- getIdl.setPersonInfo(personInfo);
-
- final JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
- final Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
-
- final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- jaxbMarshaller.marshal(getIdl, outputStream);
- outputStream.flush();
-
- final Source source = new StreamSource(new ByteArrayInputStream(outputStream.toByteArray()));
- outputStream.close();
-
- log.trace("Requesting SZR ... ");
- final Source response = dispatch.invoke(source);
- log.trace("Receive RAW response from SZR");
-
- final byte[] szrResponse = sourceToByteArray(response);
- final GetIdentityLinkEidasResponse jaxbElement = (GetIdentityLinkEidasResponse) jaxbContext
- .createUnmarshaller().unmarshal(new ByteArrayInputStream(szrResponse));
-
- // build response
- log.trace(new String(szrResponse, "UTF-8"));
-
- // ok, we have success
- final Document doc = DomUtils.parseDocument(
- new ByteArrayInputStream(szrResponse),
- true,
- XmlNamespaceConstants.ALL_SCHEMA_LOCATIONS + " " + Constants.SZR_SCHEMA_LOCATIONS,
- null, null);
- final String xpathExpression = "//saml:Assertion";
- final Element nsNode = doc.createElementNS("urn:oasis:names:tc:SAML:1.0:assertion", "saml:NSNode");
-
- log.trace("Selecting signed doc " + xpathExpression);
- final Element documentNode = (Element) XPathAPI.selectSingleNode(doc,
- xpathExpression, nsNode);
- log.trace("Signed document: " + DomUtils.serializeNode(documentNode));
-
- final IdentityLinkType idl = new IdentityLinkType();
- idl.setAssertion(documentNode);
- idl.setPersonInfo(jaxbElement.getGetIdentityLinkReturn().getPersonInfo());
-
- return idl;
-
- } catch (final Exception e) {
- log.warn("SZR communication FAILED for operation: {} Reason: {}",
- "GetIdentityLinkEidas", e.getMessage(), e);
- throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
-
- }
-
- }
-
- /**
- * Get bPK of person.
- *
- * @param personInfo Person identification information
- * @param target requested bPK target
- * @param vkz Verfahrenskennzeichen
- * @return bPK for this person
- * @throws SzrCommunicationException In case of a SZR error
- */
- public List<String> getBpk(PersonInfoType personInfo, String target, String vkz)
- throws SzrCommunicationException {
- try {
- final GetBPK parameters = new GetBPK();
- parameters.setPersonInfo(personInfo);
- parameters.getBereichsKennung().add(target);
- parameters.setVKZ(vkz);
- final GetBPKResponse result = this.szr.getBPK(parameters);
-
- return result.getGetBPKReturn();
-
- } catch (final SZRException_Exception e) {
- log.warn("SZR communication FAILED for operation: {} Reason: {}",
- "GetBPK", e.getMessage(), e);
- throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
-
- }
-
- }
-
- /**
- * Request a encryped baseId from SRZ.
- *
- * @param personInfo Minimum dataset of person
- * @param insertErnp insertErnp flag on SZR request
- * @return encrypted baseId
- * @throws SzrCommunicationException In case of a SZR error
- */
- public String getEncryptedStammzahl(final PersonInfoType personInfo, boolean insertErnp)
- throws SzrCommunicationException {
- final String resp;
- try {
- resp = this.szr.getStammzahlEncrypted(personInfo, insertErnp);
-
- } catch (SZRException_Exception e) {
- log.warn("SZR communication FAILED for operation: {} Reason: {}",
- "getStammzahlEncrypted", e.getMessage(), e);
- throw new SzrCommunicationException("ernb.02", new Object[]{e.getMessage()}, e);
- }
-
- if (StringUtils.isEmpty(resp)) {
- throw new SzrCommunicationException("ernb.01", new Object[]{"Stammzahl response empty"}); // TODO error handling
-
- }
-
- return resp;
- }
-
- /**
- * Request a encrypted baseId from SRZ without insertErnp.
- *
- * @param personInfo Minimum dataset of person
- * @return encrypted baseId
- * @throws SzrCommunicationException In case of a SZR error
- */
- public String getEncryptedStammzahl(final PersonInfoType personInfo)
- throws SzrCommunicationException {
- return getEncryptedStammzahl(personInfo, false);
-
- }
-
- /**
- * Sign an eidasBind data-structure that combines vsz with user's pubKey and E-ID status.
- *
- * @param vsz encryped baseId
- * @param bindingPubKey binding PublikKey as PKCS1# (ASN.1) container
- * @param eidStatus Status of the E-ID
- * @param eidData eID information that was used for ERnP registration
- * @return bPK for this person
- * @throws SzrCommunicationException In case of a SZR error
- */
- public String getEidsaBind(final String vsz, final String bindingPubKey, final String eidStatus,
- ErnbEidData eidData)throws SzrCommunicationException {
-
- final Map<String, Object> eidsaBindMap = new HashMap<>();
- eidsaBindMap.put(ATTR_NAME_VSZ, vsz);
- eidsaBindMap.put(ATTR_NAME_STATUS, eidStatus);
- eidsaBindMap.put(ATTR_NAME_PUBKEYS, Arrays.asList(bindingPubKey));
- eidsaBindMap.put(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, eidData.getCitizenCountryCode());
- injectMdsIfAvailableAndActive(eidsaBindMap, eidData);
-
- try {
- final String serializedEidasBind = mapper.writeValueAsString(eidsaBindMap);
- final SignContent req = new SignContent();
- final SignContentEntry eidasBindInfo = new SignContentEntry();
- eidasBindInfo.setKey(KEY_BC_BIND);
- eidasBindInfo.setValue(serializedEidasBind);
- req.getIn().add(eidasBindInfo);
- req.setAppendCert(false);
- final JwsHeaderParam eidasBindJoseHeader = new JwsHeaderParam();
- eidasBindJoseHeader.setKey(JOSE_HEADER_USERCERTPINNING_TYPE);
- eidasBindJoseHeader.setValue(JOSE_HEADER_USERCERTPINNING_EIDASBIND);
- req.getJWSHeaderParam().add(eidasBindJoseHeader);
-
- log.trace("Requesting SZR to sign bcBind datastructure ... ");
- final SignContentResponseType resp = szr.signContent(req.isAppendCert(), req.getJWSHeaderParam(), req.getIn());
- log.trace("Receive SZR response on bcBind siging operation ");
-
- if (resp == null || resp.getOut() == null
- || resp.getOut().isEmpty()
- || StringUtils.isEmpty(resp.getOut().get(0).getValue())) {
- throw new SzrCommunicationException("ernb.01", new Object[]{"BcBind response empty"});
- }
-
- return resp.getOut().get(0).getValue();
-
- } catch (final JsonProcessingException | SZRException_Exception e) {
- log.warn("SZR communication FAILED for operation: {} Reason: {}",
- "SignContent", e.getMessage(), e);
- throw new SzrCommunicationException("ernb.02",
- new Object[]{e.getMessage()}, e);
- }
- }
-
- @PostConstruct
- private void initialize() {
- log.info("Starting SZR-Client initialization .... ");
- final URL url = SzrClient.class.getResource("/szr_client/SZR_v4.0.wsdl");
-
- final boolean useTestSzr = basicConfig.getBasicConfigurationBoolean(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_USETESTSERVICE,
- true);
-
- if (useTestSzr) {
- log.debug("Initializing SZR test environment configuration.");
- qname = SzrService.SZRTestumgebung;
- szrService = new SzrService(url, new QName("urn:SZRServices", "SZRService"));
- szr = szrService.getSzrTestumgebung();
- szrUrl = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_ENDPOINT_TEST);
-
- } else {
- log.debug("Initializing SZR productive configuration.");
- qname = SzrService.SZRProduktionsumgebung;
- szrService = new SzrService(url, new QName("urn:SZRServices", "SZRService"));
- szr = szrService.getSzrProduktionsumgebung();
- szrUrl = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_ENDPOINT_PROD);
-
- }
-
- // create raw client;
- dispatch = szrService.createDispatch(qname, Source.class, javax.xml.ws.Service.Mode.PAYLOAD);
-
- if (StringUtils.isEmpty(szrUrl)) {
- log.error("No SZR service-URL found. SZR-Client initalisiation failed.");
- throw new RuntimeException("No SZR service URL found. SZR-Client initalisiation failed.");
-
- }
-
- // check if Clients can be initialized
- if (szr == null) {
- log.error("SZR " + CLIENT_DEFAULT + " is 'NULL'. Something goes wrong");
- throw new RuntimeException("SZR " + CLIENT_DEFAULT + " is 'NULL'. Something goes wrong");
-
- }
- if (dispatch == null) {
- log.error("SZR " + CLIENT_RAW + " is 'NULL'. Something goes wrong");
- throw new RuntimeException("SZR " + CLIENT_RAW + " is 'NULL'. Something goes wrong");
-
- }
-
- // inject handler
- log.info("Use SZR service-URL: " + szrUrl);
- injectBindingProvider((BindingProvider) szr, CLIENT_DEFAULT);
- injectBindingProvider(dispatch, CLIENT_RAW);
-
- // inject http parameters and SSL context
- log.debug("Inject HTTP client settings ... ");
- injectHttpClient(szr, CLIENT_DEFAULT);
- injectHttpClient(dispatch, CLIENT_RAW);
-
- log.info("SZR-Client initialization successfull");
- }
-
- private void injectHttpClient(Object raw, String clientType) {
- // extract client from implementation
- Client client = null;
- if (raw instanceof DispatchImpl<?>) {
- client = ((DispatchImpl<?>) raw).getClient();
- } else if (raw instanceof Client) {
- client = ClientProxy.getClient(raw);
- } else {
- throw new RuntimeException("SOAP Client for SZR connection is of UNSUPPORTED type: " + raw.getClass()
- .getName());
- }
-
- // set basic connection policies
- final HTTPConduit http = (HTTPConduit) client.getConduit();
-
- // set timeout policy
- final HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
- httpClientPolicy.setConnectionTimeout(
- Integer.parseInt(basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_TIMEOUT_CONNECTION,
- Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_CONNECTION)) * 1000);
- httpClientPolicy.setReceiveTimeout(
- Integer.parseInt(basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_TIMEOUT_RESPONSE,
- Constants.HTTP_CLIENT_DEFAULT_TIMEOUT_RESPONSE)) * 1000);
- http.setClient(httpClientPolicy);
-
- // inject SSL context in case of https
- if (szrUrl.toLowerCase().startsWith("https")) {
- log.debug("Adding SSLContext to client: " + clientType + " ... ");
- final TLSClientParameters tlsParams = new TLSClientParameters();
- tlsParams.setSSLSocketFactory(createSslContext(clientType).getSocketFactory());
- http.setTlsClientParameters(tlsParams);
- log.info("SSLContext initialized for client: " + clientType);
-
- }
-
- }
-
- private void injectBindingProvider(BindingProvider bindingProvider, String clientType) {
- final Map<String, Object> requestContext = bindingProvider.getRequestContext();
- requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, szrUrl);
-
- log.trace("Adding JAX-WS request/response trace handler to client: " + clientType);
- List<Handler> handlerList = bindingProvider.getBinding().getHandlerChain();
- if (handlerList == null) {
- handlerList = new ArrayList<>();
- bindingProvider.getBinding().setHandlerChain(handlerList);
-
- }
-
- // add logging handler to trace messages if required
- if (basicConfig.getBasicConfigurationBoolean(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_TRACEMESSAGES,
- false)) {
- final LoggingHandler loggingHandler = new LoggingHandler();
- handlerList.add(loggingHandler);
-
- }
- bindingProvider.getBinding().setHandlerChain(handlerList);
- }
-
- private SSLContext createSslContext(String clientType) {
- try {
- final SSLContext context = SSLContext.getInstance("TLS");
-
- // initialize key-mangager for SSL client-authentication
- KeyManager[] keyManager = null;
- final String keyStorePath = basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_PATH);
- final String keyStorePassword = basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_KEYSTORE_PASSWORD);
- if (StringUtils.isNotEmpty(keyStorePath)) {
- log.trace("Find keyStore path: " + keyStorePath + " Injecting SSL client certificate ... ");
- try {
- final KeyStore keyStore = KeyStoreUtils.loadKeyStore(
- FileUtils.makeAbsoluteUrl(keyStorePath, basicConfig.getConfigurationRootDirectory()),
- keyStorePassword);
-
- final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
- kmf.init(keyStore, keyStorePassword.toCharArray());
- keyManager = kmf.getKeyManagers();
- log.debug("SSL client certificate injected to client: " + clientType);
-
- } catch (KeyStoreException | IOException | UnrecoverableKeyException e) {
- log.error("Can NOT load SSL client certificate from path: " + keyStorePath);
- throw new RuntimeException("Can NOT load SSL client certificate from path: " + keyStorePath, e);
-
- }
- } else {
- log.debug(
- "No KeyStore for SSL Client Auth. found. Initializing SSLContext without authentication ... ");
-
- }
-
- // initialize SSL TrustStore
- TrustManager[] trustManager = null;
- final String trustStorePath = basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PATH);
- final String trustStorePassword = basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SSL_TRUSTSTORE_PASSWORD);
- if (StringUtils.isNotEmpty(trustStorePath)) {
- log.trace("Find trustStore path: " + trustStorePath + " Injecting SSL TrustStore ... ");
- try {
- final KeyStore trustStore = KeyStoreUtils.loadKeyStore(
- FileUtils.makeAbsoluteUrl(trustStorePath, basicConfig.getConfigurationRootDirectory()),
- trustStorePassword);
-
- final TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
- tmf.init(trustStore);
- trustManager = tmf.getTrustManagers();
- log.debug("SSL TrustStore injected to client: " + clientType);
-
- } catch (KeyStoreException | IOException e) {
- log.error("Can NOT open SSL TrustStore from path: " + trustStorePath);
- throw new RuntimeException("Can NOT open SSL TrustStore from path: " + trustStorePath, e);
-
- }
-
- } else {
- log.debug("No custom SSL TrustStore found. Initializing SSLContext with JVM default truststore ... ");
-
- }
-
- context.init(keyManager, trustManager, new SecureRandom());
- return context;
-
- } catch (NoSuchAlgorithmException | KeyManagementException e) {
- log.error("SSLContext initialization FAILED.", e);
- throw new RuntimeException("SSLContext initialization FAILED.", e);
-
- }
-
- }
-
- private void injectMdsIfAvailableAndActive(Map<String, Object> eidsaBindMap, ErnbEidData eidData) {
- if (basicConfig.getBasicConfigurationBoolean(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_SET_MDS_TO_EIDASBIND, false)) {
- log.info("Injecting MDS into eidasBind ... ");
- final Map<String, Object> mds = new HashMap<>();
- mds.put(PvpAttributeDefinitions.PRINCIPAL_NAME_NAME, eidData.getFamilyName());
- mds.put(PvpAttributeDefinitions.GIVEN_NAME_NAME, eidData.getGivenName());
- mds.put(PvpAttributeDefinitions.BIRTHDATE_NAME, eidData.getFormatedDateOfBirth());
- eidsaBindMap.put(ATTR_NAME_MDS, mds);
-
- }
- }
-
- private byte[] sourceToByteArray(Source result) throws TransformerException {
- final TransformerFactory factory = TransformerFactory.newInstance();
- factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
- final Transformer transformer = factory.newTransformer();
- transformer.setOutputProperty("omit-xml-declaration", "yes");
- transformer.setOutputProperty("method", "xml");
- final ByteArrayOutputStream out = new ByteArrayOutputStream();
- final StreamResult streamResult = new StreamResult();
- streamResult.setOutputStream(out);
- transformer.transform(result, streamResult);
- return out.toByteArray();
- }
-
-}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/AlternativeSearchTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/AlternativeSearchTask.java
new file mode 100644
index 00000000..96aa9c51
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/AlternativeSearchTask.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK;
+
+import java.util.Map;
+import java.util.Objects;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import eu.eidas.auth.commons.light.ILightResponse;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Searches registers (ERnP and ZMR) after alternative eIDAS authn, before adding person to SZR.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE} data from the alternative eIDAS authn</li>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} data from the initial eIDAS authn</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_PERSON_MATCH_RESULT} results after second search in registers with MDS</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if no results in registers were found for this user</li>
+ * <li>{@link CreateIdentityLinkTask} if search in register returned one match, user is uniquely identified</li>
+ * </ul>
+ *
+ * @author amarsalek
+ * @author ckollmann
+ * @author tlenz
+ */
+@Slf4j
+@Component("AlternativeSearchTask")
+@SuppressWarnings("PMD.TooManyStaticImports")
+public class AlternativeSearchTask extends AbstractAuthServletTask {
+
+ private static final String MSG_PROP_25 = "module.eidasauth.matching.25";
+
+ private final RegisterSearchService registerSearchService;
+ private final ICcSpecificEidProcessingService eidPostProcessor;
+
+ /**
+ * Constructor.
+ *
+ * @param registerSearchService Service for register search access
+ * @param eidPostProcessor Country-Specific post processing of attributes
+ */
+ public AlternativeSearchTask(RegisterSearchService registerSearchService,
+ ICcSpecificEidProcessingService eidPostProcessor) {
+ this.registerSearchService = registerSearchService;
+ this.eidPostProcessor = eidPostProcessor;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
+ throws TaskExecutionException {
+ try {
+ final SimpleEidasData altEidasData = convertEidasAttrToSimpleData();
+ final SimpleEidasData initialEidasData = MatchingTaskUtils.getInitialEidasData(pendingReq);
+ final RegisterStatusResults intermediateMatchingState =
+ MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+
+ //pre-validation of eIDAS data
+ preVerifyAlternativeEidasData(altEidasData, initialEidasData, intermediateMatchingState);
+
+ //perform register search operation based on alterantive eIDAS data
+ step11RegisterSearchWithPersonIdentifier(executionContext, altEidasData,
+ intermediateMatchingState, initialEidasData);
+
+ } catch (WorkflowException e) {
+ throw new TaskExecutionException(pendingReq, "Initial search failed", e);
+
+ } catch (final Exception e) {
+ log.error("Initial search failed", e);
+ throw new TaskExecutionException(pendingReq, "Initial search failed with a generic error", e);
+
+ }
+ }
+
+ /**
+ * Pre-validation of eIDAS information.
+ *
+ * <p>Check if country-code and MDS (givenName, familyName, dateOfBirth) matches.</p>
+ *
+ * @param altEidasData eIDAS data from alternative authentication
+ * @param initialEidasData eIDAS data from initial authentication
+ * @param intermediateMatchingState Intermediate matching result
+ * @throws WorkflowException In case of a validation error
+ */
+ private void preVerifyAlternativeEidasData(SimpleEidasData altEidasData, SimpleEidasData initialEidasData,
+ RegisterStatusResults intermediateMatchingState) throws WorkflowException {
+ if (initialEidasData == null) {
+ throw new WorkflowException("step11", "No initial eIDAS authn data", true);
+
+ }
+
+ if (intermediateMatchingState == null) {
+ throw new WorkflowException("step11", "No intermediate matching-state", true);
+
+ }
+
+ if (!Objects.equals(altEidasData.getCitizenCountryCode(), initialEidasData.getCitizenCountryCode())) {
+ throw new WorkflowException("step11", "Country Code of alternative eIDAS authn not matching", true);
+
+ }
+
+ if (!altEidasData.equalsMds(initialEidasData)) {
+ throw new WorkflowException("step11", "MDS of alternative eIDAS authn does not match initial authn", true);
+
+ }
+ }
+
+ private void step11RegisterSearchWithPersonIdentifier(
+ ExecutionContext executionContext, SimpleEidasData altEidasData,
+ RegisterStatusResults intermediateMatchingState, SimpleEidasData initialEidasData)
+ throws WorkflowException, EaafStorageException {
+ try {
+ log.trace("Starting step11RegisterSearchWithPersonIdentifier");
+ RegisterStatusResults altSearchResult = registerSearchService.searchWithPersonIdentifier(
+ intermediateMatchingState.getOperationStatus(), altEidasData);
+
+ int resultCount = altSearchResult.getResultCount();
+ if (resultCount == 0) {
+ step12CountrySpecificSearch(executionContext, intermediateMatchingState, initialEidasData,
+ altSearchResult.getOperationStatus(), altEidasData);
+
+ } else if (resultCount == 1) {
+ log.debug("step11RegisterSearchWithPersonIdentifier find single result. Starting KITT operation ... ");
+ RegisterStatusResults matchtedResult = registerSearchService.step7bKittProcess(
+ intermediateMatchingState, initialEidasData, altSearchResult, altEidasData);
+
+ log.debug("KITT operation finished. Finalize matching process ... ");
+ foundMatchFinalizeTask(matchtedResult, altEidasData);
+
+ } else {
+ throw new WorkflowException("step11RegisterSearchWithPersonIdentifier",
+ "More than one entry with unique personal-identifier", true);
+
+ }
+ } catch (WorkflowException e) {
+ log.warn("Workflow error during matching step: {}. Reason: {}", e.getProcessStepName(), e.getErrorReason());
+ throw e;
+
+ }
+ }
+
+ private void step12CountrySpecificSearch(ExecutionContext executionContext,
+ RegisterStatusResults intermediateMatchingState,
+ SimpleEidasData initialEidasData,
+ RegisterOperationStatus registerOperationStatus,
+ SimpleEidasData altEidasData)
+ throws EaafStorageException, WorkflowException {
+ log.trace("Starting 'step12CountrySpecificSearch' ... ");
+ RegisterStatusResults ccAltSearchResult = registerSearchService.searchWithCountrySpecifics(
+ registerOperationStatus, altEidasData);
+
+ if (ccAltSearchResult.getResultCount() == 0) {
+ log.trace("'step12CountrySpecificSearch' ends with no result. Forward to GUI based matching step ... ");
+ log.debug("Forward to GUI based matching steps ... ");
+ executionContext.put(TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, MSG_PROP_25);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+
+ } else if (ccAltSearchResult.getResultCount() == 1) {
+ log.debug("'step12CountrySpecificSearch' find single result. Starting KITT operation ... ");
+ RegisterStatusResults matchtedResult = registerSearchService.step7bKittProcess(
+ intermediateMatchingState, initialEidasData, ccAltSearchResult, altEidasData);
+
+ log.debug("KITT operation finished. Finalize matching process ... ");
+ foundMatchFinalizeTask(matchtedResult, altEidasData);
+
+ } else {
+ throw new WorkflowException("step12CountrySpecificSearch",
+ "More than one entry with unique country-specific information", true);
+
+ }
+ }
+
+ private void foundMatchFinalizeTask(RegisterStatusResults searchResult, SimpleEidasData eidasData)
+ throws WorkflowException, EaafStorageException {
+ MatchedPersonResult result = MatchedPersonResult.generateFormMatchingResult(
+ searchResult.getResult(), eidasData.getCitizenCountryCode());
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, result);
+
+ //remove intermediate matching-state
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, null);
+
+ }
+
+ @NotNull
+ private SimpleEidasData convertEidasAttrToSimpleData()
+ throws EidasAttributeException, EidPostProcessingException {
+ final ILightResponse eidasResponse = MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq)
+ .getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE, ILightResponse.class);
+ Map<String, Object> simpleMap = MatchingTaskUtils.convertEidasAttrToSimpleMap(
+ eidasResponse.getAttributes().getAttributeMap(), log);
+ return eidPostProcessor.postProcess(simpleMap);
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java
index 58ab0c6a..6d315b0a 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateIdentityLinkTask.java
@@ -23,87 +23,78 @@
package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.ParserConfigurationException;
-import org.apache.commons.lang3.StringUtils;
-import org.joda.time.DateTime;
+import org.jetbrains.annotations.Nullable;
+import org.jose4j.lang.JoseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.xml.sax.SAXException;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
+import com.fasterxml.jackson.core.JsonProcessingException;
import at.asitplus.eidas.specific.core.MsConnectorEventCodes;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr.SzrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.AuthBlockSigningService;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;
-import at.gv.e_government.reference.namespace.persondata._20020228.AlternativeNameType;
-import at.gv.e_government.reference.namespace.persondata._20020228.IdentificationType;
-import at.gv.e_government.reference.namespace.persondata._20020228.PersonNameType;
-import at.gv.e_government.reference.namespace.persondata._20020228.PhysicalPersonType;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
import at.gv.egiz.eaaf.core.api.data.EaafConstants;
import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
import at.gv.egiz.eaaf.core.api.idp.auth.data.IIdentityLink;
import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
-import at.gv.egiz.eaaf.core.exceptions.EaafBuilderException;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
import at.gv.egiz.eaaf.core.impl.builder.BpkBuilder;
import at.gv.egiz.eaaf.core.impl.data.Pair;
import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
import at.gv.egiz.eaaf.core.impl.idp.auth.data.SimpleIdentityLinkAssertionParser;
import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
-import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
-import at.gv.egiz.eaaf.core.impl.utils.XPathUtils;
-import eu.eidas.auth.commons.attribute.AttributeDefinition;
-import eu.eidas.auth.commons.attribute.AttributeValue;
-import eu.eidas.auth.commons.light.ILightResponse;
-import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import szrservices.IdentityLinkType;
-import szrservices.PersonInfoType;
-import szrservices.TravelDocumentType;
/**
* Task that creates the IdentityLink for an eIDAS authenticated person.
- *
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li>
+ * <li>{@link Constants#DATA_PERSON_MATCH_RESULT} the data of the matched entry in a register</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#EIDAS_BIND} the binding block</li>
+ * <li>{@link Constants#SZR_AUTHBLOCK} the auth block</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link at.gv.egiz.eaaf.core.impl.idp.controller.tasks.FinalizeAuthenticationTask}</li>
+ * </ul>
* @author tlenz
*/
@Slf4j
@Component("CreateIdentityLinkTask")
public class CreateIdentityLinkTask extends AbstractAuthServletTask {
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private IConfiguration basicConfig;
@Autowired
private SzrClient szrClient;
@Autowired
- private ICcSpecificEidProcessingService eidPostProcessor;
-
- @Autowired
private AuthBlockSigningService authBlockSigner;
private static final String EID_STATUS = "urn:eidgvat:eid.status.eidas";
-
+
/*
* (non-Javadoc)
*
@@ -116,98 +107,32 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {
public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
throws TaskExecutionException {
try {
- final AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
- final ILightResponse eidasResponse = authProcessData
- .getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE, ILightResponse.class);
- final Map<String, Object> simpleAttrMap = convertEidasAttrToSimpleMap(
- eidasResponse.getAttributes().getAttributeMap());
+ /*TODO: needs more re-factoring if we finalize CreateNewErnpEntryTask and we know how add entries into ERnP
+ * Maybe, we can fully replace eidData by matchedPersonData,
+ * because matchedPersonData holds the result after a successful matching process.
+ *
+ * Currently, we only add a work-around to operate without new ERnP implementation.
+ */
+ final SimpleEidasData eidData = MatchingTaskUtils.getInitialEidasData(pendingReq);
+ MatchedPersonResult matchedPersonData = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
- // post-process eIDAS attributes
- final ErnbEidData eidData = eidPostProcessor.postProcess(simpleAttrMap);
-
- // write MDS into technical log and revision log
+ // write log information based on current configuration
writeMdsLogInformation(eidData);
- //build IdentityLink or VSZ and eidasBind
- if (basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_USEDUMMY, false)) {
- SzrResultHolder idlResult = createDummyIdentityLinkForTestDeployment(eidData);
- //inject personal-data into session
- authProcessData.setIdentityLink(idlResult.getIdentityLink());
-
- // set bPK and bPKType into auth session
- authProcessData.setGenericDataToSession(PvpAttributeDefinitions.BPK_NAME, extendBpkByPrefix(
- idlResult.getBpK(), pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier()));
- authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME,
- pendingReq.getServiceProviderConfiguration()
- .getAreaSpecificTargetIdentifier());
-
+ //request SZR based on IDL or E-ID mode
+ if (pendingReq.getServiceProviderConfiguration()
+ .isConfigurationValue(MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE, false)) {
+ executeEidMode(eidData, matchedPersonData);
+
} else {
- //build SZR request from eIDAS data
- final PersonInfoType personInfo = generateSzrRequest(eidData);
-
- //request SZR based on IDL or E-ID mode
- if (pendingReq.getServiceProviderConfiguration()
- .isConfigurationValue(MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE, false)) {
-
- // get VSZ
- String vsz = getVszForPerson(personInfo);
-
- //write revision-Log entry and extended infos personal-identifier mapping
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_VSZ_RECEIVED);
- writeExtendedRevisionLogEntry(simpleAttrMap, eidData);
-
-
- // get eIDAS bind
- String signedEidasBind = szrClient.getEidsaBind(vsz,
- authBlockSigner.getBase64EncodedPublicKey(),
- EID_STATUS, eidData);
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_EIDASBIND_RECEIVED);
- authProcessData.setGenericDataToSession(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, signedEidasBind);
-
- //get signed AuthBlock
- String jwsSignature = authBlockSigner.buildSignedAuthBlock(pendingReq);
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.TECH_AUCHBLOCK_CREATED);
- authProcessData.setGenericDataToSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, jwsSignature);
-
- //inject personal-data into session
- authProcessData.setEidProcess(true);
-
- } else {
- //request SZR
- SzrResultHolder idlResult = requestSzrForIdentityLink(personInfo);
-
- //write revision-Log entry for personal-identifier mapping
- writeExtendedRevisionLogEntry(simpleAttrMap, eidData);
-
- //check result-data and write revision-log based on current state
- checkStateAndWriteRevisionLog(idlResult);
-
- //inject personal-data into session
- authProcessData.setIdentityLink(idlResult.getIdentityLink());
- authProcessData.setEidProcess(false);
-
- // set bPK and bPKType into auth session
- authProcessData.setGenericDataToSession(PvpAttributeDefinitions.BPK_NAME, extendBpkByPrefix(
- idlResult.getBpK(), pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier()));
- authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME,
- pendingReq.getServiceProviderConfiguration()
- .getAreaSpecificTargetIdentifier());
-
- }
+ executeIdlMode(eidData, matchedPersonData);
+
}
-
- //add generic info's into session
- authProcessData.setForeigner(true);
- authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, EidasResponseUtils
- .parseEidasPersonalIdentifier((String) simpleAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER))
- .getFirst());
- authProcessData.setQaaLevel(eidasResponse.getLevelOfAssurance());
-
- // store pending-request
+
+ storeGenericInfoToSession(eidData);
requestStoreage.storePendingRequest(pendingReq);
-
-
+
} catch (final EidasAttributeException e) {
throw new TaskExecutionException(pendingReq, "Minimum required eIDAS attributeset not found.", e);
@@ -221,338 +146,176 @@ public class CreateIdentityLinkTask extends AbstractAuthServletTask {
}
}
+ private void storeGenericInfoToSession(SimpleEidasData eidData) throws EaafStorageException {
+ AuthProcessDataWrapper authProcessData = MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq);
+ authProcessData.setForeigner(true);
+ authProcessData.setGenericDataToSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME,
+ eidData.getCitizenCountryCode());
+ }
- private String getVszForPerson(PersonInfoType personInfo) throws SzrCommunicationException, EaafException {
- if (basicConfig.getBasicConfigurationBoolean(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_IDA_VSZ_IDL, true)) {
- log.debug("IDA workaround is active. Requesting IDL to insert person into ERnP .... ");
-
- // work-around, because getEncryptedStammzahl does not support insertERnP for eIDAS entities
- SzrResultHolder idlResult = requestSzrForIdentityLink(personInfo);
-
- // get encrypted baseId
- return szrClient.getEncryptedStammzahl(buildGetEncryptedBaseIdReq(idlResult.identityLink));
-
-
- } else {
- return szrClient.getEncryptedStammzahl(personInfo, true);
-
- }
+ private void executeIdlMode(SimpleEidasData eidData, MatchedPersonResult matchedPersonData) throws EaafException {
+ //request SZR
+ SzrResultHolder idlResult = requestSzrForIdentityLink(eidData, matchedPersonData);
+
+ //write revision-Log entry for personal-identifier mapping
+ writeExtendedRevisionLogEntry(eidData, eidData.getPersonalIdentifier());
+ //check result-data and write revision-log based on current state
+ checkStateAndWriteRevisionLog(idlResult);
+
+ //inject personal-data into session
+ AuthProcessDataWrapper authProcessDataWrapper = MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq);
+ authProcessDataWrapper.setIdentityLink(idlResult.getIdentityLink());
+ authProcessDataWrapper.setEidProcess(false);
+
+ // set bPK and bPKType into auth session
+ authProcessDataWrapper.setGenericDataToSession(PvpAttributeDefinitions.BPK_NAME, extendBpkByPrefix(
+ idlResult.getBpK(), pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier()));
+ authProcessDataWrapper.setGenericDataToSession(PvpAttributeDefinitions.EID_SECTOR_FOR_IDENTIFIER_NAME,
+ pendingReq.getServiceProviderConfiguration()
+ .getAreaSpecificTargetIdentifier());
}
- private PersonInfoType buildGetEncryptedBaseIdReq(IIdentityLink identityLink) throws EaafBuilderException {
- log.debug("Generating getVsz request from identityLink information ... ");
- final PersonInfoType personInfo = new PersonInfoType();
- final PersonNameType personName = new PersonNameType();
- final PhysicalPersonType naturalPerson = new PhysicalPersonType();
- IdentificationType bpk = new IdentificationType();
-
- naturalPerson.setName(personName);
- personInfo.setPerson(naturalPerson);
- naturalPerson.setIdentification(bpk);
-
- // person information
- personName.setFamilyName(identityLink.getFamilyName());
- personName.setGivenName(identityLink.getGivenName());
- naturalPerson.setDateOfBirth(identityLink.getDateOfBirth());
-
- final Pair<String, String> bpkCalc =
- BpkBuilder.generateAreaSpecificPersonIdentifier(
- identityLink.getIdentificationValue(),
- identityLink.getIdentificationType(),
- EaafConstants.URN_PREFIX_CDID + "ZP");
- bpk.setValue(bpkCalc.getFirst());
- bpk.setType(bpkCalc.getSecond());
- return personInfo;
+ private void executeEidMode(SimpleEidasData eidData, MatchedPersonResult matchedPersonData)
+ throws JsonProcessingException, EaafException, JoseException {
+ // get encrypted baseId
+ log.debug("Requesting encrypted baseId by already matched person information ... ");
+ String vsz = szrClient.getEncryptedStammzahl(matchedPersonData);
+
+ //write revision-Log entry and extended infos personal-identifier mapping
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_VSZ_RECEIVED);
+ writeExtendedRevisionLogEntry(eidData, eidData.getPersonalIdentifier());
+
+ // get eIDAS bind
+ String signedEidasBind = szrClient
+ .getEidasBind(vsz, authBlockSigner.getBase64EncodedPublicKey(), EID_STATUS, eidData);
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_EIDASBIND_RECEIVED);
+ AuthProcessDataWrapper authProcessDataWrapper = MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq);
+ authProcessDataWrapper.setGenericDataToSession(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, signedEidasBind);
+
+ //get signed AuthBlock
+ String jwsSignature = authBlockSigner.buildSignedAuthBlock(pendingReq);
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.TECH_AUCHBLOCK_CREATED);
+ authProcessDataWrapper.setGenericDataToSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, jwsSignature);
+
+ //inject personal-data into session
+ authProcessDataWrapper.setEidProcess(true);
}
- private void writeExtendedRevisionLogEntry(Map<String, Object> simpleAttrMap, ErnbEidData eidData) {
- // write ERnB input-data into revision-log
+ private void writeExtendedRevisionLogEntry(SimpleEidasData eidData, String personalIdentifier) {
+ // write ERnP input-data into revision-log
if (basicConfig.getBasicConfigurationBoolean(
Constants.CONIG_PROPS_EIDAS_SZRCLIENT_WORKAROUND_REVISIONLOGDATASTORE_ACTIVE, false)) {
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_RAW_ID,
- (String) simpleAttrMap.get(Constants.eIDAS_ATTR_PERSONALIDENTIFIER));
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_RAW_ID, personalIdentifier);
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_ERNB_EIDAS_ERNB_ID, eidData.getPseudonym());
}
}
-
- private PersonInfoType generateSzrRequest(ErnbEidData eidData) {
- log.debug("Starting connecting SZR Gateway");
- final PersonInfoType personInfo = new PersonInfoType();
- final PersonNameType personName = new PersonNameType();
- final PhysicalPersonType naturalPerson = new PhysicalPersonType();
- final TravelDocumentType eDocument = new TravelDocumentType();
-
- naturalPerson.setName(personName);
- personInfo.setPerson(naturalPerson);
- personInfo.setTravelDocument(eDocument);
-
- // person information
- personName.setFamilyName(eidData.getFamilyName());
- personName.setGivenName(eidData.getGivenName());
- naturalPerson.setDateOfBirth(eidData.getFormatedDateOfBirth());
- eDocument.setIssuingCountry(eidData.getCitizenCountryCode());
- eDocument.setDocumentNumber(eidData.getPseudonym());
-
- // eID document information
- eDocument.setDocumentType(basicConfig
- .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_EDOCUMENTTYPE,
- Constants.SZR_CONSTANTS_DEFAULT_DOCUMENT_TYPE));
-
- // set PlaceOfBirth if available
- if (eidData.getPlaceOfBirth() != null) {
- log.trace("Find 'PlaceOfBirth' attribute: " + eidData.getPlaceOfBirth());
- if (basicConfig
- .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_SETPLACEOFBIRTHIFAVAILABLE,
- true)) {
- naturalPerson.setPlaceOfBirth(eidData.getPlaceOfBirth());
- log.trace("Adding 'PlaceOfBirth' to ERnB request ... ");
-
- }
- }
-
- // set BirthName if available
- if (eidData.getBirthName() != null) {
- log.trace("Find 'BirthName' attribute: " + eidData.getBirthName());
- if (basicConfig
- .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_SETBIRTHNAMEIFAVAILABLE,
- true)) {
- final AlternativeNameType alternativeName = new AlternativeNameType();
- naturalPerson.setAlternativeName(alternativeName);
- alternativeName.setFamilyName(eidData.getBirthName());
- log.trace("Adding 'BirthName' to ERnB request ... ");
-
- }
- }
-
- return personInfo;
-
- }
- private SzrResultHolder requestSzrForIdentityLink(PersonInfoType personInfo)
- throws SzrCommunicationException, EaafException {
+ private SzrResultHolder requestSzrForIdentityLink(SimpleEidasData eidData,
+ MatchedPersonResult matchedPersonData) throws EaafException {
//request IdentityLink from SZR
- final IdentityLinkType result = szrClient.getIdentityLinkInRawMode(personInfo);
-
+ log.debug("Requesting encrypted baseId by already matched person information ... ");
+ IdentityLinkType result = szrClient.getIdentityLinkInRawMode(matchedPersonData);
+
final Element idlFromSzr = (Element) result.getAssertion();
- IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlFromSzr).parseIdentityLink();
+ final IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlFromSzr).parseIdentityLink();
// get bPK from SZR
String bpk = null;
- if (basicConfig
- .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_USESRZFORBPKGENERATION, true)) {
- List<String> bpkList = szrClient
- .getBpk(personInfo, pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier(),
- basicConfig
- .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined"));
+ String targetId = pendingReq.getServiceProviderConfiguration().getAreaSpecificTargetIdentifier();
+ boolean debugUseSzrForBpk = basicConfig
+ .getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_DEBUG_USESRZFORBPKGENERATION, true);
+ if (debugUseSzrForBpk) {
+ String vkz = basicConfig
+ .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined");
+ List<String> bpkList = szrClient.getBpk(eidData, targetId, vkz);
if (!bpkList.isEmpty()) {
bpk = bpkList.get(0);
-
}
-
-
} else {
log.debug("Calculating bPK from baseId ... ");
- final Pair<String, String> bpkCalc = BpkBuilder
- .generateAreaSpecificPersonIdentifier(identityLink.getIdentificationValue(),
- identityLink.getIdentificationType(),
- pendingReq.getServiceProviderConfiguration()
- .getAreaSpecificTargetIdentifier());
+ String idValue = identityLink.getIdentificationValue();
+ String idType = identityLink.getIdentificationType();
+ final Pair<String, String> bpkCalc = BpkBuilder.generateAreaSpecificPersonIdentifier(idValue, idType, targetId);
bpk = bpkCalc.getFirst();
-
+
}
-
+
return new SzrResultHolder(identityLink, bpk);
-
}
-
+
private void checkStateAndWriteRevisionLog(SzrResultHolder idlResult) throws SzrCommunicationException {
// write some infos into revision log
if (idlResult.getIdentityLink() == null) {
log.error("ERnB did not return an identity link.");
throw new SzrCommunicationException("ernb.00", null);
-
}
- revisionsLogger.logEvent(pendingReq,
- MsConnectorEventCodes.SZR_IDL_RECEIVED,
- idlResult.getIdentityLink().getSamlAssertion()
- .getAttribute(SimpleIdentityLinkAssertionParser.ASSERTIONID));
+
+ String assertionId = idlResult.getIdentityLink().getSamlAssertion()
+ .getAttribute(SimpleIdentityLinkAssertionParser.ASSERTIONID);
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_IDL_RECEIVED, assertionId);
if (idlResult.getBpK() == null) {
log.error("ERnB did not return a bPK for target: " + pendingReq.getServiceProviderConfiguration()
- .getAreaSpecificTargetIdentifier());
+ .getAreaSpecificTargetIdentifier());
throw new SzrCommunicationException("ernb.01", null);
-
}
+
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.SZR_BPK_RECEIVED);
log.debug("ERnB communication was successfull");
-
}
-
- private String extendBpkByPrefix(String bpk, String type) {
- String bpkType = null;
-
- if (type.startsWith(EaafConstants.URN_PREFIX_WBPK)) {
- bpkType = type.substring(EaafConstants.URN_PREFIX_WBPK.length());
- } else if (type.startsWith(EaafConstants.URN_PREFIX_CDID)) {
- bpkType = type.substring(EaafConstants.URN_PREFIX_CDID.length());
- } else if (type.startsWith(EaafConstants.URN_PREFIX_EIDAS)) {
- bpkType = type.substring(EaafConstants.URN_PREFIX_EIDAS.length());
- }
+ private String extendBpkByPrefix(String bpk, String type) {
+ String bpkType = getBpkType(type);
if (bpkType != null) {
log.trace("Authenticate user with bPK/wbPK " + bpk + " and Type=" + bpkType);
return bpkType + ":" + bpk;
-
} else {
log.warn("Service Provider Target with: " + type + " is NOT supported. Set bPK as it is ...");
return bpk;
-
}
-
}
- private Map<String, Object> convertEidasAttrToSimpleMap(
- ImmutableMap<AttributeDefinition<?>, ImmutableSet<? extends AttributeValue<?>>> attributeMap) {
- final Map<String, Object> result = new HashMap<>();
-
- for (final AttributeDefinition<?> el : attributeMap.keySet()) {
-
- final Class<?> parameterizedType = el.getParameterizedType();
- if (DateTime.class.equals(parameterizedType)) {
- final DateTime attribute = EidasResponseUtils.translateDateAttribute(el, attributeMap.get(el).asList());
- if (attribute != null) {
- result.put(el.getFriendlyName(), attribute);
- log.trace("Find attr '" + el.getFriendlyName() + "' with value: " + attribute.toString());
-
- } else {
- log.info("Ignore empty 'DateTime' attribute");
- }
-
- } else if (PostalAddress.class.equals(parameterizedType)) {
- final PostalAddress addressAttribute = EidasResponseUtils
- .translateAddressAttribute(el, attributeMap.get(el).asList());
- if (addressAttribute != null) {
- result.put(el.getFriendlyName(), addressAttribute);
- log.trace("Find attr '" + el.getFriendlyName() + "' with value: " + addressAttribute.toString());
-
- } else {
- log.info("Ignore empty 'PostalAddress' attribute");
- }
-
- } else {
- final List<String> natPersonIdObj = EidasResponseUtils
- .translateStringListAttribute(el, attributeMap.get(el));
- if (natPersonIdObj.isEmpty()) {
- log.info("Ignore attribute: {}, because no attributeValue was found",
- el.getNameUri());
-
- } else {
- final String stringAttr = natPersonIdObj.get(0);
- if (StringUtils.isNotEmpty(stringAttr)) {
- result.put(el.getFriendlyName(), stringAttr);
- log.trace("Find attr '" + el.getFriendlyName() + "' with value: " + stringAttr);
-
- } else {
- log.info("Ignore empty 'String' attributeValue for: {}",
- el.getNameUri());
-
- }
-
- }
- }
+ @Nullable
+ private String getBpkType(String type) {
+ if (type.startsWith(EaafConstants.URN_PREFIX_WBPK)) {
+ return type.substring(EaafConstants.URN_PREFIX_WBPK.length());
+ } else if (type.startsWith(EaafConstants.URN_PREFIX_CDID)) {
+ return type.substring(EaafConstants.URN_PREFIX_CDID.length());
+ } else if (type.startsWith(EaafConstants.URN_PREFIX_EIDAS)) {
+ return type.substring(EaafConstants.URN_PREFIX_EIDAS.length());
+ } else {
+ return null;
}
-
- log.debug("Receive #" + result.size() + " attributes with names: " + result.keySet().toString());
-
- return result;
}
- private void writeMdsLogInformation(ErnbEidData eidData) {
- // log MDS and country code into technical log
- if (basicConfig
- .getBasicConfigurationBoolean(MsEidasNodeConstants.PROP_CONFIG_TECHNICALLOG_WRITE_MDS_INTO_TECH_LOG, false)) {
+
+ /**
+ * write MDS into technical log and revision log.
+ */
+ private void writeMdsLogInformation(SimpleEidasData eidData) {
+ boolean writeMdsInTechLog = basicConfig
+ .getBasicConfigurationBoolean(MsEidasNodeConstants.PROP_CONFIG_TECHNICALLOG_WRITE_MDS_INTO_TECH_LOG, false);
+ if (writeMdsInTechLog) {
log.info("eIDAS Auth. for user: " + eidData.getGivenName() + " " + eidData.getFamilyName() + " " + eidData
- .getFormatedDateOfBirth() + " " + "from " + eidData.getCitizenCountryCode());
+ .getDateOfBirth() + " " + "from " + eidData.getCitizenCountryCode());
}
- // log MDS and country code into revision log
- if (basicConfig
+ boolean writeMdsInRevLog = basicConfig
.getBasicConfigurationBoolean(MsEidasNodeConstants.PROP_CONFIG_REVISIONLOG_WRITE_MDS_INTO_REVISION_LOG,
- false)) {
+ false);
+ if (writeMdsInRevLog) {
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_MDSDATA,
- "{" + eidData.getGivenName() + "," + eidData.getFamilyName() + "," + eidData
- .getFormatedDateOfBirth() + "," + eidData.getCitizenCountryCode() + "}");
+ "{" + eidData.getGivenName() + "," + eidData.getFamilyName() + "," + eidData
+ .getDateOfBirth() + "," + eidData.getCitizenCountryCode() + "}");
}
-
}
-
+
@Data
- private static class SzrResultHolder {
+ private static class SzrResultHolder {
final IIdentityLink identityLink;
final String bpK;
-
- }
-
- /**
- * Build a dummy IdentityLink and a dummy bPK based on eIDAS information.
- *
- * <br><br>
- * <b>FOR LOCAL TESTING ONLY!!!</b>
- *
- * @param eidData Information from eIDAS response
- * @return IdentityLink and bPK
- * @throws ParserConfigurationException In case of an IDL processing error
- * @throws SAXException In case of an IDL processing error
- * @throws IOException In case of an IDL processing error
- * @throws EaafException In case of a bPK generation error
- */
- private SzrResultHolder createDummyIdentityLinkForTestDeployment(ErnbEidData eidData)
- throws ParserConfigurationException, SAXException, IOException, EaafException {
- log.warn("SZR-Dummy IS ACTIVE! IdentityLink is NOT VALID!!!!");
- // create fake IdL
- // - fetch IdL template from resources
- final InputStream s = CreateIdentityLinkTask.class
- .getResourceAsStream("/resources/xmldata/fakeIdL_IdL_template.xml");
- final Element idlTemplate = DomUtils.parseXmlValidating(s);
-
- IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlTemplate).parseIdentityLink();
-
- // replace data
- final Element idlassertion = identityLink.getSamlAssertion();
-
- // - set fake baseID;
- final Node prIdentification = XPathUtils
- .selectSingleNode(idlassertion, SimpleIdentityLinkAssertionParser.PERSON_IDENT_VALUE_XPATH);
- prIdentification.getFirstChild().setNodeValue(eidData.getPseudonym());
-
- // - set last name
- final Node prFamilyName = XPathUtils
- .selectSingleNode(idlassertion, SimpleIdentityLinkAssertionParser.PERSON_FAMILY_NAME_XPATH);
- prFamilyName.getFirstChild().setNodeValue(eidData.getFamilyName());
-
- // - set first name
- final Node prGivenName = XPathUtils
- .selectSingleNode(idlassertion, SimpleIdentityLinkAssertionParser.PERSON_GIVEN_NAME_XPATH);
- prGivenName.getFirstChild().setNodeValue(eidData.getGivenName());
-
- // - set date of birth
- final Node prDateOfBirth = XPathUtils
- .selectSingleNode(idlassertion, SimpleIdentityLinkAssertionParser.PERSON_DATE_OF_BIRTH_XPATH);
-
- prDateOfBirth.getFirstChild().setNodeValue(eidData.getFormatedDateOfBirth());
-
- identityLink = new SimpleIdentityLinkAssertionParser(idlassertion).parseIdentityLink();
-
- final Pair<String, String> bpkCalc = BpkBuilder
- .generateAreaSpecificPersonIdentifier(identityLink.getIdentificationValue(),
- identityLink.getIdentificationType(),
- pendingReq.getServiceProviderConfiguration()
- .getAreaSpecificTargetIdentifier());
- return new SzrResultHolder(identityLink, bpkCalc.getFirst());
-
- }
+ }
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java
new file mode 100644
index 00000000..c7843be5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/CreateNewErnpEntryTask.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Task that searches ERnP and ZMR before adding person to SZR.
+ * This corresponds to Step 9 in the eIDAS Matching Concept.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS}</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>TODO MDS, BPK of new entry</li>
+ * </ul>
+ *
+ * @author tlenz
+ * @author amarsalek
+ * @author ckollmann
+ */
+@Slf4j
+@Component("CreateNewErnbEntryTask")
+public class CreateNewErnpEntryTask extends AbstractAuthServletTask {
+
+ private final ErnpRestClient ernpClient;
+
+ /**
+ * Constructor.
+ * @param client SZR client for creating a new ERnP entry
+ */
+ public CreateNewErnpEntryTask(@Autowired ErnpRestClient client) {
+ this.ernpClient = client;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
+ throws TaskExecutionException {
+ try {
+ SimpleEidasData simpleEidasData = MatchingTaskUtils.getInitialEidasData(pendingReq);
+ if (simpleEidasData == null) {
+ throw new WorkflowException("step09", "No initial eIDAS authn data", true);
+
+ }
+
+ //add person into ERnP
+ ErnpRegisterResult resp = ernpClient.add(simpleEidasData);
+ if (resp.getPersonResult().size() != 1) {
+ log.error("Receive {} from ERnP during 'add person' step",
+ resp.getPersonResult().isEmpty() ? "no result" : "more-than-one result");
+ throw new WorkflowException("step09", "Add person into ERnP failed", true);
+
+ }
+
+ // finish matching process, because new user-entry uniquly matches
+ log.info("User successfully registerred into ERnP and matching tasks are finished ");
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq,
+ MatchedPersonResult.generateFormMatchingResult(
+ resp.getPersonResult().get(0), simpleEidasData.getCitizenCountryCode()));
+
+ } catch (final Exception e) {
+ log.error("Initial search FAILED.", e);
+ throw new TaskExecutionException(pendingReq, "Initial search FAILED.", e);
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAustrianResidenceGuiTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAustrianResidenceGuiTask.java
new file mode 100644
index 00000000..dc57dd78
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAustrianResidenceGuiTask.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.core.gui.StaticGuiBuilderConfiguration;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.gui.AbstractGuiFormBuilderConfiguration;
+import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Show GUI where user can provide an Austrian residence address, to provide further input to match the identity.
+ *
+ * @author ckollmann
+ */
+@Slf4j
+@Component("GenerateAustrianResidenceGuiTask")
+public class GenerateAustrianResidenceGuiTask extends AbstractLocaleAuthServletTask {
+
+ public static final String PARAM_FORMWIZARDPOINT = "wizardEndpoint";
+
+ @Autowired
+ private ISpringMvcGuiFormBuilder guiBuilder;
+ @Autowired
+ private IConfiguration basicConfig;
+
+ @Override
+ public void executeWithLocale(ExecutionContext executionContext,
+ HttpServletRequest request, HttpServletResponse response) throws TaskExecutionException {
+ try {
+ final StaticGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration(
+ basicConfig,
+ pendingReq,
+ basicConfig.getBasicConfiguration(
+ MsEidasNodeConstants.PROP_CONFIG_WEBCONTENT_TEMPLATES_RESIDENCY,
+ MsEidasNodeConstants.TEMPLATE_HTML_RESIDENCY),
+ MsEidasNodeConstants.ENDPOINT_RESIDENCY_INPUT,
+ resourceLoader);
+
+ // inject REST end-point for wizard
+ config.putCustomParameterWithOutEscaption(null,
+ PARAM_FORMWIZARDPOINT,
+ pendingReq.getAuthUrl() + MsEidasNodeConstants.ENDPOINT_RESIDENCY_SEARCH);
+
+
+ // inject flag to indicate advanced matching error
+ if (MatchingTaskUtils.getExecutionContextFlag(
+ executionContext, Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED)) {
+ config.putCustomParameter(AbstractGuiFormBuilderConfiguration.PARAM_GROUP_UIOPTIONS,
+ Constants.HTML_FORM_ADVANCED_MATCHING_FAILED, String.valueOf(true));
+
+ //set detailed error-code
+ if (executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON) != null) {
+ config.putCustomParameter(AbstractGuiFormBuilderConfiguration.PARAM_GROUP_UIOPTIONS,
+ Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON,
+ executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON).toString());
+ }
+ }
+
+ // reset executionContext parameters
+ ReceiveOtherLoginMethodGuiResponseTask.ALL_EXECUTIONCONTEXT_PARAMETERS.forEach(
+ el -> executionContext.remove(el));
+
+ guiBuilder.build(request, response, config, "Query Austrian residency");
+
+ } catch (final Exception e) {
+ log.error("Initial search FAILED.", e);
+ throw new TaskExecutionException(pendingReq, "Gui creation FAILED.", e);
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java
index 0f1b5432..849f8136 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateAuthnRequestTask.java
@@ -19,10 +19,11 @@
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
-*/
+ */
package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+import java.io.IOException;
import java.util.UUID;
import javax.servlet.ServletException;
@@ -30,6 +31,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@@ -39,6 +41,7 @@ import at.asitplus.eidas.specific.core.MsConnectorEventCodes;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.asitplus.eidas.specific.core.gui.StaticGuiBuilderConfiguration;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder;
@@ -47,6 +50,7 @@ import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;
import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.GuiBuildException;
import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
import eu.eidas.auth.commons.EidasParameterKeys;
@@ -59,149 +63,168 @@ import eu.eidas.specificcommunication.exception.SpecificCommunicationException;
import eu.eidas.specificcommunication.protocol.SpecificCommunicationService;
import lombok.extern.slf4j.Slf4j;
+
/**
- * Authentication-process task that generates the Authn. Request to eIDAS Node.
- *
- * @author tlenz
+ * Generates the authn request to the eIDAS Node. This is the first task in the process.
+ * Input:
+ * <ul>
+ * <li>none</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>none</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask}
+ * to read the response from the eIDAS Node</li>
+ * </ul>
*
+ * @author tlenz
+ * @author ckollmann
*/
@Slf4j
-@Component("ConnecteIDASNodeTask")
+@Component("GenerateAuthnRequestTask")
public class GenerateAuthnRequestTask extends AbstractAuthServletTask {
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
IConfiguration basicConfig;
+
@Autowired
ApplicationContext context;
+
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
ITransactionStorage transactionStore;
+
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
ISpringMvcGuiFormBuilder guiBuilder;
+
@Autowired
ICcSpecificEidProcessingService ccSpecificProcessing;
@Override
- public void execute(ExecutionContext executionContext,
- HttpServletRequest request, HttpServletResponse response)
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
throws TaskExecutionException {
-
try {
- // get target, environment and validate citizen countryCode
- final String citizenCountryCode = (String) executionContext.get(
- MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
- final String environment = (String) executionContext.get(
- MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT);
-
- if (StringUtils.isEmpty(citizenCountryCode)) {
- // illegal state; task should not have been executed without a selected country
- throw new EidasSAuthenticationException("eidas.03", new Object[] { "" });
-
- }
-
- // TODO: maybe add countryCode validation before request ref. impl. eIDAS node
- log.info("Request eIDAS auth. for citizen of country: " + citizenCountryCode);
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.COUNTRY_SELECTED, citizenCountryCode);
-
- // build eIDAS AuthnRequest
- final LightRequest.Builder authnRequestBuilder = LightRequest.builder();
- authnRequestBuilder.id(UUID.randomUUID().toString());
-
- // set nameIDFormat
- authnRequestBuilder.nameIdFormat(
- authConfig.getBasicConfiguration(Constants.CONFIG_PROP_EIDAS_NODE_NAMEIDFORMAT));
-
- // set citizen country code for foreign uses
- authnRequestBuilder.citizenCountryCode(citizenCountryCode);
-
- //set Issuer
- final String issur = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_ENTITYID);
- if (StringUtils.isEmpty(issur)) {
- log.error("Found NO 'eIDAS node issuer' in configuration. Authentication NOT possible!");
- throw new EaafConfigurationException("config.27",
- new Object[] { "Application config containts NO " + Constants.CONIG_PROPS_EIDAS_NODE_ENTITYID });
-
- }
- authnRequestBuilder.issuer(issur);
-
+ final String citizenCountryCode = extractCitizenCountryCode(executionContext);
+ final String environment = (String) executionContext.get(MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT);
+ final String issuer = loadIssuerFromConfig();
+
+ // inject MS-Connector staging parameters
+ injectStagingWorkaroundForMsConnector();
- // Add country-specific informations into eIDAS request
- ccSpecificProcessing.preProcess(citizenCountryCode, pendingReq, authnRequestBuilder);
-
- // build request
- final LightRequest lightAuthnReq = authnRequestBuilder.build();
-
- // put request into shared cache
+ final LightRequest lightAuthnReq = buildEidasAuthnRequest(citizenCountryCode, issuer);
+
final BinaryLightToken token = putRequestInCommunicationCache(lightAuthnReq);
final String tokenBase64 = BinaryLightTokenHelper.encodeBinaryLightTokenBase64(token);
+ workaroundRelayState(lightAuthnReq);
+ final String forwardUrl = selectForwardUrl(environment);
- // Workaround for ms-connector staging
- injectStagingWorkaroundForMsConnector();
-
- // Workaround, because eIDAS node ref. impl. does not return relayState
- if (basicConfig.getBasicConfigurationBoolean(
- Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_USEREQUESTIDASTRANSACTIONIDENTIFIER,
- false)) {
- log.trace("Put lightRequestId into transactionstore as session-handling backup");
- transactionStore.put(lightAuthnReq.getId(), pendingReq.getPendingRequestId(), -1);
-
- }
-
- // select forward URL regarding the selected environment
- String forwardUrl = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL);
- if (StringUtils.isNotEmpty(environment)) {
- forwardUrl = selectedForwardUrlForEnvironment(environment);
- }
-
- if (StringUtils.isEmpty(forwardUrl)) {
- log.warn("NO ForwardURL defined in configuration. Can NOT forward to eIDAS node! Process stops");
- throw new EaafConfigurationException("config.08", new Object[] {
- environment == null ? Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL
- : Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL + "." + environment
- });
-
- }
- log.debug("ForwardURL: " + forwardUrl + " selected to forward eIDAS request");
-
- if (basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_METHOD,
- Constants.FORWARD_METHOD_GET).equals(Constants.FORWARD_METHOD_GET)) {
-
- log.debug("Use http-redirect for eIDAS node forwarding ... ");
- // send redirect
- final UriComponentsBuilder redirectUrl = UriComponentsBuilder.fromHttpUrl(forwardUrl);
- redirectUrl.queryParam(EidasParameterKeys.TOKEN.toString(), tokenBase64);
- response.sendRedirect(redirectUrl.build().encode().toString());
+ String configValue = basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_METHOD, Constants.FORWARD_METHOD_GET);
+ boolean useHttpRedirect = configValue.equals(Constants.FORWARD_METHOD_GET);
+ if (useHttpRedirect) {
+ sendRedirect(response, tokenBase64, forwardUrl);
} else {
- log.debug("Use http-post for eIDAS node forwarding ... ");
- final StaticGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration(
- basicConfig,
- pendingReq,
- Constants.TEMPLATE_POST_FORWARD_NAME,
- null,
- resourceLoader);
-
- config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_ENDPOINT, forwardUrl);
- config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_TOKEN_NAME,
- EidasParameterKeys.TOKEN.toString());
- config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_TOKEN_VALUE,
- tokenBase64);
-
- guiBuilder.build(request, response, config, "Forward to eIDASNode form");
-
+ sendPost(request, response, tokenBase64, forwardUrl);
}
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.EIDAS_NODE_CONNECTED, lightAuthnReq.getId());
-
} catch (final EidasSAuthenticationException e) {
throw new TaskExecutionException(pendingReq, "eIDAS AuthnRequest generation FAILED.", e);
-
} catch (final Exception e) {
log.warn("eIDAS AuthnRequest generation FAILED.", e);
throw new TaskExecutionException(pendingReq, e.getMessage(), e);
+ }
+ }
+ @NotNull
+ private String extractCitizenCountryCode(ExecutionContext executionContext) throws EidasSAuthenticationException {
+ final String result = (String) executionContext.get(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
+ // illegal state; task should not have been executed without a selected country
+ if (StringUtils.isEmpty(result)) {
+ throw new EidasSAuthenticationException("eidas.03", new Object[]{""});
}
+ // TODO: maybe add countryCode validation before request ref. impl. eIDAS node
+ log.info("Request eIDAS auth. for citizen of country: {}", result);
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.COUNTRY_SELECTED, result);
+ return result;
+ }
+
+ @NotNull
+ private String loadIssuerFromConfig() throws EaafConfigurationException {
+ final String result = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_ENTITYID);
+ if (StringUtils.isEmpty(result)) {
+ log.error("Found NO 'eIDAS node issuer' in configuration. Authentication NOT possible!");
+ throw new EaafConfigurationException("config.27",
+ new Object[]{"Application config containts NO " + Constants.CONIG_PROPS_EIDAS_NODE_ENTITYID});
+ }
+ return result;
+ }
+
+ @NotNull
+ private LightRequest buildEidasAuthnRequest(String citizenCountryCode, String issuer)
+ throws EidPostProcessingException {
+ final LightRequest.Builder builder = LightRequest.builder();
+ builder.id(UUID.randomUUID().toString());
+
+ // set nameIDFormat
+ builder.nameIdFormat(
+ authConfig.getBasicConfiguration(Constants.CONFIG_PROP_EIDAS_NODE_NAMEIDFORMAT));
+
+ builder.citizenCountryCode(citizenCountryCode);
+ builder.issuer(issuer);
+ // Add country-specific information into eIDAS request
+ ccSpecificProcessing.preProcess(citizenCountryCode, pendingReq, builder);
+ return builder.build();
+ }
+
+ private BinaryLightToken putRequestInCommunicationCache(ILightRequest lightRequest)
+ throws ServletException {
+ final BinaryLightToken binaryLightToken;
+ try {
+ String beanName = SpecificCommunicationDefinitionBeanNames.SPECIFIC_CONNECTOR_COMMUNICATION_SERVICE.toString();
+ final SpecificCommunicationService service = (SpecificCommunicationService) context.getBean(beanName);
+ binaryLightToken = service.putRequest(lightRequest);
+ } catch (final SpecificCommunicationException e) {
+ log.error("Unable to process specific request");
+ throw new ServletException(e);
+ }
+
+ return binaryLightToken;
+ }
+
+ /**
+ * Workaround, because eIDAS node ref. impl. does not return relayState
+ */
+ private void workaroundRelayState(LightRequest lightAuthnReq) throws EaafException {
+ if (basicConfig.getBasicConfigurationBoolean(
+ Constants.CONIG_PROPS_EIDAS_NODE_WORKAROUND_USEREQUESTIDASTRANSACTIONIDENTIFIER,
+ false)) {
+ log.trace("Put lightRequestId into transactionstore as session-handling backup");
+ transactionStore.put(lightAuthnReq.getId(), pendingReq.getPendingRequestId(), -1);
+ }
+ }
+ @NotNull
+ private String selectForwardUrl(String environment) throws EaafConfigurationException {
+ String result = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL);
+ if (StringUtils.isNotEmpty(environment)) {
+ result = selectedForwardUrlForEnvironment(environment);
+ }
+ if (StringUtils.isEmpty(result)) {
+ log.warn("NO ForwardURL defined in configuration. Can NOT forward to eIDAS node! Process stops");
+ throw new EaafConfigurationException("config.08", new Object[]{
+ environment == null ? Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL
+ : Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL + "." + environment
+ });
+ }
+ log.debug("ForwardURL: {} selected to forward eIDAS request", result);
+ return result;
}
@@ -224,51 +247,48 @@ public class GenerateAuthnRequestTask extends AbstractAuthServletTask {
* <br>
* <b>Info: </b> This method is needed, because eIDAS Ref. Impl only supports
* one countrycode on each instance. In consequence, more than one eIDAS Ref.
- * Impl nodes are required to support producation, testing, or QS stages for one
+ * Impl nodes are required to support production, testing, or QS stages for one
* country by using one ms-specific eIDAS connector
- *
+ *
* @param environment Environment selector from CountrySlection page
- * @return
+ * @return the URL from the configuration
*/
private String selectedForwardUrlForEnvironment(String environment) {
- log.trace("Starting endpoint selection process for environment: " + environment + " ... ");
+ log.trace("Starting endpoint selection process for environment: {} ... ", environment);
if (environment.equalsIgnoreCase(MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_PRODUCTION)) {
return basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL);
} else if (environment.equalsIgnoreCase(MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_QS)) {
return basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL
+ "." + MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_QS);
- } else if (environment.equalsIgnoreCase(
- MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_TESTING)) {
+ } else if (environment.equalsIgnoreCase(MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_TESTING)) {
return basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL
+ "." + MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_TESTING);
- } else if (environment.equalsIgnoreCase(
- MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_DEVELOPMENT)) {
+ } else if (environment.equalsIgnoreCase(MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_DEVELOPMENT)) {
return basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_FORWARD_URL
+ "." + MsEidasNodeConstants.REQ_PARAM_SELECTED_ENVIRONMENT_VALUE_DEVELOPMENT);
}
-
- log.info("Environment selector: " + environment + " is not supported");
+ log.info("Environment selector: {} is not supported", environment);
return null;
-
}
- private BinaryLightToken putRequestInCommunicationCache(ILightRequest lightRequest)
- throws ServletException {
- final BinaryLightToken binaryLightToken;
- try {
- final SpecificCommunicationService springManagedSpecificConnectorCommunicationService =
- (SpecificCommunicationService) context.getBean(
- SpecificCommunicationDefinitionBeanNames.SPECIFIC_CONNECTOR_COMMUNICATION_SERVICE.toString());
-
- binaryLightToken = springManagedSpecificConnectorCommunicationService.putRequest(lightRequest);
-
- } catch (final SpecificCommunicationException e) {
- log.error("Unable to process specific request");
- throw new ServletException(e);
-
- }
+ private void sendRedirect(HttpServletResponse response, String tokenBase64, String forwardUrl) throws IOException {
+ log.debug("Use http-redirect for eIDAS node forwarding ... ");
+ final UriComponentsBuilder redirectUrl = UriComponentsBuilder.fromHttpUrl(forwardUrl);
+ redirectUrl.queryParam(EidasParameterKeys.TOKEN.toString(), tokenBase64);
+ response.sendRedirect(redirectUrl.build().encode().toString());
+
+ }
- return binaryLightToken;
+ private void sendPost(HttpServletRequest request, HttpServletResponse response, String tokenBase64, String forwardUrl)
+ throws GuiBuildException {
+ log.debug("Use http-post for eIDAS node forwarding ... ");
+ final StaticGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration(
+ basicConfig, pendingReq, Constants.TEMPLATE_POST_FORWARD_NAME, null, resourceLoader);
+ config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_ENDPOINT, forwardUrl);
+ String token = EidasParameterKeys.TOKEN.toString();
+ config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_TOKEN_NAME, token);
+ config.putCustomParameter(null, Constants.TEMPLATE_POST_FORWARD_TOKEN_VALUE, tokenBase64);
+ guiBuilder.build(request, response, config, "Forward to eIDASNode form");
}
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateMobilePhoneSignatureRequestTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateMobilePhoneSignatureRequestTask.java
new file mode 100644
index 00000000..26282d5c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateMobilePhoneSignatureRequestTask.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import java.text.MessageFormat;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthRequestBuilderConfiguration;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import at.gv.egiz.eaaf.core.impl.utils.Random;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.sp.impl.PvpAuthnRequestBuilder;
+import lombok.extern.slf4j.Slf4j;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+import net.shibboleth.utilities.java.support.security.impl.SecureRandomIdentifierGenerationStrategy;
+
+/**
+ * Generate a SAML2 AuthnRequest to authenticate the user at ID Austria system.
+ * This corresponds to Step 15A in the eIDAS Matching Concept.
+ *
+ * @author tlenz
+ */
+@Slf4j
+@Component("GenerateMobilePhoneSignatureRequestTask")
+public class GenerateMobilePhoneSignatureRequestTask extends AbstractAuthServletTask {
+
+ private static final String ERROR_MSG_1 =
+ "Requested 'ms-specific eIDAS node' {0} has no valid metadata or metadata is not found";
+
+ @Autowired
+ PvpAuthnRequestBuilder authnReqBuilder;
+ @Autowired
+ IdAustriaClientAuthCredentialProvider credential;
+ @Autowired
+ IdAustriaClientAuthMetadataProvider metadataService;
+ @Autowired
+ private IConfiguration basicConfig;
+ @Autowired
+ protected ITransactionStorage transactionStorage;
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
+ throws TaskExecutionException {
+ try {
+ log.trace("Starting GenerateMobilePhoneSignatureRequestTask");
+ final String entityId = loadEntityId();
+ final EntityDescriptor entityDesc = loadEntityDescriptor(entityId);
+ final IdAustriaClientAuthRequestBuilderConfiguration authnReqConfig = buildAuthnRequestConfig(entityDesc);
+ final String relayState = buildRelayState();
+ authnReqBuilder.buildAuthnRequest(pendingReq, authnReqConfig, relayState, response); // also transmits!
+ } catch (final Exception e) {
+ throw new TaskExecutionException(pendingReq, "Generation of SAML2 AuthnRequest to ID Austria System FAILED", e);
+ }
+ }
+
+ @NotNull
+ private String loadEntityId() throws EaafConfigurationException {
+ final String msNodeEntityID = basicConfig.getBasicConfiguration(
+ IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID);
+ if (StringUtils.isEmpty(msNodeEntityID)) {
+ log.warn("ID Austria authentication not possible -> NO EntityID for ID Austria System FOUND!");
+ throw new EaafConfigurationException(Constants.ERRORCODE_00,
+ new Object[]{IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID});
+ }
+ return msNodeEntityID;
+ }
+
+ /**
+ * Build relayState for session synchronization, because SAML2 only allows RelayState with 80 characters
+ * but encrypted PendingRequestId is much longer.
+ */
+ @NotNull
+ private String buildRelayState() throws EaafException {
+ String relayState = Random.nextProcessReferenceValue();
+ transactionStorage.put(relayState, pendingReq.getPendingRequestId(), -1);
+ return relayState;
+ }
+
+ @NotNull
+ private EntityDescriptor loadEntityDescriptor(String msNodeEntityID)
+ throws ResolverException, EaafConfigurationException {
+ final EntityDescriptor entityDesc = metadataService.getEntityDescriptor(msNodeEntityID);
+ if (entityDesc == null) {
+ throw new EaafConfigurationException(IdAustriaClientAuthConstants.ERRORCODE_02,
+ new Object[]{MessageFormat.format(ERROR_MSG_1, msNodeEntityID)});
+
+ }
+ return entityDesc;
+ }
+
+ @NotNull
+ private IdAustriaClientAuthRequestBuilderConfiguration buildAuthnRequestConfig(EntityDescriptor entityDesc)
+ throws CredentialsNotAvailableException {
+ final IdAustriaClientAuthRequestBuilderConfiguration authnReqConfig =
+ new IdAustriaClientAuthRequestBuilderConfiguration();
+ final SecureRandomIdentifierGenerationStrategy gen = new SecureRandomIdentifierGenerationStrategy();
+ authnReqConfig.setRequestId(gen.generateIdentifier());
+ authnReqConfig.setIdpEntity(entityDesc);
+ authnReqConfig.setPassive(false);
+ authnReqConfig.setSignCred(credential.getMessageSigningCredential());
+ authnReqConfig.setSpEntityID(
+ pendingReq.getAuthUrlWithOutSlash() + IdAustriaClientAuthConstants.ENDPOINT_METADATA);
+ return authnReqConfig;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java
new file mode 100644
index 00000000..a90c5929
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/GenerateOtherLoginMethodGuiTask.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.core.gui.StaticGuiBuilderConfiguration;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.gui.ISpringMvcGuiFormBuilder;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.gui.AbstractGuiFormBuilderConfiguration;
+import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Task that provides GUI for user to select an alternative login method.
+ * This page is shown when the matching of the eIDAS data to ZMR/ERnP data is ambiguous.
+ * This corresponds to Steps 10, 14, 16 in the eIDAS Matching Concept.
+ * The response is handled in {@link ReceiveOtherLoginMethodGuiResponseTask}
+ *
+ * @author amarsalek
+ * @author ckollmann
+ */
+@Slf4j
+@Component("GenerateOtherLoginMethodGuiTask")
+public class GenerateOtherLoginMethodGuiTask extends AbstractLocaleAuthServletTask {
+
+ @Autowired
+ private ISpringMvcGuiFormBuilder guiBuilder;
+
+ @Autowired
+ private IConfiguration basicConfig;
+
+ @Override
+ public void executeWithLocale(ExecutionContext executionContext,
+ HttpServletRequest request, HttpServletResponse response) throws TaskExecutionException {
+ try {
+ final StaticGuiBuilderConfiguration config = new StaticGuiBuilderConfiguration(
+ basicConfig,
+ pendingReq,
+ basicConfig.getBasicConfiguration(
+ MsEidasNodeConstants.PROP_CONFIG_WEBCONTENT_TEMPLATES_OTHER_LOGIN_METHOD_SELECTION,
+ MsEidasNodeConstants.TEMPLATE_HTML_OTHERLOGINMETHODS),
+ MsEidasNodeConstants.ENDPOINT_OTHER_LOGIN_METHOD_SELECTION,
+ resourceLoader);
+
+ // inject flag to indicate advanced matching error
+ if (MatchingTaskUtils.getExecutionContextFlag(
+ executionContext, Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED)) {
+ config.putCustomParameter(AbstractGuiFormBuilderConfiguration.PARAM_GROUP_UIOPTIONS,
+ Constants.HTML_FORM_ADVANCED_MATCHING_FAILED, String.valueOf(true));
+
+ //set detailed error-code
+ if (executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON) != null) {
+ config.putCustomParameter(AbstractGuiFormBuilderConfiguration.PARAM_GROUP_UIOPTIONS,
+ Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON,
+ executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON).toString());
+ }
+ }
+
+ // inject request to create a new ERnP entry
+ config.putCustomParameter(AbstractGuiFormBuilderConfiguration.PARAM_GROUP_UIOPTIONS,
+ Constants.HTML_FORM_CREATE_NEW_ERNP_ENTRY,
+ String.valueOf(
+ MatchingTaskUtils.getExecutionContextFlag(
+ executionContext,Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK)));
+
+ // reset executionContext parameters
+ ReceiveOtherLoginMethodGuiResponseTask.ALL_EXECUTIONCONTEXT_PARAMETERS.forEach(
+ el -> executionContext.remove(el));
+
+ // store pending request before next step
+ requestStoreage.storePendingRequest(pendingReq);
+
+ guiBuilder.build(request, response, config, "Other login methods selection form");
+
+ } catch (final Exception e) {
+ log.error("Initial search FAILED.", e);
+ throw new TaskExecutionException(pendingReq, "Gui creation FAILED.", e);
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java
new file mode 100644
index 00000000..3a775837
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/InitialSearchTask.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import eu.eidas.auth.commons.light.ILightResponse;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Searches registers (ERnP and ZMR) after initial user auth, before adding person to SZR.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_FULL_EIDAS_RESPONSE}</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} converted from Full eIDAS Response</li>
+ * <li>{@link Constants#DATA_INTERMEDIATE_RESULT} results from first search in registers with
+ * PersonIdentifier</li>
+ * <li>{@link Constants#DATA_PERSON_MATCH_RESULT} results after second search in registers with MDS</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link CreateNewErnpEntryTask} if no results in registers where found for this user</li>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if search with MDS returns more than one match, user may provide
+ * alternative login methods to get an unique match</li>
+ * <li>{@link CreateIdentityLinkTask} if search in register returned one match, user is uniquely identified</li>
+ * </ul>
+ *
+ * @author amarsalek
+ * @author ckollmann
+ * @author tlenz
+ */
+@Slf4j
+@Component("InitialSearchTask")
+@SuppressWarnings("PMD.TooManyStaticImports")
+public class InitialSearchTask extends AbstractAuthServletTask {
+
+ private final RegisterSearchService registerSearchService;
+ private final ICcSpecificEidProcessingService eidPostProcessor;
+
+ /**
+ * Constructor.
+ *
+ * @param registerSearchService Service for register search access
+ * @param eidPostProcessor Country-Specific post processing of attributes
+ */
+ public InitialSearchTask(RegisterSearchService registerSearchService,
+ ICcSpecificEidProcessingService eidPostProcessor) {
+ this.registerSearchService = registerSearchService;
+ this.eidPostProcessor = eidPostProcessor;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
+ throws TaskExecutionException {
+ try {
+ final SimpleEidasData eidasData = convertEidasAttrToSimpleData();
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, eidasData);
+ step2RegisterSearchWithPersonIdentifier(executionContext, eidasData);
+ } catch (WorkflowException e) {
+ throw new TaskExecutionException(pendingReq, "Initial search failed", e);
+ } catch (final Exception e) {
+ log.error("Initial search failed", e);
+ throw new TaskExecutionException(pendingReq, "Initial search failed with a generic error", e);
+ }
+ }
+
+ private void step2RegisterSearchWithPersonIdentifier(
+ ExecutionContext executionContext, SimpleEidasData eidasData) throws WorkflowException, EaafStorageException {
+ try {
+ log.trace("Starting step2RegisterSearchWithPersonIdentifier");
+ RegisterStatusResults searchResult = registerSearchService.searchWithPersonIdentifier(eidasData);
+ int resultCount = searchResult.getResultCount();
+ if (resultCount == 0) {
+ step6CountrySpecificSearch(executionContext, searchResult.getOperationStatus(), eidasData);
+
+ } else if (resultCount == 1) {
+ RegisterResult updatedResult = step3CheckRegisterUpdateNecessary(searchResult, eidasData);
+ foundMatchFinalizeTask(updatedResult, eidasData);
+
+ } else {
+ throw new WorkflowException("step2RegisterSearchWithPersonIdentifier",
+ "More than one entry with unique personal-identifier", true);
+
+ }
+ } catch (WorkflowException e) {
+ //TODO: what we do in case of a workflow error and manual matching are necessary??
+ log.warn("Workflow error during matching step: {}. Reason: {}", e.getProcessStepName(), e.getErrorReason());
+ throw e;
+ }
+ }
+
+ private void step6CountrySpecificSearch(
+ ExecutionContext executionContext, RegisterOperationStatus registerOperationStatus, SimpleEidasData eidasData)
+ throws EaafStorageException, WorkflowException {
+ log.trace("Starting 'step6CountrySpecificSearch' ... ");
+ RegisterStatusResults searchResult = registerSearchService.searchWithCountrySpecifics(
+ registerOperationStatus, eidasData);
+ if (searchResult.getResultCount() == 0) {
+ log.trace("'step6CountrySpecificSearch' ends with no result. Forward to next matching step ... ");
+ step8RegisterSearchWithMds(executionContext, searchResult.getOperationStatus(), eidasData);
+
+ } else if (searchResult.getResultCount() == 1) {
+ log.trace("'step6CountrySpecificSearch' finds a person. Forward to 'step7aKittProcess' step ... ");
+ RegisterStatusResults updatedResult = registerSearchService.step7aKittProcess(searchResult, eidasData);
+ foundMatchFinalizeTask(updatedResult.getResult(), eidasData);
+
+ } else {
+ throw new WorkflowException("step6CountrySpecificSearch",
+ "More than one entry with unique country-specific information", true);
+ }
+ }
+
+ private void step8RegisterSearchWithMds(ExecutionContext executionContext,
+ RegisterOperationStatus registerOperationStatus, SimpleEidasData eidasData)
+ throws EaafStorageException, WorkflowException {
+ log.trace("Starting step8RegisterSearchWithMds");
+ RegisterStatusResults registerData = registerSearchService.searchWithMds(registerOperationStatus, eidasData);
+ if (registerData.getResultCount() == 0) {
+ log.debug("Matching step: 'step8RegisterSearchWithMds' has no result. Forward to create new ERnP entry ... ");
+ executionContext.put(TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK, true);
+
+ } else {
+ log.debug("Matching step: 'step8RegisterSearchWithMds' has #{} results. "
+ + "Forward to GUI based matching steps ... ", registerData.getResultCount());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerData);
+ executionContext.put(TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+
+ }
+ }
+
+ private RegisterResult step3CheckRegisterUpdateNecessary(
+ RegisterStatusResults searchResult, SimpleEidasData eidasData) throws WorkflowException {
+ log.trace("Starting step3CheckRegisterUpdateNecessary");
+ if (!eidasData.equalsRegisterData(searchResult.getResult())) {
+ log.debug("PersonalIdentifier match but MDS or other information changed. Starting update process ... ");
+ return registerSearchService.step7aKittProcess(searchResult, eidasData).getResult();
+
+ } else {
+ log.debug("Register information match to eIDAS information. No update required");
+ return searchResult.getResult();
+ }
+ }
+
+ private void foundMatchFinalizeTask(RegisterResult updatedResult, SimpleEidasData eidasData)
+ throws WorkflowException, EaafStorageException {
+ MatchedPersonResult result =
+ MatchedPersonResult.generateFormMatchingResult(updatedResult, eidasData.getCitizenCountryCode());
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, result);
+
+ }
+
+ @NotNull
+ private SimpleEidasData convertEidasAttrToSimpleData()
+ throws EidasAttributeException, EidPostProcessingException {
+ final ILightResponse eidasResponse = MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq)
+ .getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE, ILightResponse.class);
+ Map<String, Object> simpleMap = MatchingTaskUtils.convertEidasAttrToSimpleMap(
+ eidasResponse.getAttributes().getAttributeMap(), log);
+ return eidPostProcessor.postProcess(simpleMap);
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java
new file mode 100644
index 00000000..f335bc2a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAustrianResidenceGuiResponseTask.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK;
+
+import java.util.Enumeration;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Sets;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput.AdresssucheOutputBuilder;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ManualFixNecessaryException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
+import lombok.extern.slf4j.Slf4j;
+
+
+/**
+ * Task receives the response of {@link GenerateAustrianResidenceGuiTask} and handles it.
+ * This corresponds to Steps 17B, 18, 19 in the eIDAS Matching Concept.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li>
+ * <li>{@link Constants#DATA_INTERMEDIATE_RESULT} results from search in registers with personIdentifier</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_PERSON_MATCH_RESULT} if one register result found</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if no results from search with residency data in registers</li>
+ * <li>{@link CreateIdentityLinkTask} if one exact match between initial register search (with MDS) and results
+ * from search with residency data in registers exists</li>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if a user input error has happened</li>
+ * </ul>
+ *
+ * @author amarsalek
+ * @author ckollmann
+ * @author tlenz
+ */
+@Slf4j
+@Component("ReceiveAustrianResidenceGuiResponseTask")
+public class ReceiveAustrianResidenceGuiResponseTask extends AbstractLocaleAuthServletTask {
+
+ private static final String MSG_PROP_21 = "module.eidasauth.matching.21";
+ private static final String MSG_PROP_22 = "module.eidasauth.matching.22";
+
+ public static final String HTTP_PARAM_NO_RESIDENCE = "noResidence";
+ public static final Set<String> ALL_EXECUTIONCONTEXT_PARAMETERS = Sets.newHashSet(
+ CONTEXT_FLAG_ADVANCED_MATCHING_FAILED,
+ CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON,
+ TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK,
+ TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK);
+
+ private final RegisterSearchService registerSearchService;
+
+
+ public ReceiveAustrianResidenceGuiResponseTask(RegisterSearchService registerSearchService) {
+ this.registerSearchService = registerSearchService;
+
+ }
+
+ @Override
+ protected void executeWithLocale(ExecutionContext executionContext, HttpServletRequest request,
+ HttpServletResponse response) throws TaskExecutionException {
+ log.trace("Starting ReceiveAustrianResidenceGuiResponseTask");
+
+ try {
+ //return to AuswahlScreen if HTTP_PARAM_NO_RESIDENCE was selected
+ final boolean forwardWithOutMandate = parseFlagFromHttpRequest(request, HTTP_PARAM_NO_RESIDENCE, false);
+ if (forwardWithOutMandate) {
+ log.debug("User selects 'no residence' button. Switch back to 'insert-into-ERnP' selection ... ");
+ executionContext.put(TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK, true);
+ executionContext.put(TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK, false);
+ return;
+
+ } else {
+ executionContext.put(TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK, false);
+
+ }
+
+ //load search parameters from HTML form
+ AdresssucheOutput input = parseHtmlInput(request);
+ if (validateHtmlInput(input)) {
+ // HTML form should ensure that mandatory fields are set => this should never happen
+ log.warn("HTML form contains no residence information. Switch back to 'input residence inputs' ... ");
+ executionContext.put(TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK, true);
+
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, MSG_PROP_21);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ return;
+
+ }
+
+ // get pre-processed information
+ SimpleEidasData eidasData = MatchingTaskUtils.getInitialEidasData(pendingReq);
+ RegisterStatusResults initialSearchResult = MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+
+ // search in register
+ RegisterStatusResults residencyResult =
+ registerSearchService.searchWithResidence(initialSearchResult.getOperationStatus(), eidasData, input);
+
+ // validate matching response from registers
+ if (residencyResult.getResultCount() != 1) {
+ log.info("Find {} match by using residence information. Forward user to 'input residence infos' ... ",
+ residencyResult.getResultCount() == 0 ? "no" : "more-than-one");
+ executionContext.put(TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK, true);
+
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, MSG_PROP_22);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+
+ } else {
+ log.debug("Find single match by using residence information. Starting data validation ... ");
+ compareSearchResultWithInitialData(residencyResult, eidasData);
+
+ }
+
+ } catch (WorkflowException e) {
+ throw new TaskExecutionException(pendingReq, "Search with residency data failed", e);
+
+ } catch (EaafStorageException e) {
+ log.error("Search with residency data failed", e);
+ throw new TaskExecutionException(pendingReq, "Search with residency data failed", e);
+
+ }
+ }
+
+ private boolean validateHtmlInput(AdresssucheOutput input) {
+ return StringUtils.isEmpty(input.getMunicipality())
+ && StringUtils.isEmpty(input.getNumber())
+ && StringUtils.isEmpty(input.getPostleitzahl())
+ && StringUtils.isEmpty(input.getStreet())
+ && StringUtils.isEmpty(input.getVillage());
+ }
+
+ private void compareSearchResultWithInitialData(RegisterStatusResults residencyResult, SimpleEidasData eidasData)
+ throws TaskExecutionException, EaafStorageException {
+ try {
+ if (!eidasData.equalsRegisterData(residencyResult.getResult())) {
+ // update register information
+ RegisterStatusResults updateResult = registerSearchService.step7aKittProcess(residencyResult, eidasData);
+
+ // store updated result to re-used in CreateIdentityLink step, because there we need bPK and MDS
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq,
+ MatchedPersonResult.generateFormMatchingResult(
+ updateResult.getResult(), eidasData.getCitizenCountryCode()));
+
+ } else {
+ log.warn("Suspect state FOUND. Matching by residence was neccessary but NO register-update are required!");
+ // no update required. Data can be used as it is.
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq,
+ MatchedPersonResult.generateFormMatchingResult(
+ residencyResult.getResult(), eidasData.getCitizenCountryCode()));
+
+ }
+
+ } catch (WorkflowException e) {
+ log.warn("Kitt operation after successful residence matching FAILED.", e);
+ throw new TaskExecutionException(pendingReq, "Search failed", new ManualFixNecessaryException(eidasData));
+
+ }
+ }
+
+ private @NotNull AdresssucheOutput parseHtmlInput(HttpServletRequest request) {
+ Enumeration<String> reqParamNames = request.getParameterNames();
+ AdresssucheOutputBuilder resultBuilder = AdresssucheOutput.builder();
+ while (reqParamNames.hasMoreElements()) {
+ final String paramName = reqParamNames.nextElement();
+ String escaped = StringEscapeUtils.escapeHtml(request.getParameter(paramName));
+ if (AdresssucheController.PARAM_MUNIPICALITY.equalsIgnoreCase(paramName)) {
+ resultBuilder.municipality(escaped);
+
+ } else if (AdresssucheController.PARAM_NUMBER.equalsIgnoreCase(paramName)) {
+ resultBuilder.number(escaped);
+
+ } else if (AdresssucheController.PARAM_POSTLEITZAHL.equalsIgnoreCase(paramName)) {
+ resultBuilder.postleitzahl(escaped);
+
+ } else if (AdresssucheController.PARAM_STREET.equalsIgnoreCase(paramName)) {
+ resultBuilder.street(escaped);
+
+ } else if (AdresssucheController.PARAM_VILLAGE.equalsIgnoreCase(paramName)) {
+ resultBuilder.village(escaped);
+
+ }
+ }
+
+ return resultBuilder.build();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseAlternativeTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseAlternativeTask.java
new file mode 100644
index 00000000..d2bd0128
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseAlternativeTask.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright 2018 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasValidationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.validator.EidasResponseValidator;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.EidAuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import eu.eidas.auth.commons.EidasParameterKeys;
+import eu.eidas.auth.commons.light.ILightResponse;
+import eu.eidas.auth.commons.light.impl.LightResponse;
+import eu.eidas.auth.commons.tx.BinaryLightToken;
+import eu.eidas.specificcommunication.BinaryLightTokenHelper;
+import eu.eidas.specificcommunication.SpecificCommunicationDefinitionBeanNames;
+import eu.eidas.specificcommunication.exception.SpecificCommunicationException;
+import eu.eidas.specificcommunication.protocol.SpecificCommunicationService;
+import lombok.extern.slf4j.Slf4j;
+
+
+/**
+ * Receives the authn response from the eIDAS Node, containing the (alternative) eIDAS authentication.
+ * Input:
+ * <ul>
+ * <li>none</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE} the full response details</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link InitialSearchTask} to perform search in registers</li>
+ * </ul>
+ *
+ * @author tlenz
+ * @author ckollmann
+ */
+@Slf4j
+@Component("ReceiveAuthnResponseTask")
+public class ReceiveAuthnResponseAlternativeTask extends AbstractAuthServletTask {
+
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+
+ @Autowired
+ ApplicationContext context;
+
+ @Autowired
+ private IConfiguration basicConfig;
+
+ @Autowired
+ private EidasAttributeRegistry attrRegistry;
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request,
+ HttpServletResponse response) throws TaskExecutionException {
+ try {
+ final ILightResponse eidasResponse = extractEidasResponse(request);
+
+ String stagingEndpoint = pendingReq.getRawData(
+ MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, String.class);
+ if (StringUtils.isNotEmpty(stagingEndpoint)) {
+ log.info("Find ms-connector staging to: {}. Forwarding to that endpoint ... ", stagingEndpoint);
+ forwardToOtherStage(response, executionContext, eidasResponse, stagingEndpoint);
+
+ } else {
+ checkStatusCode(eidasResponse);
+ validateMsSpecificResponse(executionContext, eidasResponse);
+ storeInSession(eidasResponse);
+
+ }
+
+ } catch (final EidasSAuthenticationException e) {
+ log.warn("eIDAS Response processing FAILED.", e);
+ throw new TaskExecutionException(pendingReq, e.getMessage(), e);
+
+ } catch (final Exception e) {
+ log.warn("eIDAS Response processing FAILED.", e);
+ throw new TaskExecutionException(pendingReq, e.getMessage(),
+ new EidasSAuthenticationException("eidas.05", new Object[]{e.getMessage()}, e));
+ }
+ }
+
+ @NotNull
+ private ILightResponse extractEidasResponse(HttpServletRequest request) throws EidasSAuthenticationException {
+ final ILightResponse eidasResponse = (ILightResponse) request.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE);
+ if (eidasResponse == null) {
+ log.warn("NO eIDAS response-message found.");
+ throw new EidasSAuthenticationException("eidas.01", null);
+ }
+ log.debug("Receive eIDAS response with RespId: {} for ReqId: {}",
+ eidasResponse.getId(), eidasResponse.getInResponseToId());
+ log.trace("Full eIDAS-Resp: {}", eidasResponse);
+ return eidasResponse;
+ }
+
+ private void checkStatusCode(ILightResponse eidasResponse) throws EidasSAuthenticationException {
+ if (!eidasResponse.getStatus().getStatusCode().equals(Constants.SUCCESS_URI)) {
+ log.info("Receive eIDAS Response with StatusCode: {} Subcode: {} Msg: {}",
+ eidasResponse.getStatus().getStatusCode(),
+ eidasResponse.getStatus().getSubStatusCode(),
+ eidasResponse.getStatus().getStatusMessage());
+ throw new EidasSAuthenticationException("eidas.02", new Object[]{eidasResponse.getStatus()
+ .getStatusCode(), eidasResponse.getStatus().getStatusMessage()});
+ }
+ }
+
+ private void validateMsSpecificResponse(ExecutionContext executionContext, ILightResponse eidasResponse)
+ throws EidasValidationException {
+ final String spCountry = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_COUNTRYCODE, "AT");
+ final String citizenCountryCode = (String) executionContext.get(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
+ EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
+ }
+
+ private void storeInSession(ILightResponse eidasResponse) throws EaafException {
+ log.debug("Store eIDAS response information into pending-request.");
+ final EidAuthProcessDataWrapper authProcessData = pendingReq.getSessionData(EidAuthProcessDataWrapper.class);
+ authProcessData.setQaaLevel(eidasResponse.getLevelOfAssurance());
+ authProcessData.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE, eidasResponse);
+
+ //inject set flag to inject
+ authProcessData.setTestIdentity(
+ basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_IS_TEST_IDENTITY, false));
+
+ requestStoreage.storePendingRequest(pendingReq);
+
+ }
+
+ private void forwardToOtherStage(HttpServletResponse response, ExecutionContext executionContext,
+ ILightResponse eidasResponse, String stagingEndpoint)
+ throws SpecificCommunicationException, IOException, EaafException {
+ executionContext.put(MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, true);
+
+ //remove staging information because it's still in use
+ pendingReq.setRawDataToTransaction(MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, null);
+
+ final SpecificCommunicationService specificConnectorCommunicationService =
+ (SpecificCommunicationService) context.getBean(
+ SpecificCommunicationDefinitionBeanNames.SPECIFIC_CONNECTOR_COMMUNICATION_SERVICE.toString());
+ BinaryLightToken token = specificConnectorCommunicationService.putResponse(
+ LightResponse.builder(eidasResponse).relayState(pendingReq.getPendingRequestId()).build());
+ final String tokenBase64 = BinaryLightTokenHelper.encodeBinaryLightTokenBase64(token);
+
+ final UriComponentsBuilder redirectUrl = UriComponentsBuilder.fromHttpUrl(stagingEndpoint);
+ redirectUrl.queryParam(EidasParameterKeys.TOKEN.toString(), tokenBase64);
+
+ // store pendingRequest
+ requestStoreage.storePendingRequest(pendingReq);
+
+ log.debug("Forward to other stage .... ");
+ response.sendRedirect(redirectUrl.build().encode().toString());
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java
index 35cb6015..5e4075de 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveAuthnResponseTask.java
@@ -19,7 +19,7 @@
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
-*/
+ */
package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
@@ -29,6 +29,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@@ -38,6 +39,7 @@ import at.asitplus.eidas.specific.core.MsConnectorEventCodes;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasValidationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.validator.EidasResponseValidator;
import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
@@ -56,30 +58,45 @@ import eu.eidas.specificcommunication.exception.SpecificCommunicationException;
import eu.eidas.specificcommunication.protocol.SpecificCommunicationService;
import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Receives the authn response from the eIDAS Node, containing the (initial) eIDAS authentication.
+ * Input:
+ * <ul>
+ * <li>none</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_FULL_EIDAS_RESPONSE} the full response details</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link InitialSearchTask} to perform search in registers</li>
+ * </ul>
+ *
+ * @author tlenz
+ * @author ckollmann
+ */
@Slf4j
-@Component("ReceiveResponseFromeIDASNodeTask")
+@Component("ReceiveAuthnResponseTask")
public class ReceiveAuthnResponseTask extends AbstractAuthServletTask {
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+
@Autowired
ApplicationContext context;
@Autowired
private IConfiguration basicConfig;
+
@Autowired
private EidasAttributeRegistry attrRegistry;
@Override
public void execute(ExecutionContext executionContext, HttpServletRequest request,
- HttpServletResponse response) throws TaskExecutionException {
+ HttpServletResponse response) throws TaskExecutionException {
try {
- final ILightResponse eidasResponse = (ILightResponse) request.getAttribute(
- Constants.DATA_FULL_EIDAS_RESPONSE);
- if (eidasResponse == null) {
- log.warn("NO eIDAS response-message found.");
- throw new EidasSAuthenticationException("eidas.01", null);
-
- }
-
+ final ILightResponse eidasResponse = extractEidasResponse(request);
String stagingEndpoint = pendingReq.getRawData(
MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, String.class);
if (StringUtils.isNotEmpty(stagingEndpoint)) {
@@ -88,20 +105,20 @@ public class ReceiveAuthnResponseTask extends AbstractAuthServletTask {
} else {
executionContext.put(MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, false);
- processResponseOnThatStage(executionContext, eidasResponse);
-
+ checkStatusCode(eidasResponse);
+ validateMsSpecificResponse(executionContext, eidasResponse);
+ storeInSession(eidasResponse);
}
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE_VALID);
} catch (final EaafException e) {
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE_NOT_VALID);
throw new TaskExecutionException(pendingReq, "eIDAS Response processing FAILED.", e);
-
} catch (final Exception e) {
log.warn("eIDAS Response processing FAILED.", e);
revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE_NOT_VALID);
throw new TaskExecutionException(pendingReq, e.getMessage(),
- new EidasSAuthenticationException("eidas.05", new Object[] { e.getMessage() }, e));
-
+ new EidasSAuthenticationException("eidas.05", new Object[]{e.getMessage()}, e));
}
}
@@ -130,56 +147,51 @@ public class ReceiveAuthnResponseTask extends AbstractAuthServletTask {
response.sendRedirect(redirectUrl.build().encode().toString());
}
+
+ @NotNull
+ private ILightResponse extractEidasResponse(HttpServletRequest request) throws EidasSAuthenticationException {
+ final ILightResponse eidasResponse = (ILightResponse) request.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE);
+ if (eidasResponse == null) {
+ log.warn("NO eIDAS response-message found.");
+ throw new EidasSAuthenticationException("eidas.01", null);
+ }
+ log.debug("Receive eIDAS response with RespId: {} for ReqId: {}",
+ eidasResponse.getId(), eidasResponse.getInResponseToId());
+ log.trace("Full eIDAS-Resp: {}", eidasResponse);
+ revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE, eidasResponse.getId());
+ return eidasResponse;
+ }
- private void processResponseOnThatStage(ExecutionContext executionContext, ILightResponse eidasResponse)
- throws EaafException {
- log.debug("Receive eIDAS response with RespId:" + eidasResponse.getId() + " for ReqId:" + eidasResponse
- .getInResponseToId());
- log.trace("Full eIDAS-Resp: " + eidasResponse.toString());
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE, eidasResponse
- .getId());
-
- // check response StatusCode
+ private void checkStatusCode(ILightResponse eidasResponse) throws EidasSAuthenticationException {
if (!eidasResponse.getStatus().getStatusCode().equals(Constants.SUCCESS_URI)) {
- log.info("Receice eIDAS Response with StatusCode:" + eidasResponse.getStatus().getStatusCode()
- + " Subcode:" + eidasResponse.getStatus().getSubStatusCode() + " Msg:" + eidasResponse.getStatus()
- .getStatusMessage());
- throw new EidasSAuthenticationException("eidas.02", new Object[] { eidasResponse.getStatus()
- .getStatusCode(), eidasResponse.getStatus().getStatusMessage() });
-
+ log.info("Receive eIDAS Response with StatusCode: {} Subcode: {} Msg: {}",
+ eidasResponse.getStatus().getStatusCode(),
+ eidasResponse.getStatus().getSubStatusCode(),
+ eidasResponse.getStatus().getStatusMessage());
+ throw new EidasSAuthenticationException("eidas.02", new Object[]{eidasResponse.getStatus()
+ .getStatusCode(), eidasResponse.getStatus().getStatusMessage()});
}
+ }
- // extract all Attributes from response
-
- // **********************************************************
- // ******* MS-specificresponse validation **********
- // **********************************************************
- final String spCountry = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_COUNTRYCODE,
- "AT");
- final String citizenCountryCode = (String) executionContext.get(
- MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
- EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode,
- attrRegistry);
-
- // **********************************************************
- // ******* Store resonse infos into session object **********
- // **********************************************************
+ private void validateMsSpecificResponse(ExecutionContext executionContext, ILightResponse eidasResponse)
+ throws EidasValidationException {
+ final String spCountry = basicConfig.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_NODE_COUNTRYCODE, "AT");
+ final String citizenCountryCode = (String) executionContext.get(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY);
+ EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
+ }
- // update MOA-Session data with received information
+ private void storeInSession(ILightResponse eidasResponse) throws EaafException {
log.debug("Store eIDAS response information into pending-request.");
final EidAuthProcessDataWrapper authProcessData = pendingReq.getSessionData(EidAuthProcessDataWrapper.class);
authProcessData.setQaaLevel(eidasResponse.getLevelOfAssurance());
- authProcessData.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
-
//inject set flag to inject
authProcessData.setTestIdentity(
basicConfig.getBasicConfigurationBoolean(Constants.CONIG_PROPS_EIDAS_IS_TEST_IDENTITY, false));
-
- // store MOA-session to database
- requestStoreage.storePendingRequest(pendingReq);
- revisionsLogger.logEvent(pendingReq, MsConnectorEventCodes.RESPONSE_FROM_EIDAS_NODE_VALID);
+
+ authProcessData.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
+ requestStoreage.storePendingRequest(pendingReq);
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java
new file mode 100644
index 00000000..b212d133
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveMobilePhoneSignatureResponseTask.java
@@ -0,0 +1,403 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK;
+import static at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants.MODULE_NAME_FOR_LOGGING;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.messaging.decoder.MessageDecodingException;
+import org.opensaml.saml.saml2.core.Response;
+import org.opensaml.saml.saml2.core.StatusCode;
+import org.opensaml.saml.saml2.metadata.IDPSSODescriptor;
+import org.springframework.stereotype.Component;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleMobileSignatureData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthEventConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.data.PvpAttributeDefinitions;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafBuilderException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+import at.gv.egiz.eaaf.core.impl.idp.auth.modules.AbstractAuthServletTask;
+import at.gv.egiz.eaaf.modules.pvp2.api.binding.IDecoder;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SamlAssertionValidationExeption;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SamlSigningException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.binding.PostBinding;
+import at.gv.egiz.eaaf.modules.pvp2.impl.binding.RedirectBinding;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.InboundMessage;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileResponse;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.EaafUriCompare;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.TrustEngineFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.verification.SamlVerificationEngine;
+import at.gv.egiz.eaaf.modules.pvp2.sp.exception.AssertionValidationExeption;
+import at.gv.egiz.eaaf.modules.pvp2.sp.exception.AuthnResponseValidationException;
+import at.gv.egiz.eaaf.modules.pvp2.sp.impl.utils.AssertionAttributeExtractor;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Task that receives the SAML2 response from ID Austria system.
+ * This corresponds to Step 15 in the eIDAS Matching Concept.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li>
+ * <li>{@link Constants#DATA_INTERMEDIATE_RESULT} results from search in registers with personIdentifier</li>
+ * </ul>
+ * Output:
+ * <ul>
+ * <li>{@link Constants#DATA_PERSON_MATCH_RESULT} if one register result found</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link GenerateAustrianResidenceGuiTask} if no results in registers were found</li>
+ * <li>{@link CreateIdentityLinkTask} if one exact match between initial register search (with MDS) data and
+ * register search with MPS data exists</li>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if a user input error has happened</li>
+ * </ul>
+ *
+ * @author tlenz
+ * @author ckollmann
+ */
+@Slf4j
+@Component("ReceiveMobilePhoneSignatureResponseTask")
+public class ReceiveMobilePhoneSignatureResponseTask extends AbstractAuthServletTask {
+
+ private final SamlVerificationEngine samlVerificationEngine;
+ private final RegisterSearchService registerSearchService;
+ private final IdAustriaClientAuthCredentialProvider credentialProvider;
+ private final IdAustriaClientAuthMetadataProvider metadataProvider;
+
+ private static final String ERROR_PVP_03 = "sp.pvp2.03";
+ private static final String ERROR_PVP_05 = "sp.pvp2.05";
+ private static final String ERROR_PVP_06 = "sp.pvp2.06";
+ private static final String ERROR_PVP_08 = "sp.pvp2.08";
+ private static final String ERROR_PVP_10 = "sp.pvp2.10";
+ private static final String ERROR_PVP_11 = "sp.pvp2.11";
+ private static final String ERROR_PVP_12 = "sp.pvp2.12";
+
+ private static final String ERROR_MSG_00 = "Receive INVALID PVP Response from ID Austria system";
+ private static final String ERROR_MSG_01 = "Processing PVP response from 'ID Austria system' FAILED.";
+ private static final String ERROR_MSG_02 = "PVP response decryption FAILED. No credential found.";
+ private static final String ERROR_MSG_03 = "PVP response validation FAILED.";
+ private static final String ERROR_GENERIC = "Matching failed, because response from ID Austria was "
+ + "invalid or contains an error. Detail: {}";
+
+ private static final String MSG_PROP_23 = "module.eidasauth.matching.23";
+ private static final String MSG_PROP_24 = "module.eidasauth.matching.24";
+
+ /**
+ * Creates the new task, with autowired dependencies from Spring.
+ */
+ @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
+ public ReceiveMobilePhoneSignatureResponseTask(SamlVerificationEngine samlVerificationEngine,
+ RegisterSearchService registerSearchService,
+ IdAustriaClientAuthCredentialProvider credentialProvider,
+ IdAustriaClientAuthMetadataProvider metadataProvider) {
+ this.samlVerificationEngine = samlVerificationEngine;
+ this.registerSearchService = registerSearchService;
+ this.credentialProvider = credentialProvider;
+ this.metadataProvider = metadataProvider;
+ }
+
+ @Override
+ public void execute(ExecutionContext executionContext, HttpServletRequest request, HttpServletResponse response)
+ throws TaskExecutionException {
+ try {
+ log.trace("Starting ReceiveMobilePhoneSignatureResponseTask");
+ IDecoder decoder = loadDecoder(request);
+ EaafUriCompare comparator = loadComparator(request);
+ InboundMessage inboundMessage = decodeAndVerifyMessage(request, response, decoder, comparator);
+ Pair<PvpSProfileResponse, Boolean> processedMsg = validateAssertion((PvpSProfileResponse) inboundMessage);
+ if (processedMsg.getSecond()) {
+ log.info("Matching failed, because ID Austria login was stopped by user.");
+ // forward to next matching step in case of ID Autria authentication was stopped by user
+ executionContext.put(TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, MSG_PROP_23);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ return;
+
+ }
+
+ // validate SAML2 response
+ validateEntityId(inboundMessage);
+ log.info("Receive a valid assertion from IDP " + inboundMessage.getEntityID());
+
+ // load already existing information from session
+ SimpleEidasData eidasData = MatchingTaskUtils.getInitialEidasData(pendingReq);
+ RegisterStatusResults initialSearchResult = MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+
+ // extract user information from ID Austria authentication
+ AssertionAttributeExtractor extractor = new AssertionAttributeExtractor(processedMsg.getFirst().getResponse());
+ SimpleMobileSignatureData simpleMobileSignatureData = getAuthDataFromInterfederation(extractor);
+
+ // check if MDS from ID Austria authentication matchs to eIDAS authentication
+ if (!simpleMobileSignatureData.equalsSimpleEidasData(eidasData)) {
+ log.info("Matching failed, because MDS from ID-Austria login does not match to MDS from initial eIDAS");
+ executionContext.put(TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, MSG_PROP_24);
+ executionContext.put(CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ return;
+
+ }
+
+ // search entry in initial search result from steps before and build new RegisterSearchResult
+ RegisterStatusResults registerResult = new RegisterStatusResults(initialSearchResult.getOperationStatus(),
+ extractEntriesByBpk(initialSearchResult.getResultsZmr().stream(), simpleMobileSignatureData.getBpk()),
+ extractEntriesByBpk(initialSearchResult.getResultsErnp().stream(), simpleMobileSignatureData.getBpk()));
+
+ if (registerResult.getResultCount() != 1) {
+ throw new WorkflowException("matchWithIDAustriaAuthentication",
+ "Suspect state detected. MDS matches to eIDAS authentication "
+ + "but register search-result with MDS contains #" + registerResult.getResultCount()
+ + " entry with bPK from ID Austria authentication", false);
+
+ } else {
+ // perform kit operation
+ registerSearchService.step7aKittProcess(registerResult, eidasData);
+
+ // store search result to re-used in CreateIdentityLink step, because there we need bPK and MDS
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq,
+ MatchedPersonResult.generateFormMatchingResult(registerResult.getResult(),
+ eidasData.getCitizenCountryCode()));
+
+ }
+
+ } catch (final AuthnResponseValidationException e) {
+ log.info(ERROR_GENERIC, e.getMessage());
+ throw new TaskExecutionException(pendingReq, ERROR_MSG_03, e);
+
+ } catch (MessageDecodingException | SecurityException | SamlSigningException e) {
+ log.info(ERROR_GENERIC, e.getMessage());
+ throw new TaskExecutionException(pendingReq, ERROR_MSG_00,
+ new AuthnResponseValidationException(ERROR_PVP_11, new Object[]{MODULE_NAME_FOR_LOGGING}, e));
+
+ } catch (IOException | MarshallingException | TransformerException e) {
+ log.info("Processing PVP response from 'ms-specific eIDAS node' FAILED.", e);
+ throw new TaskExecutionException(pendingReq, ERROR_MSG_01,
+ new AuthnResponseValidationException(ERROR_PVP_12, new Object[]{MODULE_NAME_FOR_LOGGING, e.getMessage()}, e));
+
+ } catch (final CredentialsNotAvailableException e) {
+ log.info("PVP response decryption FAILED. No credential found.", e);
+ throw new TaskExecutionException(pendingReq, ERROR_MSG_02,
+ new AuthnResponseValidationException(ERROR_PVP_10, new Object[]{MODULE_NAME_FOR_LOGGING}, e));
+
+ } catch (final Exception e) {
+ // todo catch ManualFixNecessaryException in any other way?
+ log.info("PVP response validation FAILED. Msg: {}",e.getMessage(), e);
+ throw new TaskExecutionException(pendingReq, ERROR_MSG_03,
+ new AuthnResponseValidationException(ERROR_PVP_12, new Object[]{MODULE_NAME_FOR_LOGGING, e.getMessage()}, e));
+
+ }
+ }
+
+ private List<RegisterResult> extractEntriesByBpk(Stream<RegisterResult> stream, String bpk) {
+ return stream.filter(el -> bpk.equals(el.getBpk())).collect(Collectors.toList());
+
+ }
+
+ @NotNull
+ private InboundMessage decodeAndVerifyMessage(HttpServletRequest request, HttpServletResponse response,
+ IDecoder decoder, EaafUriCompare comparator) throws Exception {
+ InboundMessage inboundMessage = (InboundMessage) decoder.decode(request, response, metadataProvider,
+ IDPSSODescriptor.DEFAULT_ELEMENT_NAME, comparator);
+ if (!inboundMessage.isVerified()) {
+ samlVerificationEngine.verify(inboundMessage, TrustEngineFactory.getSignatureKnownKeysTrustEngine(
+ metadataProvider));
+ inboundMessage.setVerified(true);
+ }
+ return inboundMessage;
+ }
+
+ private void validateEntityId(InboundMessage inboundMessage) throws AuthnResponseValidationException {
+ final String msNodeEntityID = authConfig
+ .getBasicConfiguration(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID);
+ final String respEntityId = inboundMessage.getEntityID();
+ if (!msNodeEntityID.equals(respEntityId)) {
+ log.warn("Response Issuer is not from valid 'ID Austria IDP'. Stopping ID Austria authentication ...");
+ throw new AuthnResponseValidationException(ERROR_PVP_08,
+ new Object[]{MODULE_NAME_FOR_LOGGING,
+ inboundMessage.getEntityID()});
+ }
+ }
+
+ @NotNull
+ private EaafUriCompare loadComparator(HttpServletRequest request) throws AuthnResponseValidationException {
+ if (request.getMethod().equalsIgnoreCase("POST")) {
+ log.trace("Receive PVP Response from 'ID Austria system', by using POST-Binding.");
+ return new EaafUriCompare(pendingReq.getAuthUrl() + IdAustriaClientAuthConstants.ENDPOINT_POST);
+ } else if (request.getMethod().equalsIgnoreCase("GET")) {
+ log.trace("Receive PVP Response from 'ID Austria system', by using Redirect-Binding.");
+ return new EaafUriCompare(pendingReq.getAuthUrl() + IdAustriaClientAuthConstants.ENDPOINT_REDIRECT);
+ } else {
+ log.warn("Receive PVP Response from 'ID Austria system', but Binding {} is not supported.", request.getMethod());
+ throw new AuthnResponseValidationException(ERROR_PVP_03, new Object[]{MODULE_NAME_FOR_LOGGING});
+ }
+ }
+
+ @NotNull
+ private IDecoder loadDecoder(HttpServletRequest request) throws AuthnResponseValidationException {
+ if (request.getMethod().equalsIgnoreCase("POST")) {
+ log.trace("Receive PVP Response from 'ID Austria system', by using POST-Binding.");
+ return new PostBinding();
+ } else if (request.getMethod().equalsIgnoreCase("GET")) {
+ log.trace("Receive PVP Response from 'ID Austria system', by using Redirect-Binding.");
+ return new RedirectBinding();
+ } else {
+ log.warn("Receive PVP Response from 'ID Austria system', but Binding {} is not supported.", request.getMethod());
+ throw new AuthnResponseValidationException(ERROR_PVP_03, new Object[]{MODULE_NAME_FOR_LOGGING});
+ }
+ }
+
+ private Pair<PvpSProfileResponse, Boolean> validateAssertion(PvpSProfileResponse msg)
+ throws IOException, MarshallingException, TransformerException,
+ CredentialsNotAvailableException, AuthnResponseValidationException, SamlAssertionValidationExeption {
+ log.debug("Start PVP21 assertion processing... ");
+ final Response response = (Response) msg.getResponse();
+ if (response.getStatus().getStatusCode().getValue().equals(StatusCode.SUCCESS)) {
+ samlVerificationEngine.validateAssertion(response,
+ credentialProvider.getMessageEncryptionCredential(),
+ pendingReq.getAuthUrl() + IdAustriaClientAuthConstants.ENDPOINT_METADATA,
+ MODULE_NAME_FOR_LOGGING);
+ msg.setSamlMessage(Saml2Utils.asDomDocument(response).getDocumentElement());
+ revisionsLogger.logEvent(pendingReq,
+ IdAustriaClientAuthEventConstants.AUTHPROCESS_ID_AUSTRIA_RESPONSE_RECEIVED,
+ response.getID());
+ return Pair.newInstance(msg, false);
+
+ } else {
+ log.info("Receive StatusCode {} from 'ms-specific eIDAS node'.", response.getStatus().getStatusCode().getValue());
+ StatusCode subStatusCode = getSubStatusCode(response);
+ if (subStatusCode != null
+ && IdAustriaClientAuthConstants.SAML2_STATUSCODE_USERSTOP.equals(subStatusCode.getValue())) {
+ log.info("Find 'User-Stop operation' in SAML2 response. Stopping authentication process ... ");
+ return Pair.newInstance(msg, true);
+
+ }
+
+ revisionsLogger.logEvent(pendingReq,
+ IdAustriaClientAuthEventConstants.AUTHPROCESS_ID_AUSTRIA_RESPONSE_RECEIVED_ERROR);
+ throw new AuthnResponseValidationException(ERROR_PVP_05,
+ new Object[]{MODULE_NAME_FOR_LOGGING,
+ response.getIssuer().getValue(),
+ response.getStatus().getStatusCode().getValue(),
+ response.getStatus().getStatusMessage().getValue()});
+ }
+ }
+
+ /**
+ * Get SAML2 Sub-StatusCode if not <code>null</code>.
+ *
+ * @param samlResp SAML2 response
+ * @return Sub-StatusCode or <code>null</code> if it's not set
+ */
+ private StatusCode getSubStatusCode(Response samlResp) {
+ if (samlResp.getStatus().getStatusCode().getStatusCode() != null
+ && StringUtils.isNotEmpty(samlResp.getStatus().getStatusCode().getStatusCode().getValue())) {
+ return samlResp.getStatus().getStatusCode().getStatusCode();
+ }
+ return null;
+ }
+
+ private SimpleMobileSignatureData getAuthDataFromInterfederation(AssertionAttributeExtractor extractor)
+ throws EaafBuilderException {
+ List<String> requiredAttributes = IdAustriaClientAuthConstants.DEFAULT_REQUIRED_PVP_ATTRIBUTE_NAMES;
+ SimpleMobileSignatureData.SimpleMobileSignatureDataBuilder builder = SimpleMobileSignatureData.builder();
+ if (!extractor.containsAllRequiredAttributes(requiredAttributes)) {
+ log.warn("PVP Response from 'ID Austria node' contains not all requested attributes.");
+ AssertionValidationExeption e = new AssertionValidationExeption(ERROR_PVP_06,
+ new Object[]{MODULE_NAME_FOR_LOGGING});
+ throw new EaafBuilderException(ERROR_PVP_06, null, e.getMessage(), e);
+ }
+ final Set<String> includedAttrNames = extractor.getAllIncludeAttributeNames();
+ for (final String attrName : includedAttrNames) {
+ if (PvpAttributeDefinitions.BPK_NAME.equals(attrName)) {
+ builder.bpk(removeTargetPrefixFromBpk(extractor.getSingleAttributeValue(attrName)));
+ }
+ if (PvpAttributeDefinitions.GIVEN_NAME_NAME.equals(attrName)) {
+ builder.givenName(extractor.getSingleAttributeValue(attrName));
+ }
+ if (PvpAttributeDefinitions.PRINCIPAL_NAME_NAME.equals(attrName)) {
+ builder.familyName(extractor.getSingleAttributeValue(attrName));
+ }
+ if (PvpAttributeDefinitions.BIRTHDATE_NAME.equals(attrName)) {
+ builder.dateOfBirth(extractor.getSingleAttributeValue(attrName));
+ }
+ if (PvpAttributeDefinitions.EID_CITIZEN_EIDAS_QAA_LEVEL_NAME.equals(attrName)) {
+ MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq).setQaaLevel(
+ extractor.getSingleAttributeValue(attrName));
+ }
+ }
+ MatchingTaskUtils.getAuthProcessDataWrapper(pendingReq).setIssueInstant(extractor.getAssertionIssuingDate());
+ return builder.build();
+
+ }
+
+ private String removeTargetPrefixFromBpk(String bpkWithPrefix) {
+ if (StringUtils.isNotEmpty(bpkWithPrefix)) {
+ final String[] spitted = bpkWithPrefix.split(":");
+ if (spitted.length == 2) {
+ log.debug("Find PVP-Attr: {}", PvpAttributeDefinitions.BPK_FRIENDLY_NAME);
+ return spitted[1];
+
+ } else {
+ log.info("Find PVP-Attr: {} without prefix. Use it as it is", PvpAttributeDefinitions.BPK_FRIENDLY_NAME);
+ return spitted[0];
+
+ }
+ } else {
+ log.warn("Receive no bPK in response from ID Austria System. There is something wrong on IDA side!!!");
+ return null;
+
+ }
+ }
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java
new file mode 100644
index 00000000..184ad499
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/tasks/ReceiveOtherLoginMethodGuiResponseTask.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2021 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks;
+
+import java.util.Enumeration;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.springframework.stereotype.Component;
+
+import com.google.common.collect.Sets;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SelectedLoginMethod;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.impl.idp.controller.tasks.AbstractLocaleAuthServletTask;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Handles user's selection from {@link GenerateOtherLoginMethodGuiTask}.
+ * This corresponds to Steps 10, 14, 16 in the eIDAS Matching Concept.
+ * Input:
+ * <ul>
+ * <li>{@link Constants#DATA_SIMPLE_EIDAS} initial login data from user</li>
+ * <li>{@link Constants#DATA_INTERMEDIATE_RESULT} results from search in registers with personIdentifier</li>
+ * </ul>
+ * Transitions:
+ * <ul>
+ * <li>{@link GenerateMobilePhoneSignatureRequestTask} if selected by user</li>
+ * <li>{@link GenerateAustrianResidenceGuiTask} if selected by user</li>
+ * <li>{@link GenerateAuthnRequestTask} if selected by user</li>
+ * <li>{@link GenerateOtherLoginMethodGuiTask} if a user input error has happened</li>
+ * </ul>
+ *
+ * @author amarsalek
+ * @author ckollmann
+ */
+@Slf4j
+@Component("ReceiveOtherLoginMethodGuiResponseTask")
+public class ReceiveOtherLoginMethodGuiResponseTask extends AbstractLocaleAuthServletTask {
+
+ public static final Set<String> ALL_EXECUTIONCONTEXT_PARAMETERS = Sets.newHashSet(
+ Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER,
+ Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK,
+ Constants.TRANSITION_TO_GENERATE_EIDAS_LOGIN,
+ Constants.TRANSITION_TO_GENERATE_MOBILE_PHONE_SIGNATURE_REQUEST_TASK,
+ Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK,
+ Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+
+ @Override
+ public void executeWithLocale(ExecutionContext executionContext, HttpServletRequest request,
+ HttpServletResponse response) {
+ try {
+ SelectedLoginMethod selection = SelectedLoginMethod.valueOf(extractUserSelection(request));
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, false);
+ executionContext.put(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER, selection.name());
+ executionContext.remove(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED);
+ executionContext.remove(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON);
+ transitionToNextTask(executionContext, selection);
+
+ } catch (final Exception e) {
+ log.error("Parsing selected login method FAILED.", e);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+ }
+ }
+
+ private String extractUserSelection(HttpServletRequest request) {
+ Enumeration<String> paramNames = request.getParameterNames();
+ while (paramNames.hasMoreElements()) {
+ String paramName = paramNames.nextElement();
+ if (Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER.equalsIgnoreCase(paramName)) {
+ return StringEscapeUtils.escapeHtml(request.getParameter(paramName));
+ }
+ }
+ return null;
+ }
+
+ private void transitionToNextTask(ExecutionContext executionContext, SelectedLoginMethod selection) {
+ switch (selection) {
+ case EIDAS_LOGIN:
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_EIDAS_LOGIN, true);
+ return;
+
+ case MOBILE_PHONE_SIGNATURE_LOGIN:
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_MOBILE_PHONE_SIGNATURE_REQUEST_TASK, true);
+ return;
+
+ case NO_OTHER_LOGIN:
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK, true);
+ return;
+
+ case ADD_ME_AS_NEW:
+ executionContext.put(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK, true);
+ return;
+
+ default:
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK, true);
+ return;
+ }
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java
index ced6ffe6..2853d8ab 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/EidasResponseUtils.java
@@ -19,10 +19,12 @@
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
-*/
+ */
package at.asitplus.eidas.specific.modules.auth.eidas.v2.utils;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
@@ -37,6 +39,8 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.gv.e_government.reference.namespace.persondata._20020228.PostalAddressType;
import at.gv.egiz.eaaf.core.impl.data.Triple;
import eu.eidas.auth.commons.attribute.AttributeDefinition;
import eu.eidas.auth.commons.attribute.AttributeValue;
@@ -44,6 +48,7 @@ import eu.eidas.auth.commons.attribute.AttributeValueMarshaller;
import eu.eidas.auth.commons.attribute.AttributeValueMarshallingException;
import eu.eidas.auth.commons.attribute.AttributeValueTransliterator;
import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
+import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -53,7 +58,7 @@ public class EidasResponseUtils {
/**
* Validate a eIDAS PersonalIdentifier attribute value This validation is done
* according to eIDAS SAML Attribute Profile - Section 2.2.3 Unique Identifier
- *
+ *
* @param uniqueID eIDAS attribute value of a unique identifier
* @return true if the uniqueID matches to eIDAS to Unique Identifier
* specification, otherwise false
@@ -69,9 +74,9 @@ public class EidasResponseUtils {
* Parse an eIDAS PersonalIdentifier attribute value into it components. This
* processing is done according to eIDAS SAML Attribute Profile - Section 2.2.3
* Unique Identifier
- *
+ *
* @param uniqueID eIDAS attribute value of a unique identifier
- * @return {@link Trible} that contains: <br>
+ * @return {@link Triple} that contains: <br>
* First : citizen country <br>
* Second: destination country <br>
* Third : unique identifier <br>
@@ -79,25 +84,26 @@ public class EidasResponseUtils {
*/
public static Triple<String, String, String> parseEidasPersonalIdentifier(String uniqueID) {
if (!validateEidasPersonalIdentifier(uniqueID)) {
- log.error("eIDAS attribute value for {} looks wrong formated. Value: {}",
+ log.error("eIDAS attribute value for {} looks wrong formated. Value: {}",
Constants.eIDAS_ATTR_PERSONALIDENTIFIER, uniqueID);
return null;
}
return Triple.newInstance(uniqueID.substring(0, 2), uniqueID.substring(3, 5), uniqueID.substring(6));
-
}
/**
- * Get eIDAS attribute-values from eIDAS Node attributes.
- *
+ * Get eIDAS attribute-values from eIDAS Node attributes.
+ *
* @param attributeDefinition eIDAS attribute definition
- * @param attributeValues Attributes from eIDAS response
- * @return Set of attribute values. If more then one value than the first value contains the 'Latin' value.
+ * @param attributeValues Attributes from eIDAS response
+ * @return Set of attribute values. If more then one value than the first value
+ * contains the 'Latin' value.
*/
// TODO: check possible problem with nonLatinCharacters
+ @NonNull
public static List<String> translateStringListAttribute(AttributeDefinition<?> attributeDefinition,
- ImmutableSet<? extends AttributeValue<?>> attributeValues) {
+ @Nullable ImmutableSet<? extends AttributeValue<?>> attributeValues) {
final List<String> stringListAttribute = new ArrayList<>();
if (attributeValues != null && !attributeValues.isEmpty()) {
final AttributeValueMarshaller<?> attributeValueMarshaller = attributeDefinition
@@ -109,7 +115,7 @@ public class EidasResponseUtils {
log.trace("Find attr: {} with value: {} nonLatinFlag: {} needTransliteration: {}",
attributeDefinition.getFriendlyName(), attributeValue.toString(),
- attributeValue.isNonLatinScriptAlternateVersion(),
+ attributeValue.isNonLatinScriptAlternateVersion(),
AttributeValueTransliterator.needsTransliteration(valueString));
// if (attributeValue.isNonLatinScriptAlternateVersion()) {
@@ -120,12 +126,26 @@ public class EidasResponseUtils {
log.trace("Find 'needsTransliteration' flag. Setting this value at last list element ... ");
stringListAttribute.add(valueString);
- }
+ log.trace("Find attr: {} with value: {} nonLatinFlag: {} needTransliteration: {}",
+ attributeDefinition.getFriendlyName(), attributeValue.toString(),
+ attributeValue.isNonLatinScriptAlternateVersion(),
+ AttributeValueTransliterator.needsTransliteration(valueString));
+
+ // if (attributeValue.isNonLatinScriptAlternateVersion()) {
+ if (!AttributeValueTransliterator.needsTransliteration(valueString)) {
+ stringListAttribute.add(0, valueString);
+ } else {
+ log.trace("Find 'needsTransliteration' flag. Setting this value at last list element ... ");
+ stringListAttribute.add(valueString);
+
+ }
+ }
} catch (final AttributeValueMarshallingException e) {
throw new IllegalStateException(e);
}
+
}
log.trace("Extract values: {} for attr: {}",
StringUtils.join(stringListAttribute, ","), attributeDefinition.getFriendlyName());
@@ -140,16 +160,17 @@ public class EidasResponseUtils {
}
+
/**
- * Convert eIDAS DateTime attribute to Java Object.
- *
+ * Convert eIDAS DateTime attribute to Java Object.
+ *
* @param attributeDefinition eIDAS attribute definition.
- * @param attributeValues eIDAS attribute value
+ * @param attributeValues eIDAS attribute value
* @return
*/
@Nullable
public static DateTime translateDateAttribute(AttributeDefinition<?> attributeDefinition,
- ImmutableList<? extends AttributeValue<?>> attributeValues) {
+ ImmutableList<? extends AttributeValue<?>> attributeValues) {
if (attributeValues.size() != 0) {
final AttributeValue<?> firstAttributeValue = attributeValues.get(0);
return (DateTime) firstAttributeValue.getValue();
@@ -161,17 +182,216 @@ public class EidasResponseUtils {
/**
* Concert eIDAS Address attribute to Java object.
- *
+ *
* @param attributeDefinition eIDAS attribute definition
- * @param attributeValues eIDAS attribute value
+ * @param attributeValues eIDAS attribute value
* @return
*/
@Nullable
public static PostalAddress translateAddressAttribute(AttributeDefinition<?> attributeDefinition,
- ImmutableList<? extends AttributeValue<?>> attributeValues) {
+ ImmutableList<? extends AttributeValue<?>> attributeValues) {
final AttributeValue<?> firstAttributeValue = attributeValues.get(0);
return (PostalAddress) firstAttributeValue.getValue();
+ }
+
+ /**
+ * Post-Process the eIDAS CurrentAddress attribute.
+ *
+ * @param currentAddressObj eIDAS current address information
+ * @return current address or null if no attribute is available
+ * @throws EidasAttributeException if eIDAS attribute is of a wrong type
+ */
+ public static PostalAddressType processAddress(Object currentAddressObj) throws EidasAttributeException {
+ if (currentAddressObj != null) {
+ if (currentAddressObj instanceof PostalAddress) {
+ final PostalAddressType result = new PostalAddressType();
+ result.setPostalCode(((PostalAddress) currentAddressObj).getPostCode());
+ result.setMunicipality(((PostalAddress) currentAddressObj).getPostName());
+ // TODO: add more mappings
+ return result;
+ } else {
+ log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_CURRENTADDRESS + " is of WRONG type");
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTADDRESS);
+ }
+ } else {
+ log.debug("NO '" + Constants.eIDAS_ATTR_CURRENTADDRESS + "' attribute. Post-Processing skipped ... ");
+ }
+ return null;
+ }
+
+ /**
+ * Post-Process the eIDAS BirthName attribute.
+ *
+ * @param birthNameObj eIDAS birthname information
+ * @return birthName or null if no attribute is available
+ * @throws EidasAttributeException if eIDAS attribute is of a wrong type
+ */
+ public static String processBirthName(Object birthNameObj) throws EidasAttributeException {
+ if (birthNameObj != null) {
+ if (birthNameObj instanceof String) {
+ return (String) birthNameObj;
+ } else {
+ log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_BIRTHNAME + " is of WRONG type");
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_BIRTHNAME);
+ }
+ } else {
+ log.debug("NO '" + Constants.eIDAS_ATTR_BIRTHNAME + "' attribute. Post-Processing skipped ... ");
+ }
+ return null;
+ }
+ /**
+ * Post-Process the eIDAS PlaceOfBirth attribute.
+ *
+ * @param placeOfBirthObj eIDAS Place-of-Birth information
+ * @return place of Birth or null if no attribute is available
+ * @throws EidasAttributeException if eIDAS attribute is of a wrong type
+ */
+ public static String processPlaceOfBirth(Object placeOfBirthObj) throws EidasAttributeException {
+ if (placeOfBirthObj != null) {
+ if (placeOfBirthObj instanceof String) {
+ return (String) placeOfBirthObj;
+
+ } else {
+ log.warn("eIDAS attr: " + Constants.eIDAS_ATTR_PLACEOFBIRTH + " is of WRONG type");
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_PLACEOFBIRTH);
+
+ }
+
+ } else {
+ log.debug("NO '" + Constants.eIDAS_ATTR_PLACEOFBIRTH + "' attribute. Post-Processing skipped ... ");
+ }
+ return null;
+ }
+
+ /**
+ * Post-Process the eIDAS DateOfBirth attribute.
+ *
+ * @param dateOfBirthObj eIDAS date-of-birth attribute information
+ * @return formated user's date-of-birth
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static DateTime processDateOfBirth(Object dateOfBirthObj) throws EidasAttributeException {
+ if (!(dateOfBirthObj instanceof DateTime)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);
+ }
+ return (DateTime) dateOfBirthObj;
}
-}
+ /**
+ * Post-Process the eIDAS DateOfBirth attribute to a string.
+ *
+ * @param dateOfBirthObj eIDAS date-of-birth attribute information
+ * @return formated user's date-of-birth as string
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processDateOfBirthToString(Object dateOfBirthObj) throws EidasAttributeException {
+ if (dateOfBirthObj instanceof String) {
+ try {
+ new SimpleDateFormat("yyyy-MM-dd").parse((String) dateOfBirthObj);
+ return (String) dateOfBirthObj;
+ } catch (ParseException e) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);
+ }
+ }
+ if (!(dateOfBirthObj instanceof DateTime)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_DATEOFBIRTH);
+ }
+ return new SimpleDateFormat("yyyy-MM-dd").format(((DateTime) dateOfBirthObj).toDate());
+ }
+
+ /**
+ * Post-Process the eIDAS GivenName attribute.
+ *
+ * @param givenNameObj eIDAS givenName attribute information
+ * @return formated user's givenname
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processGivenName(Object givenNameObj) throws EidasAttributeException {
+ if (!(givenNameObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTGIVENNAME);
+ }
+ return (String) givenNameObj;
+ }
+
+ /**
+ * Post-Process the eIDAS FamilyName attribute.
+ *
+ * @param familyNameObj eIDAS familyName attribute information
+ * @return formated user's familyname
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processFamilyName(Object familyNameObj) throws EidasAttributeException {
+ if (!(familyNameObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_CURRENTFAMILYNAME);
+ }
+ return (String) familyNameObj;
+ }
+
+ /**
+ * Post-Process the eIDAS personal identifier attribute.
+ *
+ * @param personalIdentifierObj eIDAS personal identifier attribute-information
+ * @return formated user's full personal identifier
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processPersonalIdentifier(Object personalIdentifierObj) throws EidasAttributeException {
+ if (!(personalIdentifierObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
+ }
+ return (String) personalIdentifierObj;
+ }
+
+
+ /**
+ * Post-Process the eIDAS pseudonym to ERnB unique identifier.
+ *
+ * @param personalIdObj eIDAS PersonalIdentifierAttribute
+ * @return Unique personal identifier without country-code information
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processPseudonym(Object personalIdObj) throws EidasAttributeException {
+ if (!(personalIdObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
+ }
+ final Triple<String, String, String> eIdentifier =
+ EidasResponseUtils.parseEidasPersonalIdentifier((String) personalIdObj);
+ if (eIdentifier == null || eIdentifier.getThird() == null) {
+ throw new EidasAttributeException("Error processing eIdentifier");
+ }
+ return eIdentifier.getThird();
+ }
+
+ /**
+ * Post-Process the eIDAS pseudonym to citizen country code.
+ *
+ * @param personalIdObj eIDAS PersonalIdentifierAttribute
+ * @return Citizen Country Code
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processCountryCode(Object personalIdObj) throws EidasAttributeException {
+ if (!(personalIdObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_PERSONALIDENTIFIER);
+ }
+ final Triple<String, String, String> eIdentifier =
+ EidasResponseUtils.parseEidasPersonalIdentifier((String) personalIdObj);
+ if (eIdentifier == null || eIdentifier.getFirst() == null) {
+ throw new EidasAttributeException("Error processing eIdentifier");
+ }
+ return eIdentifier.getFirst();
+ }
+
+ /**
+ * Post-Process the eIDAS TaxReference attribute.
+ *
+ * @param taxReferenceObj eIDAS TaxReference attribute information
+ * @return formated user's TaxReference
+ * @throws EidasAttributeException if NO attribute is available
+ */
+ public static String processTaxReference(Object taxReferenceObj) throws EidasAttributeException {
+ if (!(taxReferenceObj instanceof String)) {
+ throw new EidasAttributeException(Constants.eIDAS_ATTR_TAXREFERENCE);
+ }
+ return (String) taxReferenceObj;
+ }
+} \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/LoggingHandler.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/LoggingHandler.java
index 70290cd3..10acf3ad 100644
--- a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/LoggingHandler.java
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/LoggingHandler.java
@@ -41,17 +41,23 @@ public class LoggingHandler implements SOAPHandler<SOAPMessageContext> {
@Override
public boolean handleMessage(SOAPMessageContext context) {
- final SOAPMessage msg = context.getMessage();
- final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ // only perform operations if logging is on trace level
+ if (log.isTraceEnabled()) {
+ final SOAPMessage msg = context.getMessage();
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ final boolean request = ((Boolean) context
+ .get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY)).booleanValue();
+ try {
+ msg.writeTo(bos);
+ log.trace("{} Web-Service with content: {}",
+ request ? "Requesting to" : "Response from", bos.toString("UTF-8"));
- try {
- msg.writeTo(bos);
- log.trace(bos.toString("UTF-8"));
- log.trace(new String(bos.toByteArray(), "UTF-8"));
-
- } catch (final Exception e) {
- log.trace(e.getMessage(), e);
+ } catch (final Exception e) {
+ log.trace(e.getMessage(), e);
+
+ }
}
+
return true;
}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/MatchingTaskUtils.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/MatchingTaskUtils.java
new file mode 100644
index 00000000..c8a1f190
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/MatchingTaskUtils.java
@@ -0,0 +1,192 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.utils;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.slf4j.Logger;
+import org.springframework.lang.NonNull;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.AttributeValue;
+import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
+
+public class MatchingTaskUtils {
+
+ /**
+ * Get eIDAS log-in information from session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @return eIDAS infos or <code>null</code> if not exist
+ */
+ @Nullable
+ public static SimpleEidasData getInitialEidasData(IRequest pendingReq) {
+ return getAuthProcessDataWrapper(pendingReq).getGenericDataFromSession(
+ Constants.DATA_SIMPLE_EIDAS, SimpleEidasData.class);
+
+ }
+
+ /**
+ * Set eIDAS log-in information to session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @param eidasData infos from eIDAS Proxy-Service
+ * @throws EaafStorageException In case of data can not be add into session
+ */
+ @Nullable
+ public static void storeInitialEidasData(IRequest pendingReq, SimpleEidasData eidasData)
+ throws EaafStorageException {
+ getAuthProcessDataWrapper(pendingReq).setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidasData);
+
+ }
+
+ /**
+ * Get intermediate matching result from session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @return Intermediate matching result or <code>null</code> if not exist
+ */
+ @Nullable
+ public static RegisterStatusResults getIntermediateMatchingResult(IRequest pendingReq) {
+ return getAuthProcessDataWrapper(pendingReq).getGenericDataFromSession(Constants.DATA_INTERMEDIATE_RESULT,
+ RegisterStatusResults.class);
+
+ }
+
+ /**
+ * Store intermediate matching result into session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @param registerData Intermediate matching result information
+ * @throws EaafStorageException In case of data can not be add into session
+ */
+ @Nullable
+ public static void storeIntermediateMatchingResult(IRequest pendingReq, RegisterStatusResults registerData)
+ throws EaafStorageException {
+ getAuthProcessDataWrapper(pendingReq).setGenericDataToSession(
+ Constants.DATA_INTERMEDIATE_RESULT, registerData);
+
+ }
+
+ /**
+ * Get intermediate matching result from session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @return Intermediate matching result or <code>null</code> if not exist
+ */
+ @Nullable
+ public static MatchedPersonResult getFinalMatchingResult(IRequest pendingReq) {
+ return getAuthProcessDataWrapper(pendingReq).getGenericDataFromSession(Constants.DATA_PERSON_MATCH_RESULT,
+ MatchedPersonResult.class);
+
+ }
+
+ /**
+ * Store intermediate matching result into session.
+ *
+ * @param pendingReq Current pendingRequest
+ * @param personInfos Person information after a successful match
+ * @throws EaafStorageException In case of data can not be add into session
+ */
+ @Nullable
+ public static void storeFinalMatchingResult(IRequest pendingReq, MatchedPersonResult personInfos)
+ throws EaafStorageException {
+ getAuthProcessDataWrapper(pendingReq).setGenericDataToSession(
+ Constants.DATA_PERSON_MATCH_RESULT, personInfos);
+
+ }
+
+ /**
+ * Get holder for authentication information for the current process.
+ *
+ * @param pendingReq Current pendingRequest
+ * @return {@link AuthProcessDataWrapper}
+ */
+ @NonNull
+ public static AuthProcessDataWrapper getAuthProcessDataWrapper(IRequest pendingReq) {
+ return pendingReq.getSessionData(AuthProcessDataWrapper.class);
+
+ }
+
+
+ /**
+ * Evaluate a flag on Execution context.
+ *
+ * @param executionContext Current execution context.
+ * @param key Parameter name
+ * @return <code>true</code> if the parameter exists and evaluates to <code>true</code>, otherwise <code>false</code>
+ */
+ public static boolean getExecutionContextFlag(ExecutionContext executionContext, String key) {
+ Serializable value = executionContext.get(key);
+ return value instanceof Boolean && (boolean)value
+ || value instanceof String && Boolean.parseBoolean((String) value);
+
+ }
+
+ /**
+ * Convert attributes from eIDAS Authn Response into a simple map, to be used from
+ * {@link ICcSpecificEidProcessingService#postProcess(Map)}.
+ */
+ public static Map<String, Object> convertEidasAttrToSimpleMap(
+ ImmutableMap<AttributeDefinition<?>, ImmutableSet<? extends AttributeValue<?>>> attributeMap, Logger log) {
+ final Map<String, Object> result = new HashMap<>();
+ for (final AttributeDefinition<?> el : attributeMap.keySet()) {
+ final Class<?> parameterizedType = el.getParameterizedType();
+ if (DateTime.class.equals(parameterizedType)) {
+ final DateTime attribute = EidasResponseUtils.translateDateAttribute(el, attributeMap.get(el).asList());
+ if (attribute != null) {
+ result.put(el.getFriendlyName(), attribute);
+ log.trace("Find attr '{}' with value: {}", el.getFriendlyName(), attribute);
+ } else {
+ log.info("Ignore empty 'DateTime' attribute: {}", el.getNameUri());
+ }
+ } else if (PostalAddress.class.equals(parameterizedType)) {
+ final PostalAddress addressAttribute = EidasResponseUtils
+ .translateAddressAttribute(el, attributeMap.get(el).asList());
+ if (addressAttribute != null) {
+ result.put(el.getFriendlyName(), addressAttribute);
+ log.trace("Find attr '{}' with value: {}", el.getFriendlyName(), addressAttribute);
+ } else {
+ log.info("Ignore empty 'PostalAddress' attribute: {}", el.getNameUri());
+ }
+ } else {
+ final List<String> natPersonIdObj = EidasResponseUtils.translateStringListAttribute(el, attributeMap.get(el));
+ if (natPersonIdObj.isEmpty() || StringUtils.isEmpty(natPersonIdObj.get(0))) {
+ log.info("Ignore empty 'String' attribute: {}", el.getNameUri());
+
+ } else {
+ result.put(el.getFriendlyName(), natPersonIdObj.get(0));
+ log.trace("Find attr '{}' with value: {}", el.getFriendlyName(), natPersonIdObj.get(0));
+
+ }
+ }
+ }
+
+ log.debug("Receive #{} attributes with names: {}", result.size(), result.keySet());
+ return result;
+
+ }
+
+ private MatchingTaskUtils() {
+ //hide constructor in case of class contains only static methods
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/VersionHolder.java b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/VersionHolder.java
new file mode 100644
index 00000000..dbe88d33
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/utils/VersionHolder.java
@@ -0,0 +1,40 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.utils;
+
+import java.util.Optional;
+
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ApplicationContext;
+
+/**
+ * SpringBoot based implementation of an application-version holder.
+ *
+ * @author tlenz
+ *
+ */
+public class VersionHolder {
+
+ private final String version;
+
+ /**
+ * Build up a holder that contains the current version of this application.
+ *
+ * @param context SprintBoot context
+ */
+ public VersionHolder(ApplicationContext context) {
+ version = context.getBeansWithAnnotation(SpringBootApplication.class).entrySet().stream()
+ .findFirst()
+ .flatMap(es -> Optional.ofNullable(es.getValue().getClass().getPackage().getImplementationVersion()))
+ .orElse("unknown");
+
+ }
+
+ /**
+ * Get version of this application.
+ *
+ * @return version
+ */
+ public String getVersion() {
+ return version;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml b/modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml
index 5b81c6b1..dfa8622c 100644
--- a/modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/eIDAS.Authentication.process.xml
@@ -3,24 +3,81 @@
xmlns:pd="http://reference.e-government.gv.at/namespace/moa/process/definition/v1">
- <pd:Task id="createAuthnRequest" class="ConnecteIDASNodeTask" />
- <pd:Task id="receiveAuthnResponse"
- class="ReceiveResponseFromeIDASNodeTask" async="true" />
- <pd:Task id="finalizeAuthentication"
- class="FinalizeAuthenticationTask" />
- <pd:Task id="generateIdentityLink"
- class="CreateIdentityLinkTask" />
+ <pd:Task id="generateAuthnRequest" class="GenerateAuthnRequestTask" />
+ <pd:Task id="receiveAuthnResponse" class="ReceiveAuthnResponseTask" async="true" />
+ <pd:Task id="finalizeAuthentication" class="FinalizeAuthenticationTask" />
+ <pd:Task id="generateIdentityLink" class="CreateIdentityLinkTask" />
+
+ <pd:Task id="initialRegisterSearch" class="InitialSearchTask" />
+
+ <pd:Task id="createNewErnpEntryTask" class="CreateNewErnpEntryTask" />
+ <pd:Task id="generateOtherLoginMethodGuiTask" class="GenerateOtherLoginMethodGuiTask" />
+ <pd:Task id="generateMobilePhoneSignatureRequestTask" class="GenerateMobilePhoneSignatureRequestTask" />
+ <pd:Task id="receiveOtherLoginMethodGuiResponseTask" class="ReceiveOtherLoginMethodGuiResponseTask" async="true" />
+ <pd:Task id="receiveMobilePhoneSignatureResponseTask" class="ReceiveMobilePhoneSignatureResponseTask" async="true"/>
+ <pd:Task id="generateAustrianResidenceGuiTask" class="GenerateAustrianResidenceGuiTask" />
+ <pd:Task id="receiveAustrianResidenceGuiResponseTask" class="ReceiveAustrianResidenceGuiResponseTask" async="true"/>
+ <pd:Task id="generateAlternativeEidasAuthnRequest" class="GenerateAuthnRequestTask" />
+ <pd:Task id="receiveAlternativeEidasAuthnRequest" class="ReceiveAuthnResponseAlternativeTask" async="true" />
+ <pd:Task id="alternativeRegisterSearch" class="AlternativeSearchTask" />
<pd:StartEvent id="start" />
-
- <pd:Transition from="start" to="createAuthnRequest" />
- <pd:Transition from="createAuthnRequest" to="receiveAuthnResponse" />
+
+ <pd:Transition from="start" to="generateAuthnRequest" />
+ <pd:Transition from="generateAuthnRequest" to="receiveAuthnResponse" />
+ <pd:Transition conditionExpression="ctx['msConnectorStaging']"
+ from="receiveAuthnResponse" to="receiveAuthnResponse" />
+ <pd:Transition from="receiveAuthnResponse" to="initialRegisterSearch" />
+
+ <pd:Transition conditionExpression="ctx['TASK_CreateNewErnpEntryTask']"
+ from="initialRegisterSearch" to="createNewErnpEntryTask" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateOtherLoginMethodGuiTask']"
+ from="initialRegisterSearch" to="generateOtherLoginMethodGuiTask"/>
+ <pd:Transition from="initialRegisterSearch" to="generateIdentityLink" />
+
+ <!-- alternative matching modes -->
+ <pd:Transition from="generateOtherLoginMethodGuiTask" to="receiveOtherLoginMethodGuiResponseTask" />
+ <pd:Transition conditionExpression="ctx['changeLanguage'] or ctx['TASK_GenerateOtherLoginMethodGuiTask']"
+ from="receiveOtherLoginMethodGuiResponseTask" to="generateOtherLoginMethodGuiTask" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateAlternativeEidasAuthn']"
+ from="receiveOtherLoginMethodGuiResponseTask" to="generateAlternativeEidasAuthnRequest" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateMobilePhoneSignatureRequestTask']"
+ from="receiveOtherLoginMethodGuiResponseTask" to="generateMobilePhoneSignatureRequestTask" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateAustrianResidenceGuiTask']"
+ from="receiveOtherLoginMethodGuiResponseTask" to="generateAustrianResidenceGuiTask" />
+ <pd:Transition conditionExpression="ctx['TASK_CreateNewErnpEntryTask']"
+ from="receiveOtherLoginMethodGuiResponseTask" to="createNewErnpEntryTask" />
+
+ <!-- alternative eIDAS authentication -->
+ <pd:Transition from="generateAlternativeEidasAuthnRequest" to="receiveAlternativeEidasAuthnRequest" />
<pd:Transition conditionExpression="ctx['msConnectorStaging']"
- from="receiveAuthnResponse" to="receiveAuthnResponse" />
- <pd:Transition from="receiveAuthnResponse" to="generateIdentityLink" />
- <pd:Transition from="generateIdentityLink" to="finalizeAuthentication" />
- <pd:Transition from="finalizeAuthentication" to="end" />
-
+ from="receiveAlternativeEidasAuthnRequest" to="receiveAlternativeEidasAuthnRequest" />
+ <pd:Transition from="receiveAlternativeEidasAuthnRequest" to="alternativeRegisterSearch" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateOtherLoginMethodGuiTask']"
+ from="alternativeRegisterSearch" to="generateOtherLoginMethodGuiTask" />
+ <pd:Transition from="alternativeRegisterSearch" to="generateIdentityLink" />
+
+
+ <!-- ID Austria authentication -->
+ <pd:Transition from="generateMobilePhoneSignatureRequestTask" to="receiveMobilePhoneSignatureResponseTask" />
+ <pd:Transition conditionExpression="ctx['TASK_GenerateOtherLoginMethodGuiTask']"
+ from="receiveMobilePhoneSignatureResponseTask" to="generateOtherLoginMethodGuiTask" />
+ <pd:Transition from="receiveMobilePhoneSignatureResponseTask" to="generateIdentityLink" />
+
+
+ <!-- address searching -->
+ <pd:Transition from="generateAustrianResidenceGuiTask" to="receiveAustrianResidenceGuiResponseTask" />
+ <pd:Transition conditionExpression="ctx['changeLanguage'] or ctx['TASK_GenerateAustrianResidenceGuiTask']"
+ from="receiveAustrianResidenceGuiResponseTask" to="generateAustrianResidenceGuiTask" />
+ <pd:Transition conditionExpression="ctx['TASK_RequestingNewErnpEntryTask']"
+ from="receiveAustrianResidenceGuiResponseTask" to="generateOtherLoginMethodGuiTask" />
+ <pd:Transition from="receiveAustrianResidenceGuiResponseTask" to="generateIdentityLink" />
+
+ <pd:Transition from="createNewErnpEntryTask" to="generateIdentityLink" />
+
+ <pd:Transition from="generateIdentityLink" to="finalizeAuthentication" />
+ <pd:Transition from="finalizeAuthentication" to="end" />
+
<pd:EndEvent id="end" />
</pd:ProcessDefinition>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml b/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml
index 3b0cee54..193513b0 100644
--- a/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth.beans.xml
@@ -11,33 +11,23 @@
<context:annotation-config />
- <import
- resource="classpath:specificCommunicationDefinitionApplicationContext.xml" />
+ <bean id="appVersionHolder"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.VersionHolder" />
- <bean id="SZRClientForeIDAS"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient" />
-
- <bean id="specificConnectorAttributesFile"
- class="java.lang.String">
- <constructor-arg value="eidas-attributes.xml" />
- </bean>
+ <bean id="eidasConnectorMessageSource"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.config.EidasConnectorMessageSource"/>
- <bean id="specificAdditionalAttributesFile"
- class="java.lang.String">
- <constructor-arg value="additional-attributes.xml" />
- </bean>
+ <bean id="SZRClientForeIDAS"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr.SzrClient" />
- <bean id="specificConnectorAttributesFileWithPath"
- class="java.lang.String">
- <constructor-arg
- value="#{specificConnectorConfigRepository}#{specificConnectorAttributesFile}" />
- </bean>
+ <bean id="zmrClient"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient" />
+
+ <bean id="zmrAddressClient"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrAddressSoapClient" />
- <bean id="specificConnectorAdditionalAttributesFileWithPath"
- class="java.lang.String">
- <constructor-arg
- value="#{specificConnectorConfigRepository}#{specificAdditionalAttributesFile}" />
- </bean>
+ <bean id="ernpClient"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient" />
<bean id="eIDASAuthModule"
class="at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasAuthenticationModulImpl">
@@ -55,7 +45,7 @@
ref="specificConnectorAdditionalAttributesFileWithPath" />
</bean>
- <!-- <bean id="eIDASDataStore" class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.eIDASDataStore"
+ <!-- <bean id="eIDASDataStore" class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.eIDASDataStore"
/> -->
<bean id="authBlockSigningService"
@@ -79,17 +69,89 @@
<property name="priority" value="0" />
</bean>
+ <bean id="deSpecificDetailSearchProcessor"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor">
+ </bean>
+
+ <bean id="itSpecificDetailSearchProcessor"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.ItSpecificDetailSearchProcessor">
+ </bean>
+
+ <bean id="registerSearchService"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService" />
+
+ <!-- ID Austria client specific services -->
+ <bean id="idAustriaClientAuthCredentialProvider"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider" />
+
+ <bean id="idAustriaClientAuthMetadataProvider"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider" />
+
+ <bean id="idAustriaClientMetadataHealthCheck"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthHealthCheck" />
+
+ <bean id="idAustriaClientAuthMetadataController"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller.IdAustriaClientAuthMetadataController" />
+
+ <bean id="idAustriaClientAuthSignalController"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller.IdAustriaClientAuthSignalController" />
+
+ <bean id="addressWizardController"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController" />
+
+
<!-- Authentication Process Tasks -->
- <bean id="ConnecteIDASNodeTask"
+ <bean id="GenerateAuthnRequestTask"
class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask"
scope="prototype" />
- <bean id="ReceiveResponseFromeIDASNodeTask"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask"
- scope="prototype" />
+ <bean id="ReceiveAuthnResponseTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask"
+ scope="prototype" />
+
+ <bean id="ReceiveAuthnResponseAlternativeTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseAlternativeTask"
+ scope="prototype" />
<bean id="CreateIdentityLinkTask"
class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask"
scope="prototype" />
+ <bean id="InitialSearchTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.InitialSearchTask"
+ scope="prototype" />
+
+ <bean id="AlternativeSearchTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.AlternativeSearchTask"
+ scope="prototype" />
+
+ <bean id="CreateNewErnpEntryTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateNewErnpEntryTask"
+ scope="prototype" />
+
+ <bean id="GenerateOtherLoginMethodGuiTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateOtherLoginMethodGuiTask"
+ scope="prototype" />
+
+ <bean id="GenerateMobilePhoneSignatureRequestTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateMobilePhoneSignatureRequestTask"
+ scope="prototype" />
+
+ <bean id="ReceiveOtherLoginMethodGuiResponseTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveOtherLoginMethodGuiResponseTask"
+ scope="prototype" />
+
+ <bean id="ReceiveMobilePhoneSignatureResponseTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveMobilePhoneSignatureResponseTask"
+ scope="prototype" />
+
+ <bean id="GenerateAustrianResidenceGuiTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAustrianResidenceGuiTask"
+ scope="prototype" />
+
+ <bean id="ReceiveAustrianResidenceGuiResponseTask"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAustrianResidenceGuiResponseTask"
+ scope="prototype" />
+
+
</beans> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth_ref_impl_config.beans.xml b/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth_ref_impl_config.beans.xml
new file mode 100644
index 00000000..cde9687e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/eidas_v2_auth_ref_impl_config.beans.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
+
+ <context:annotation-config />
+
+ <import
+ resource="classpath:specificCommunicationDefinitionApplicationContext.xml" />
+
+ <bean id="specificConnectorAttributesFile"
+ class="java.lang.String">
+ <constructor-arg value="eidas-attributes.xml" />
+ </bean>
+
+ <bean id="specificAdditionalAttributesFile"
+ class="java.lang.String">
+ <constructor-arg value="additional-attributes.xml" />
+ </bean>
+
+ <bean id="specificConnectorAttributesFileWithPath"
+ class="java.lang.String">
+ <constructor-arg
+ value="#{specificConnectorConfigRepository}#{specificConnectorAttributesFile}" />
+ </bean>
+
+ <bean id="specificConnectorAdditionalAttributesFileWithPath"
+ class="java.lang.String">
+ <constructor-arg
+ value="#{specificConnectorConfigRepository}#{specificAdditionalAttributesFile}" />
+ </bean>
+
+</beans> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/messages/eidas_connector_message.properties b/modules/authmodule-eIDAS-v2/src/main/resources/messages/eidas_connector_message.properties
new file mode 100644
index 00000000..bd05fef2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/messages/eidas_connector_message.properties
@@ -0,0 +1,33 @@
+module.eidasauth.00=Wrong configuration. Missing property: {0}
+
+module.eidasauth.idaustria.02=eIDAS module has an error in configuration. Reason: {0}
+module.eidasauth.idaustria.05=eIDAS module can not initialize SAML2 metadata provider for entityId: {0}. Reason: {1}
+
+
+module.eidasauth.01=eIDAS module has an error in configuration: {0}. Reason: {1}
+
+module.eidasauth.03=eIDAS module has a general error during request pre-processing. Reason: {0}
+module.eidasauth.04=eIDAS module has a general error during response post-processing.
+module.eidasauth.06=eIDAS module was selected, but eIDAS is NOT enabled for SP: {0}
+
+
+module.eidasauth.98=eIDAS module has an internal error. Reason: {0}
+module.eidasauth.99=eIDAS module has an generic internal error.
+
+module.eidasauth.matching.00=Matching failed, because find more than one ZMR entries with one eIDAS personal-identifier
+module.eidasauth.matching.01=Matching failed, because of an ZMR communication error. Reason: {0}
+module.eidasauth.matching.02=Matching failed, because ZMR response contains historic information which is not supported.
+module.eidasauth.matching.03=Matching failed in workflow step: {0} with error: {1}
+module.eidasauth.matching.04=An error occurred while loading your data from official registers. Please contact the support.
+
+module.eidasauth.matching.11=Matching failed, because of an ERnP communication error. Reason: {0}
+module.eidasauth.matching.12=Matching failed, because ERnP response contains historic information which is not supported.
+
+module.eidasauth.matching.21=Matching be using residence information failed by missing input information. Use another method for matching or create a new Austrian identity.
+module.eidasauth.matching.22=Can not find an unique match by using residence information. Provide more or other data, use another method for matching, or create a new Austrian identity.
+module.eidasauth.matching.23=Matching be using Austrian Identity was canceled. Use another method for matching or create a new Austrian identity.
+module.eidasauth.matching.24=Matching be using Austrian Identity not possible. Use another method for matching or create a new Austrian identity.
+module.eidasauth.matching.25=Matching be using alternative eIDAS authentication not possible. Provide more or other data, use another method for matching, or create a new Austrian identity.
+
+module.eidasauth.matching.99=Matching failed, because of an unexpected processing error. Reason: {0}
+
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/templates/eidas_node_forward.html b/modules/authmodule-eIDAS-v2/src/main/resources/templates/eidas_node_forward.html
index 186937d7..640c1f75 100644
--- a/modules/authmodule-eIDAS-v2/src/main/resources/templates/eidas_node_forward.html
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/templates/eidas_node_forward.html
@@ -4,7 +4,7 @@
layout:decorator="fragments/base"
th:with="lang=${#locale.language}" th:lang="${lang}">
<head>
- <script src="$contextPath/autocommit.js"
+ <script src="/autocommit.js"
th:attr="src=@{/autocommit.js}"></script>
</head>
<body>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkRequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkRequest.xml
new file mode 100644
index 00000000..fae66796
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkRequest.xml
@@ -0,0 +1,58 @@
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+ <soapenv:Header>
+ <ns9:Security xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <ns8:pvpToken version="1.8">
+ <ns8:authenticate>
+ <ns8:participantId>AT:B:xxx</ns8:participantId>
+ <ns8:userPrincipal>
+ <ns8:userId>userid</ns8:userId>
+ <ns8:cn>full name</ns8:cn>
+ <ns8:gvOuId>AT:B:xxx</ns8:gvOuId>
+ <ns8:ou>Organisation</ns8:ou>
+ <ns8:gvSecClass>3</ns8:gvSecClass>
+ <ns8:gvGid>AT:B:112:PID:71923</ns8:gvGid>
+ <ns8:mail>e@mail</ns8:mail>
+ </ns8:userPrincipal>
+ </ns8:authenticate>
+ <ns8:authorize>
+ <ns8:role value="ZMR-Anfrage"></ns8:role>
+ </ns8:authorize>
+ <ns8:accounting></ns8:accounting>
+ </ns8:pvpToken>
+ </ns9:Security>
+ </soapenv:Header>
+ <soapenv:Body>
+ <Request xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <WorkflowInfoClient>
+ <ProzessName>GP_Abfragen</ProzessName>
+ <ProzessInstanzID>786700000003030</ProzessInstanzID>
+ <SequenzID>0</SequenzID>
+ <VorgangName>ZMR_VO_Adresssuche_im_GWR__6</VorgangName>
+ </WorkflowInfoClient>
+ <ClientInfo>
+ <Organisation>
+ <GemeindeNr>09999</GemeindeNr>
+ </Organisation>
+ <Client>ZMR3-GUI 1.2.36.2-</Client>
+ </ClientInfo>
+ <ns4:AdresssucheRequest>
+ <ns4:AdresssucheInfo>
+ <ns4:Suchart>ADRESSSUCHE</ns4:Suchart>
+ </ns4:AdresssucheInfo>
+ <ns4:Adressdaten>
+ <ns2:PostAdresse>
+ <ns2:Gemeinde>Wien</ns2:Gemeinde>
+ <ns2:Gemeindekennziffer>90001</ns2:Gemeindekennziffer>
+ <ns2:Ortschaft>Wien,Favoriten</ns2:Ortschaft>
+ <ns2:Zustelladresse>
+ <ns2:AdressRegisterEintrag></ns2:AdressRegisterEintrag>
+ </ns2:Zustelladresse>
+ </ns2:PostAdresse>
+ <Adressschluessel>
+ <OKZ>17232</OKZ>
+ </Adressschluessel>
+ </ns4:Adressdaten>
+ </ns4:AdresssucheRequest>
+ </Request>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkResponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkResponse.xml
new file mode 100644
index 00000000..20151698
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkResponse.xml
@@ -0,0 +1,12422 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#">
+ <soapenv:Body>
+ <base:Response xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns11="http://egov.gv.at/pvp1.xsd" xmlns:ns12="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns8="http://www.w3.org/2000/09/xmldsig#" xmlns:ns9="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Mindestsicherung</base:ProzessName>
+ <base:ProzessAnzeigeName>Mindestsicherung</base:ProzessAnzeigeName>
+ <base:ProzessInstanzID>786700000003031</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 0.0</base:GeneriertVon>
+ <base:GeneriertAm>2021-05-27T10:58:13.555</base:GeneriertAm>
+ <base:ServerTransaktionNr>8581910000014155</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdresssucheResponse>
+ <zmr:AdresssucheAnfrage>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheAnfrage>
+ <base:Message>
+ <base:Number>30115</base:Number>
+ <base:Text>Adresssuche durchgefhrt, mehrere Treffer zur Auswahl.</base:Text>
+ </base:Message>
+ <zmr:Adresssuchergebnis>
+ <zmr:Detailgrad>Strassenname</zmr:Detailgrad>
+ <base:GefundeneSaetze>589</base:GefundeneSaetze>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Absbergbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910326</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Absberggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900007</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ada-Christen-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905509</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Adolf-Kirchl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900025</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Adolf-Unger-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905520</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ahornhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914201</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alaudagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905508</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alfred-Adler-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906627</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alfred-Stix-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900066</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alma-Ros-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905519</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alpengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900085</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Altdorferstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900092</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alte Laaer Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900094</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Alxingergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900106</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Am Belvedere</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912045</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Am Hauptbahnhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901314</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Am Johannesberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909120</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Am Laaer Berg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914005</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Amalienbad</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922002</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Amarantgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900110</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ampferergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900149</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>An der Hlle</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900175</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>An der Kuhtrift</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909729</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>An der Ostbahn</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900180</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Angeligasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900198</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Anna-Boschek-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914348</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Anningerweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909142</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Anny-Angel-Katan-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906981</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Anton-Balzer-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912511</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Anton-Hlzl-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914252</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Antonie-Alt-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906624</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Antonsplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900229</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Arnold-Holm-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905521</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Arsenalstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900260</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Arthaberplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900263</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Artholdgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906724</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Aspangbahn</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990713</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>August-Forel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900299</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>August-Kronberger-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900303</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>August-Motz-Rettungsstation</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918434</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>August-Sigl-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906124</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bahnhof Matzleinsdorfer Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990534</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bahnlnde</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900342</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Baron-Karl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906085</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Battiggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900371</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Beichlgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909318</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Belgradplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900403</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Benischkegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909155</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bergtaidingweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905510</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Berlepschgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900434</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bernadottegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900435</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bernhardtstalgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900439</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Berthold-Viertel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900444</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Biererlgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900468</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bildungscampus Sonnwendviertel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>921151</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Birkenhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914203</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Birnbaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900480</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bischofgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900486</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bischofplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900487</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bitterlichstraenbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910452</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bitterlichstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900488</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Blaschkagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909124</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bleichsteinerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900498</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bleigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900499</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bloch-Bauer-Promenade</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912685</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Braheplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900552</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brantinggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900561</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Braunspergengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900568</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brigitte-Neumeister-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906747</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brunngraberhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914020</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brunnweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900626</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brcke Ferdinand-Lwe-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910300</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Buchengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900630</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Bullgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900650</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Burgenlandgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900654</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Brgergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900641</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Canettistrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906628</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Carl-Appel-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906526</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Carl-Prohaska-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900678</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ceralegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900688</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Chiarigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900694</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Clemens-Holzmeister-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906529</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Collmanngasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909153</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Columbusgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900724</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Columbusplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900725</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Computerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905998</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Czeikestrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905930</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Dampfgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900769</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Daumegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909736</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Davidgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900786</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Dieselgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900826</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Doerenkampgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909159</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Domaniggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905947</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Donabaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900889</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Dr.-Eberle-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909145</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Dr.-Franz-Pauer-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914206</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Durchlass Volksparkteich</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910449</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eckertgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900963</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eckhelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909139</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Economogasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900966</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eddagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900967</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eibesbrunnergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901002</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eichenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901009</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eisenmengergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901025</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eisenstadtplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901026</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ellen-Key-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901040</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Emil-Fucik-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906513</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Emil-Fucik-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914309</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Emil-Hertzka-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901050</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Emil-Ottenthal-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901052</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Emilie-Flge-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912763</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Endlichergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901056</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Enge Lucken</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905538</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Erlachgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901086</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Erlachplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901087</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ernst-Kirchweger-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914282</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ernst-Ludwig-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901095</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eschenallee</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901100</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eschenkogelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901102</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ettenreichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901113</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eugenie-Fink-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905524</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Eva-Zilcher-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906721</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Evangelischer Friedhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>919048</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fatinitzaweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901145</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Favoritenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901147</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Favoritner Gewerbering</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909900</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Felix-Grafe-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905533</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ferdinand-Lwe-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901173</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fernkorngasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901177</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Feuchterslebengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901183</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Felergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901181</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Filmstadttreppenbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910444</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Filmteichstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901204</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fingergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901195</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fischhofgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909135</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Fliederhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905672</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fliederhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914204</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Florian-Geyer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901224</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fontanastrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905936</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-Jachym-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906268</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-Koci-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905535</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-Mika-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912560</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-Schreker-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901278</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-Schuh-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901281</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franz-von-Sales-Steg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910440</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Franzosenweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901272</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Friedhofstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901312</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Friedrich-Adler-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906120</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Friedrich-Knauer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901321</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Friedrich-Teller-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901327</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Friesenplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901330</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fritz-Hahn-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906719</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fritz-Pregl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901335</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Frdenplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901338</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Fugehersteg ber die A3</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910448</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Frstenhoferstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905933</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gaimayrgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901383</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Gartengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905709</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gartenschaugasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909156</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gartensteg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910381</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gasparoneweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901405</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Geifugasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901428</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gellertgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901432</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gellertplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901433</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Georg-Prentl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901448</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Georg-Wiesmayer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901451</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Georg-Wilhelm-Pabst-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905531</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>George-Washington-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914200</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gerhard-Bronner-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906629</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gertrude-Frhlich-Sandner-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906626</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gimniggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901496</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gombrichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906701</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Graffgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901570</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Grenzackerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901595</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Grohnergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906125</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Grundckergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901650</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gudrunstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901660</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gutheil-Schoder-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901690</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Guriegelstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901682</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gdelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912783</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gteborggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901535</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gtzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901538</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Gterzentrum Wien Sd</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>919100</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hackergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906699</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hantzenbergergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901798</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hardtmuthgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901802</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Harry-Glck-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906780</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hasengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901818</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hasenhrlstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901821</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hauptwegbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910443</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hausergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901844</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hebbelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901857</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hebbelplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901858</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hederichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901862</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Heimkehrergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901880</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Heinrich-Zeder-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912577</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Helmut-Zilk-Park</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>920314</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hentzigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901915</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hermann-Mark-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906683</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hermann-Schne-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901930</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hermine-Fiala-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914259</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Herndlgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901937</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Herogasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901939</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Herschelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901942</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hertha-Firnberg-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906253</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Herzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901948</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Heuberggstttenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901959</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Himberger Brcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910075</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Himberger Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901972</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hintere Liesingbachstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901980</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hintschiggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906123</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hlawkagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906722</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hofherrgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902033</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Holbeingasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902054</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Holeyplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902056</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hollitzergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902061</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Holzknechtstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902069</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Horrplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>900376</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hubert-Gsur-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905526</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hueberhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914084</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hugo-Meisl-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912447</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Humboldtgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902101</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Humboldtplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902102</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Huppgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902106</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Hmmerlegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901719</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ignaz-Pleyel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902122</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Indigoweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902143</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Innovationsstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906582</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Inzersdorfer Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902154</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Jagdgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902171</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Jean-Jaures-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914086</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Jenny-Lind-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902198</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Johann-Friedl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902221</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Johann-Friedl-Steg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910079</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Johann-Plzer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905545</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Johannitergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902225</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Josef-Enslein-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902241</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Jungbauerweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912451</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Jura-Soyfer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905544</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Am Lindkogl</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916411</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Amarantgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916518</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG An der Rosiwalgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916701</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Anningerblick</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916362</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Arbeiter Schrebergarten Verein Favoriten</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916363</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Aus eigener Kraft</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916034</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Bitterlichstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916583</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Blumental Alt</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916039</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Blumental Neu</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916354</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Boschberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916040</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Eremit</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916429</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Eschenkogel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916412</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Ettenreich</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916067</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Favoriten</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916069</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Fischeralm</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916071</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Frohsinn</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916076</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Garten-und Tierfreunde</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916087</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Grenzacker</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916085</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Hentzigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916437</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Heuberggsttten</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916428</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Karl-Frstenhofer</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916419</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Kriegsinvalide sterreich</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916434</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Laaerwald Gruppe Ferstl</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916519</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Laxenburger Allee</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916410</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Liesingbach</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916451</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Lwygrube</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916361</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Mhlbach</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916427</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Rasenstadt</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916413</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Reifental</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916194</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Rudolfshhe</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916210</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Rudolfshgel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916211</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG SDL Laaerwald</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916516</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Sdhang</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916498</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Unterer Gaisberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916244</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Unterm Sender</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916517</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Weichselgarten</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916259</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Weichseltal</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916463</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Wienerberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916477</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Wienerfeld</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916414</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Wilhelmshhe</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916261</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Zum Acker</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916702</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG Zwillingsee</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916356</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG BB Maxing Schwimmschulteich</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916526</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG BB Wien-Sd 2054</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916435</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>KLG BB Zweigverein 2066</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>916525</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kaistrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902323</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Karl-Diener-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902364</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Karl-Popper-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906622</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Karl-Wrba-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914224</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Karmarschgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902392</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Karplusgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902397</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Katharinengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902404</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Keldorfergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902421</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kempelengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902425</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kennergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902428</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Keplergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902430</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Keplerplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902431</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kerschbaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906381</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kiesewettergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902451</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Kirchengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902463</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kirsteweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905810</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kittelsengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902473</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kiurinagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902474</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Klasterskygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909143</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Klausenburger Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902484</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Klederinger Brcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910081</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Klederinger Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902489</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Klemens-Dorn-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902506</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Knllgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902535</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Koliskogasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902572</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kolowratgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909157</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kornauthgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909972</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kossmatplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902618</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Kreuzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902654</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kreuzsteg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910078</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kronawettergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902667</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kudlichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902683</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kundratstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902708</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kur-und Erholungspark Laaer Berg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>920103</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kurbadstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902758</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kurt-Tichy-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909138</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kstenbaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902304</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kstenbaumtunnel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910771</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kthe-Odwody-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912608</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Kglergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902546</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laaer Berg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918154</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laaer Wald</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905673</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laaer-Berg-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902724</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laaer-Wald-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902725</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laaerbergbad</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922018</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laimckergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902741</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Landgutgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902754</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Langsulzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902771</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laubeplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902789</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laxenburger Brcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910293</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Laxenburger Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902802</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lecherweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902812</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Leebgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902817</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lehmgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902822</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Leibnizgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902828</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Leopoldsdorfer Brcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910076</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Leopoldsdorfer Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902856</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Libussagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902879</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Liesingbachstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902899</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lindkogelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902913</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lippmanngasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902926</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ludwig-von-Hhnel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>902992</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lundgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903000</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Lwyweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906101</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Macholdastrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906214</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maiklgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903025</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maillygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903027</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Malborghetgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903032</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Malmgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903036</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mannhartgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903044</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mannschildgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903046</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Marconiweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903060</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Margareta-Heinrich-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905931</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Margarete-Hilferding-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914338</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Margaretengrtel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903065</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maria-Kuhn-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906527</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maria-Lassnig-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906720</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maria-Rekker-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905920</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Maria-und-Rudolf-Fischer-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914113</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Marianne-Pollak-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906723</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Marizaweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909943</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Matzleinsdorf Frachtenbahnhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990507</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Max-Fleischer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905561</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Max-Mauermann-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903137</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Medeagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903150</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Migerkastrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903208</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mithlingerhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914120</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Moritz-Seeler-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905528</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Moselgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909152</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Muhrengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903315</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Munchgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903318</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Munchplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903319</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mundygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903320</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Munthegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903321</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Murbangasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906167</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mnnertreugasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903017</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mhlgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903296</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Mhlstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903303</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Naderstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903338</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Neilreichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903355</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Neuburgergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905503</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Neugrabenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903381</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Neusetzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903391</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Nielrosenweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905704</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ober-Laa Frachtenbahnhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990508</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ober-Laaer Friedhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>919030</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ober-Laaer Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903466</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Obere Grenzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905588</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Oberlaaer Steg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910077</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Oberlaaer Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903467</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Olaus-Petri-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903498</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Olof-Palme-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914278</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Oppenheimgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903510</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Oppenheimweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905609</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ordengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903514</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Otto-Geiler-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906390</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Otto-Probst-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906211</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Otto-Probst-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906062</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Otto-Willmann-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905816</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ottokar-Fischer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906766</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Palisagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903550</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Passage Gudrunstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910311</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Passage Triester Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910320</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Passinigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903584</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Patrubangasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903589</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Per-Albin-Hansson-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903617</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pernerstorfergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903623</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pernerstorferhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914126</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pernerstorfersteg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910382</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Peutlmhlensteg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910049</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pichelmayergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903676</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pickgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906274</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pirchangasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903693</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Planetengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903700</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Popovweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903729</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Puchsbaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903789</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Puchsbaumplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903790</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Plzerhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914130</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Quaringasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903807</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Quarinhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914135</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Quellenplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903809</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Quellenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903810</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>R.-Platzer-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914194</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Raaber-Bahn-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903815</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Radnitzkygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903830</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ramsaygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903845</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Randhartingergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903848</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ranzonigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903853</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Raxstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903875</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rechberggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903878</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Reichenbachgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903892</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Reisingergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903912</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Remystrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903921</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Restaurantbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910442</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Reumannplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903933</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ricarda-Huch-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905815</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rickard-Lindstrm-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903943</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rieplstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903953</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rissaweggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903963</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rosiwalgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904037</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rotdornallee</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904043</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rotenhofgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904046</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rothneusiedler Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904058</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rothneusiedl</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918350</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Roubiczekgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909140</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rudolf-Friemel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906580</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rudolf-Kalab-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909929</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rudolf-Skodak-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>901402</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rustenfeldgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905587</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Rdda-Barnen-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903828</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SMZ-Sd Kaiser-Franz-Josef-Spital</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>921005</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Favoritner-Athletik-Club</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922224</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Haus des Sportes</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922223</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Laaerberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922225</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Rapid Oberlaa</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922222</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Stadt Wien</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922226</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-WSTW-Verkehrsbetriebe</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922227</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>SP-Wienerberg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922228</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sahulkastrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904112</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Saligergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904119</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Salvatorianerplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904128</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sanzingasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904164</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sapphogasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904166</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Samanngasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904169</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schautagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904206</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Scheugasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904232</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Scheunenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904233</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schleiergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904272</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schrackbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910450</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schrankenberggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904348</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schrdingerhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914147</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schrttergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904361</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schwarzgrubergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904415</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Schnygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906050</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sebastianbrcke</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910080</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sedlacekweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912448</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Segnerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904459</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Selma-Lagerlf-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904476</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Senefeldergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904482</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Senfgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904483</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Servaesgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904487</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sibeliusstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904497</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Siccardsburggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904498</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sickingengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904500</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sindelargasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904543</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sindinggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904544</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sissy-Lwinger-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906727</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Soesergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904562</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sonderadresse 10. Bezirk</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918910</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sonnleithnergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904586</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sonnwendgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904587</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Starkegasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904661</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Staudiglgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904665</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Stefan-Fadinger-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904710</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Steg Absberggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910375</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Steg an der Kaistrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910074</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Steineichengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904690</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Steinschtelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904703</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Stella-Kadmon-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909937</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Steudelgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904717</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Stinygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904728</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Stockholmer Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904731</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Suchenwirtplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904803</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Susi-Nicoletti-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909137</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Sdtiroler Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904807</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Tegnrgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904843</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Adresszeile>Favoriten</Adresszeile>
+ <Strassenname>Teichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904845</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>true</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Tesarekplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906212</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Tessingasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904859</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Theodor-Sickel-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904875</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Thermalbad Oberlaa</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>922007</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Thomas-Mnzer-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904885</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Trambauerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904929</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Triester Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904954</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Troststrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904962</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Twin Tower</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918483</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Tyrnauer Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904989</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Alaudagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990134</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Altes Landgut</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990133</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Keplerplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990041</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Neulaa</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990135</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Oberlaa</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990136</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Reumannplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990027</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>U-Bahn Station Troststrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990132</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Uetzgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904995</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Uhlandgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904996</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Uhligstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>904997</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Undsetgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905008</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unter-Laaer Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905027</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unter-Meidlinger Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905028</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Untere Bahnlnde</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906292</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Untere Kaistrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906293</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unterfahrung Laaer-Berg-Strae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910313</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unterfhrung Laaer Wald</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910447</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unterfhrung Neilreichgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>910123</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unterlaaer Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906159</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Unterlaa</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>918298</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Upsalagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905030</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Urselbrunnengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905036</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vally-Weigl-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906700</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Van-der-Nll-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905040</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vettersgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905072</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Victor-Gruen-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906047</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Viktor-Adler-Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914169</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Viktor-Adler-Markt</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>917024</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Viktor-Adler-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905075</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vitalygasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906716</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vivaldigasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>909971</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vogentalgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905102</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Volkmargasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905109</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Volkspark-Laaerberge</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>920047</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vollnhoferplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906611</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Vondrakplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906369</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Waldgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905140</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Waldmllerpark</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>920091</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Waltenhofengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905164</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Walter-Lindenbaum-Gasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905573</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Watzlawickweg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912762</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weichselbaumgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905199</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weidelstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905202</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weigandhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905698</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weitmosergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905239</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weizengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905241</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Weldengasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905243</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wendstattgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905574</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wiedner Grtel</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905278</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wielandgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905281</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wielandplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905282</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wienerbergerplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>907013</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wienerbergstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905284</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wienerfeldgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905285</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wiesenthalgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906048</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wilczekgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905310</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wilhelm-Pinka-Platz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>906257</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Windtenstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905343</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Wirerstrae</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905354</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Whlergasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905367</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zelda-Kaplan-Weg</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>912782</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zentralverschiebebahnhof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>990547</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zohmanngasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905474</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zur Spinnerin</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905487</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zwlfpfenniggasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905502</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zlowgasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>905572</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Zrcher Hof</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>914180</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:Adresssuchergebnis>
+ </zmr:AdresssucheResponse>
+ </base:Response>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseRequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseRequest.xml
new file mode 100644
index 00000000..5e10d725
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseRequest.xml
@@ -0,0 +1,59 @@
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+ <soapenv:Header>
+ <ns9:Security xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <ns8:pvpToken version="1.8">
+ <ns8:authenticate>
+ <ns8:participantId>AT:B:xxx</ns8:participantId>
+ <ns8:userPrincipal>
+ <ns8:userId>userid</ns8:userId>
+ <ns8:cn>full name</ns8:cn>
+ <ns8:gvOuId>AT:B:xxx</ns8:gvOuId>
+ <ns8:ou>Organisation</ns8:ou>
+ <ns8:gvSecClass>3</ns8:gvSecClass>
+ <ns8:gvGid>AT:B:112:PID:71923</ns8:gvGid>
+ <ns8:mail>e@mail</ns8:mail>
+ </ns8:userPrincipal>
+ </ns8:authenticate>
+ <ns8:authorize>
+ <ns8:role value="ZMR-Anfrage"></ns8:role>
+ </ns8:authorize>
+ <ns8:accounting></ns8:accounting>
+ </ns8:pvpToken>
+ </ns9:Security>
+ </soapenv:Header>
+ <soapenv:Body>
+ <Request xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <WorkflowInfoClient>
+ <ProzessName>GP_Abfragen</ProzessName>
+ <ProzessInstanzID>786700000003031</ProzessInstanzID>
+ <SequenzID>0</SequenzID>
+ <VorgangName>ZMR_VO_Adresssuche_im_GWR__6</VorgangName>
+ </WorkflowInfoClient>
+ <ClientInfo>
+ <Organisation>
+ <GemeindeNr>09999</GemeindeNr>
+ </Organisation>
+ <Client>ZMR3-GUI 1.2.36.2-</Client>
+ </ClientInfo>
+ <ns4:AdresssucheRequest>
+ <ns4:AdresssucheInfo>
+ <ns4:Suchart>ADRESSSUCHE</ns4:Suchart>
+ </ns4:AdresssucheInfo>
+ <ns4:Adressdaten>
+ <ns2:PostAdresse>
+ <ns2:Gemeinde>Wien</ns2:Gemeinde>
+ <ns2:Gemeindekennziffer>90001</ns2:Gemeindekennziffer>
+ <ns2:Ortschaft>Wien,Favoriten</ns2:Ortschaft>
+ <ns2:Zustelladresse>
+ <ns2:Strassenname>Pal*</ns2:Strassenname>
+ <ns2:AdressRegisterEintrag></ns2:AdressRegisterEintrag>
+ </ns2:Zustelladresse>
+ </ns2:PostAdresse>
+ <Adressschluessel>
+ <OKZ>17232</OKZ>
+ </Adressschluessel>
+ </ns4:Adressdaten>
+ </ns4:AdresssucheRequest>
+ </Request>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseResponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseResponse.xml
new file mode 100644
index 00000000..f7f3a7c6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienBezirkStrasseResponse.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#">
+ <soapenv:Body>
+ <base:Response xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns11="http://egov.gv.at/pvp1.xsd" xmlns:ns12="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns8="http://www.w3.org/2000/09/xmldsig#" xmlns:ns9="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Mindestsicherung</base:ProzessName>
+ <base:ProzessAnzeigeName>Mindestsicherung</base:ProzessAnzeigeName>
+ <base:ProzessInstanzID>786700000003032</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 0.0</base:GeneriertVon>
+ <base:GeneriertAm>2021-05-27T10:58:33.454</base:GeneriertAm>
+ <base:ServerTransaktionNr>8581910000014159</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdresssucheResponse>
+ <zmr:AdresssucheAnfrage>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Pal*</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheAnfrage>
+ <base:Message>
+ <base:Number>30115</base:Number>
+ <base:Text>Adresssuche durchgefhrt, mehrere Treffer zur Auswahl.</base:Text>
+ </base:Message>
+ <zmr:Adresssuchergebnis>
+ <zmr:Detailgrad>Strassenname</zmr:Detailgrad>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Palisagasse</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903550</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:Adresssuchergebnis>
+ </zmr:AdresssucheResponse>
+ </base:Response>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienRequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienRequest.xml
new file mode 100644
index 00000000..aa32c91c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienRequest.xml
@@ -0,0 +1,52 @@
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+ <soapenv:Header>
+ <ns9:Security xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <ns8:pvpToken version="1.8">
+ <ns8:authenticate>
+ <ns8:participantId>AT:B:xxx</ns8:participantId>
+ <ns8:userPrincipal>
+ <ns8:userId>userid</ns8:userId>
+ <ns8:cn>full name</ns8:cn>
+ <ns8:gvOuId>AT:B:xxx</ns8:gvOuId>
+ <ns8:ou>Organisation</ns8:ou>
+ <ns8:gvSecClass>3</ns8:gvSecClass>
+ <ns8:gvGid>AT:B:112:PID:71923</ns8:gvGid>
+ <ns8:mail>e@mail</ns8:mail>
+ </ns8:userPrincipal>
+ </ns8:authenticate>
+ <ns8:authorize>
+ <ns8:role value="ZMR-Anfrage"></ns8:role>
+ </ns8:authorize>
+ <ns8:accounting></ns8:accounting>
+ </ns8:pvpToken>
+ </ns9:Security>
+ </soapenv:Header>
+ <soapenv:Body>
+ <Request xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <WorkflowInfoClient>
+ <ProzessName>GP_Abfragen</ProzessName>
+ <VorgangName>ZMR_VO_Adresssuche_im_GWR__6</VorgangName>
+ </WorkflowInfoClient>
+ <ClientInfo>
+ <Organisation>
+ <GemeindeNr>09999</GemeindeNr>
+ </Organisation>
+ <Client>ZMR3-GUI 1.2.36.2-</Client>
+ </ClientInfo>
+ <ns4:AdresssucheRequest>
+ <ns4:AdresssucheInfo>
+ <ns4:Suchart>ADRESSSUCHE</ns4:Suchart>
+ </ns4:AdresssucheInfo>
+ <ns4:Adressdaten>
+ <ns2:PostAdresse>
+ <ns2:Gemeinde>wien</ns2:Gemeinde>
+ <ns2:Zustelladresse>
+ <ns2:AdressRegisterEintrag></ns2:AdressRegisterEintrag>
+ </ns2:Zustelladresse>
+ </ns2:PostAdresse>
+ <Adressschluessel></Adressschluessel>
+ </ns4:Adressdaten>
+ </ns4:AdresssucheRequest>
+ </Request>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienResponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienResponse.xml
new file mode 100644
index 00000000..8a246423
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienResponse.xml
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#">
+ <soapenv:Body>
+ <base:Response xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns11="http://egov.gv.at/pvp1.xsd" xmlns:ns12="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns8="http://www.w3.org/2000/09/xmldsig#" xmlns:ns9="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Mindestsicherung</base:ProzessName>
+ <base:ProzessAnzeigeName>Mindestsicherung</base:ProzessAnzeigeName>
+ <base:ProzessInstanzID>786700000003030</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 0.0</base:GeneriertVon>
+ <base:GeneriertAm>2021-05-27T10:53:35.703</base:GeneriertAm>
+ <base:ServerTransaktionNr>8581910000014151</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdresssucheResponse>
+ <zmr:AdresssucheAnfrage>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>wien</Gemeinde>
+ </PostAdresse>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheAnfrage>
+ <base:Message>
+ <base:Number>30115</base:Number>
+ <base:Text>Adresssuche durchgefhrt, mehrere Treffer zur Auswahl.</base:Text>
+ </base:Message>
+ <zmr:Adresssuchergebnis>
+ <zmr:Detailgrad>Ortschaft</zmr:Detailgrad>
+ <base:GefundeneSaetze>23</base:GefundeneSaetze>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Alsergrund</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17231</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Brigittenau</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17242</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Donaustadt</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17244</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Dbling</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17241</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Floridsdorf</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17243</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Hernals</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17239</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Hietzing</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17235</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Innere Stadt</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17223</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Josefstadt</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17230</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Landstrae</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17225</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Leopoldstadt</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17224</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Liesing</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17245</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Margareten</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17227</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Mariahilf</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17228</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Meidling</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17234</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Neubau</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17229</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Ottakring</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17238</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Penzing</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17236</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Rudolfsheim-Fnfhaus</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17237</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Simmering</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17233</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Wieden</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17226</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Whring</Ortschaft>
+ <Zustelladresse>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag/>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17240</base:OKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:Adresssuchergebnis>
+ </zmr:AdresssucheResponse>
+ </base:Response>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlRequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlRequest.xml
new file mode 100644
index 00000000..f00859b6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlRequest.xml
@@ -0,0 +1,60 @@
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
+ <soapenv:Header>
+ <ns9:Security xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <ns8:pvpToken version="1.8">
+ <ns8:authenticate>
+ <ns8:participantId>AT:B:xxx</ns8:participantId>
+ <ns8:userPrincipal>
+ <ns8:userId>userid</ns8:userId>
+ <ns8:cn>full name</ns8:cn>
+ <ns8:gvOuId>AT:B:xxx</ns8:gvOuId>
+ <ns8:ou>Organisation</ns8:ou>
+ <ns8:gvSecClass>3</ns8:gvSecClass>
+ <ns8:gvGid>AT:B:112:PID:71923</ns8:gvGid>
+ <ns8:mail>e@mail</ns8:mail>
+ </ns8:userPrincipal>
+ </ns8:authenticate>
+ <ns8:authorize>
+ <ns8:role value="ZMR-Anfrage"></ns8:role>
+ </ns8:authorize>
+ <ns8:accounting></ns8:accounting>
+ </ns8:pvpToken>
+ </ns9:Security>
+ </soapenv:Header>
+ <soapenv:Body>
+ <Request xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:ns6="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns5="http://www.w3.org/2000/09/xmldsig#" xmlns:ns8="http://egov.gv.at/pvp1.xsd" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns9="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns2="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:ns4="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns3="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#">
+ <WorkflowInfoClient>
+ <ProzessName>GP_Abfragen</ProzessName>
+ <ProzessInstanzID>786700000003032</ProzessInstanzID>
+ <SequenzID>0</SequenzID>
+ <VorgangName>ZMR_VO_Adresssuche_im_GWR__6</VorgangName>
+ </WorkflowInfoClient>
+ <ClientInfo>
+ <Organisation>
+ <GemeindeNr>09999</GemeindeNr>
+ </Organisation>
+ <Client>ZMR3-GUI 1.2.36.2-</Client>
+ </ClientInfo>
+ <ns4:AdresssucheRequest>
+ <ns4:AdresssucheInfo>
+ <ns4:Suchart>ADRESSSUCHE</ns4:Suchart>
+ </ns4:AdresssucheInfo>
+ <ns4:Adressdaten>
+ <ns2:PostAdresse>
+ <ns2:Gemeinde>Wien</ns2:Gemeinde>
+ <ns2:Gemeindekennziffer>90001</ns2:Gemeindekennziffer>
+ <ns2:Ortschaft>Wien,Favoriten</ns2:Ortschaft>
+ <ns2:Zustelladresse>
+ <ns2:Strassenname>Paltramplatz</ns2:Strassenname>
+ <ns2:AdressRegisterEintrag></ns2:AdressRegisterEintrag>
+ </ns2:Zustelladresse>
+ </ns2:PostAdresse>
+ <Adressschluessel>
+ <OKZ>17232</OKZ>
+ <SKZ>903556</SKZ>
+ </Adressschluessel>
+ </ns4:Adressdaten>
+ </ns4:AdresssucheRequest>
+ </Request>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlResponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlResponse.xml
new file mode 100644
index 00000000..359b6cbb
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/Muster/WienStrasseAuswahlResponse.xml
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#">
+ <soapenv:Body>
+ <base:Response xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns11="http://egov.gv.at/pvp1.xsd" xmlns:ns12="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns7="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns8="http://www.w3.org/2000/09/xmldsig#" xmlns:ns9="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Mindestsicherung</base:ProzessName>
+ <base:ProzessAnzeigeName>Mindestsicherung</base:ProzessAnzeigeName>
+ <base:ProzessInstanzID>786700000003033</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 0.0</base:GeneriertVon>
+ <base:GeneriertAm>2021-05-27T11:10:51.129</base:GeneriertAm>
+ <base:ServerTransaktionNr>8581910000014163</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdresssucheResponse>
+ <zmr:AdresssucheAnfrage>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Abgabestelle>false</Abgabestelle>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>false</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheAnfrage>
+ <base:Message>
+ <base:Number>30115</base:Number>
+ <base:Text>Adresssuche durchgefhrt, mehrere Treffer zur Auswahl.</base:Text>
+ </base:Message>
+ <zmr:Adresssuchergebnis>
+ <zmr:Detailgrad>Orientierungsnummer</zmr:Detailgrad>
+ <base:GefundeneSaetze>10</base:GefundeneSaetze>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823056</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>2</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823057</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823058</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>4</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823059</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>5-6</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823060</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>7</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823061</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>I</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>8</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823062</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>9</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823063</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>I</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>10</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823064</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Staatscode>AUT</Staatscode>
+ <Staatsname>sterreich</Staatsname>
+ <Postleitzahl>1100</Postleitzahl>
+ <Gemeinde>Wien</Gemeinde>
+ <Gemeindekennziffer>90001</Gemeindekennziffer>
+ <Ortschaft>Wien,Favoriten</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Paltramplatz</Strassenname>
+ <Orientierungsnummer>11</Orientierungsnummer>
+ <Abgabestelle>false</Abgabestelle>
+ <AdressRegisterEintrag>
+ <Adresscode>6823065</Adresscode>
+ </AdressRegisterEintrag>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:Adressstatus>HXX1XXWXX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>17232</base:OKZ>
+ <base:SKZ>903556</base:SKZ>
+ </base:Adressschluessel>
+ <base:HauptIdent>I</base:HauptIdent>
+ <base:NameZuteil>false</base:NameZuteil>
+ <base:GBDUntteil>true</base:GBDUntteil>
+ </zmr:Adressdaten>
+ </zmr:Adresssuchergebnis>
+ </zmr:AdresssucheResponse>
+ </base:Response>
+ </soapenv:Body>
+</soapenv:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Messages.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Messages.xsd
new file mode 100644
index 00000000..03b711f1
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Messages.xsd
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Messages.xsd
+Zweck: Definiert die Message-Datentypen fuer Services Request und Response (siehe Service.wsdl)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-09-29 teo: Schnittstellen-Liste aktualisiert
+2005-05-24 tsch: BPKPruefung hinzugefuegt
+2005-02-02 tsch: QKZBearbeiten, QKZAuswertung hinzugefuegt
+2005-01-14 tsch: Aviso aktivieren entfernt, Gleichstzungtabelle Warten hinzugefuegt
+2004-11-26 tsch: Adoption, Steuerfahndung, Aviso freischalten/aktivieren hinzugefuegt
+2004-11-22 tsch: Gerichtskommissaerabfrage hinzugefuegt
+2004-09-28 tsch: Wehrfplichtigenanfrage, ablaufende Auskunfssperren-Suche hinzugefuegt
+2004-09-27 tsch: Storno/Korrektur hinzugefuegt
+2004-09-09 tsch: SZR-Vorgaenge sowie Person trennen/zusammenfuehren hinzugefuegt
+2004-07-30 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" schemaLocation="../xsd/zmr/ZMRProxy.xsd"/>
+
+
+ <xsd:complexType name="RequestType">
+ <xsd:sequence>
+ <xsd:element ref="base:WorkflowInfoClient"/>
+ <xsd:element ref="base:ClientInfo"/>
+ <xsd:choice>
+ <xsd:element ref="zmr:AdresssucheRequest"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ResponseType">
+ <xsd:sequence>
+ <xsd:element ref="base:WorkflowInfoServer"/>
+ <xsd:element ref="base:ServerInfo"/>
+ <xsd:choice>
+ <xsd:element ref="zmr:AdresssucheResponse"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Service.wsdl b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Service.wsdl
new file mode 100644
index 00000000..3dbeabc7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/Service.wsdl
@@ -0,0 +1,62 @@
+<definitions xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"
+ xmlns="http://schemas.xmlsoap.org/wsdl/"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" name="Service">
+ <types>
+ <xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#">
+ <xsd:import namespace="http://schemas.xmlsoap.org/ws/2002/04/secext" schemaLocation="secext.xsd"/>
+ <xsd:include schemaLocation="Messages.xsd"/>
+ <xsd:element name="Request" type="RequestType"/>
+ <xsd:element name="Response" type="ResponseType"/>
+ <xsd:element name="ServiceFault">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ErrorCode"/>
+ <xsd:element ref="ErrorMessage"/>
+ <xsd:element ref="ServerTransaktionNr"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </types>
+ <message name="ServiceRequest">
+ <part name="in" element="base:Request"/>
+ <part name="WSSEHeader" element="wsse:Security"/>
+ </message>
+ <message name="ServiceResponse">
+ <part name="out" element="base:Response"/>
+ </message>
+ <message name="ServiceFault">
+ <part name="servicefault" element="base:ServiceFault"/>
+ </message>
+ <portType name="ServicePort">
+ <operation name="service">
+ <input message="base:ServiceRequest"/>
+ <output message="base:ServiceResponse"/>
+ <fault name="servicefault" message="base:ServiceFault"/>
+ </operation>
+ </portType>
+ <binding name="ServiceBinding" type="base:ServicePort">
+ <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="service">
+ <soap:operation style="document"/>
+ <input>
+ <soap:header message="base:ServiceRequest" part="WSSEHeader" use="literal"/>
+ <soap:body use="literal" parts="in"/>
+ </input>
+ <output>
+ <soap:body use="literal"/>
+ </output>
+ <fault name="servicefault">
+ <soap:fault name="servicefault" use="literal"/>
+ </fault>
+ </operation>
+ </binding>
+ <service name="Service">
+ <port name="Service" binding="base:ServiceBinding">
+ <soap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/zmr/soap/ZMRService"/>
+ </port>
+ </service>
+</definitions>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext.xsd
new file mode 100644
index 00000000..1005b12a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext.xsd
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Legal Disclaimer
+
+The presentation, distribution or other dissemination of the information
+contained in this specification is not a license, either expressly or impliedly,
+to any intellectual property owned or controlled by IBM or Microsoft and\or any other
+third party. IBM and Microsoft and\or any other third party may have patents, patent
+applications, trademarks, copyrights, or other intellectual property rights
+covering subject matter in this document. The furnishing of this document
+does not give you any license to IBM's and Microsoft's or any other third party's patents,
+trademarks, copyrights, or other intellectual property.
+
+This specification and the information contained herein is provided on an "AS IS"
+ basis and to the maximum extent permitted by applicable law, IBM and Microsoft provides
+the document AS IS AND WITH ALL FAULTS, and hereby disclaims all other warranties
+and conditions, either express, implied or statutory, including, but not limited
+to, any (if any) implied warranties, duties or conditions of merchantability, of
+fitness for a particular purpose, of accuracy or completeness of responses, of
+results, of workmanlike effort, of lack of viruses, and of lack of negligence,
+all with regard to the document. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR
+NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE DOCUMENT.
+
+IN NO EVENT WILL IBM or MICROSOFT BE LIABLE TO ANY OTHER PARTY FOR THE COST OF PROCURING
+SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS OF USE, LOSS OF DATA, OR ANY
+INCIDENTAL, CONSEQUENTIAL, DIRECT, INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER
+CONTRACT, TORT, WARRANTY, OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY
+OTHER AGREEMENT RELATING TO THIS DOCUMENT, WHETHER OR NOT SUCH PARTY HAD ADVANCE
+NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright Notice
+
+Copyright 2001, 2002 IBM Corporation and Microsoft Corporation. All rights reserved.
+-->
+<xsd:schema targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.2">
+ <xsd:element name="Security">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element defines header block to use for security-relevant data directed at a specific SOAP actor.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ The use of "any" is to allow extensibility and different forms of security data.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UsernameToken">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Username"/>
+ <xsd:element ref="Password" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Username">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Type" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BinarySecurityToken">
+ <xsd:annotation>
+ <xsd:documentation>A security token that is encoded in binary</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:attribute name="ValueType" type="xsd:QName"/>
+ <xsd:attribute name="EncodingType" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SecurityTokenReference">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element is used reference a security token.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="Reference"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other" processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Reference">
+ <xsd:complexType>
+ <xsd:attribute name="URI" type="xsd:anyURI"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="PasswordTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:PasswordText"/>
+ <xsd:enumeration value="wsse:PasswordDigest"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ValueTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:X509v3"/>
+ <xsd:enumeration value="wsse:Kerberosv5TGT"/>
+ <xsd:enumeration value="wsse:Kerberosv5ST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:Base64Binary"/>
+ <xsd:enumeration value="wsse:HexBinary"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="FaultcodeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:UnsupportedSecurityToken"/>
+ <xsd:enumeration value="wsse:UnsupportedAlgorithm"/>
+ <xsd:enumeration value="wsse:InvalidSecurity"/>
+ <xsd:enumeration value="wsse:InvalidSecurityToken"/>
+ <xsd:enumeration value="wsse:FailedAuthentication"/>
+ <xsd:enumeration value="wsse:FailedCheck"/>
+ <xsd:enumeration value="wsse:SecurityTokenUnavailable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext_pvp.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext_pvp.xsd
new file mode 100644
index 00000000..24896b99
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/wsdl/secext_pvp.xsd
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Legal Disclaimer
+
+The presentation, distribution or other dissemination of the information
+contained in this specification is not a license, either expressly or impliedly,
+to any intellectual property owned or controlled by IBM or Microsoft and\or any other
+third party. IBM and Microsoft and\or any other third party may have patents, patent
+applications, trademarks, copyrights, or other intellectual property rights
+covering subject matter in this document. The furnishing of this document
+does not give you any license to IBM's and Microsoft's or any other third party's patents,
+trademarks, copyrights, or other intellectual property.
+
+This specification and the information contained herein is provided on an "AS IS"
+ basis and to the maximum extent permitted by applicable law, IBM and Microsoft provides
+the document AS IS AND WITH ALL FAULTS, and hereby disclaims all other warranties
+and conditions, either express, implied or statutory, including, but not limited
+to, any (if any) implied warranties, duties or conditions of merchantability, of
+fitness for a particular purpose, of accuracy or completeness of responses, of
+results, of workmanlike effort, of lack of viruses, and of lack of negligence,
+all with regard to the document. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR
+NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE DOCUMENT.
+
+IN NO EVENT WILL IBM or MICROSOFT BE LIABLE TO ANY OTHER PARTY FOR THE COST OF PROCURING
+SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS OF USE, LOSS OF DATA, OR ANY
+INCIDENTAL, CONSEQUENTIAL, DIRECT, INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER
+CONTRACT, TORT, WARRANTY, OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY
+OTHER AGREEMENT RELATING TO THIS DOCUMENT, WHETHER OR NOT SUCH PARTY HAD ADVANCE
+NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright Notice
+
+Copyright 2001, 2002 IBM Corporation and Microsoft Corporation. All rights reserved.
+-->
+<xsd:schema targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.2">
+ <xsd:import namespace="http://egov.gv.at/pvp1.xsd" schemaLocation="../xsd/eingebunden/pvp1.xsd"/>
+ <xsd:element name="Security">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element defines header block to use for security-relevant data directed at a specific SOAP actor.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="pvp:pvpToken" minOccurs="0"/>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ The use of "any" is to allow extensibility and different forms of security data.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UsernameToken">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Username"/>
+ <xsd:element ref="Password" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Username">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Type" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BinarySecurityToken">
+ <xsd:annotation>
+ <xsd:documentation>A security token that is encoded in binary</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:attribute name="ValueType" type="xsd:QName"/>
+ <xsd:attribute name="EncodingType" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SecurityTokenReference">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element is used reference a security token.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="Reference"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other" processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Reference">
+ <xsd:complexType>
+ <xsd:attribute name="URI" type="xsd:anyURI"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="PasswordTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:PasswordText"/>
+ <xsd:enumeration value="wsse:PasswordDigest"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ValueTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:X509v3"/>
+ <xsd:enumeration value="wsse:Kerberosv5TGT"/>
+ <xsd:enumeration value="wsse:Kerberosv5ST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:Base64Binary"/>
+ <xsd:enumeration value="wsse:HexBinary"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="FaultcodeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:UnsupportedSecurityToken"/>
+ <xsd:enumeration value="wsse:UnsupportedAlgorithm"/>
+ <xsd:enumeration value="wsse:InvalidSecurity"/>
+ <xsd:enumeration value="wsse:InvalidSecurityToken"/>
+ <xsd:enumeration value="wsse:FailedAuthentication"/>
+ <xsd:enumeration value="wsse:FailedCheck"/>
+ <xsd:enumeration value="wsse:SecurityTokenUnavailable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Messages.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Messages.xsd
new file mode 100644
index 00000000..47dcda53
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Messages.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Messages.xsd
+Zweck: Definiert die Message-Datentypen fuer Services Request und Response (siehe Service.wsdl)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-08-09 xfu: +BasTabelleAbfrage.xsd
+2004-02-18 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../eingebunden/InfoTechnisch.xsd"/>
+ <xsd:include schemaLocation="../eingebunden/Workflow.xsd"/>
+ <xsd:include schemaLocation="Benutzereinstellungen.xsd"/>
+ <xsd:include schemaLocation="Organisationseinstellungen.xsd"/>
+ <xsd:include schemaLocation="GeschaeftsprozesseAuflisten.xsd"/>
+ <xsd:include schemaLocation="Auswertungen.xsd"/>
+ <xsd:include schemaLocation="BasTabelleAbfrage.xsd"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Service.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Service.xsd
new file mode 100644
index 00000000..81cd3e80
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/allgemein/Service.xsd
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: Service.xsd
+Zweck: Definiert die Serviceroot - Elemente base:Request und base:Response global
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2008-07-25 teo: +PDFResponse (optional! ZMR setzt dieses Feld bisher nicht!)
+2004-08-19 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="Messages.xsd"/>
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="Request">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WorkflowInfoClient"/>
+ <xsd:element ref="ClientInfo"/>
+ <xsd:any processContents="lax"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Response">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WorkflowInfoServer"/>
+ <xsd:element name="PDFResponse" type="xsd:base64Binary" minOccurs="0"/>
+ <xsd:element ref="ServerInfo"/>
+ <xsd:any processContents="lax"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AbfrageMuster.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AbfrageMuster.xsd
new file mode 100644
index 00000000..9430ade8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AbfrageMuster.xsd
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AbfrageParameter.xsd
+Zweck: Definiert Datentypen für generische Suchabfragen mit simplen Operatoren
+Author(s): Tschurtschenthaler Thomas (basierend auf suchmuster.xsd von DI Heinz Töfferl - Comm-Unity Software Development GmbH & Co KG)
+Aenderungshistorie:
+2005-03-30 tsch: Erstellung
+-->
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:element name="AbfrageMuster">
+ <xsd:annotation>
+ <xsd:documentation>Daten zu einem Suchmuster (Ausdruck)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="FeldAbfrage"/>
+ <xsd:element ref="SubFeldAbfrage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Dient zur Klammerung von Suchmuster-Ausdrücken.
+ Muss erst dann unterstützt werden, wenn eine Klammerung nötig wird.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="AbfrageMuster"/>
+ <xsd:element ref="SubAbfrageMuster" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:choice>
+ <xsd:attribute name="AbfrageName" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="FeldAbfrage">
+ <xsd:annotation>
+ <xsd:documentation>Eine Sucheinschränkung (= Einschränkung für ein Feld)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Feld" type="xsd:string"/>
+ <xsd:element ref="Relation"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Operation" block="restriction" default="UND">
+ <xsd:annotation>
+ <xsd:documentation>Verknüpfung mit der nächsten Zeile (Default: AND)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:NMTOKEN">
+ <xsd:enumeration value="UND"/>
+ <xsd:enumeration value="ODER"/>
+ <xsd:enumeration value="ODER_SELF"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Relation">
+ <xsd:annotation>
+ <xsd:documentation>Mögliche Vergleichsoperatoren.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="IST"/>
+ <xsd:enumeration value="IST NICHT"/>
+ <xsd:enumeration value="BEGINNT MIT"/>
+ <xsd:enumeration value="BEGINNT NICHT MIT"/>
+ <xsd:enumeration value="ENDET MIT"/>
+ <xsd:enumeration value="ENDET NICHT MIT"/>
+ <xsd:enumeration value="GRÖSSER ALS"/>
+ <xsd:enumeration value="GRÖSSER GLEICH"/>
+ <xsd:enumeration value="KLEINER ALS"/>
+ <xsd:enumeration value="KLEINER GLEICH"/>
+ <xsd:enumeration value="ENTHÄLT"/>
+ <xsd:enumeration value="ENTHÄLT NICHT"/>
+ <xsd:enumeration value="IST LEER"/>
+ <xsd:enumeration value="IST NICHT LEER"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AbfrageSortierung">
+ <xsd:annotation>
+ <xsd:documentation>Daten zur Sortierung einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SortSchluessel" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SortSchluessel">
+ <xsd:annotation>
+ <xsd:documentation>Sortierungsschluessel einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Feld" type="xsd:string"/>
+ <xsd:element name="Absteigend" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SubFeldAbfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Operation"/>
+ <xsd:element ref="FeldAbfrage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SubAbfrageMuster">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Operation"/>
+ <xsd:element ref="AbfrageMuster"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AbfrageParameter">
+ <xsd:annotation>
+ <xsd:documentation>Daten zur Parametrisierung einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Parameter" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Parameter">
+ <xsd:annotation>
+ <xsd:documentation>Ein einzelner Abfrageparameter</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Name" type="xsd:string"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AkademischerGradFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AkademischerGradFelder.xsd
new file mode 100644
index 00000000..fc910841
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/AkademischerGradFelder.xsd
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AkademischerGradFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für akademische Grade
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-12-15 tsch: AkadGradReihung - Wertebereich erweitert
+2004-06-20 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="AkadGradStellung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="VOR"/>
+ <xsd:enumeration value="NACH"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradReihung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="0"/>
+ <xsd:enumeration value="1"/>
+ <xsd:enumeration value="2"/>
+ <xsd:enumeration value="2/3"/>
+ <xsd:enumeration value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradLang">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradKurz">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="30"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AkadGradKey" type="IDType"/>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Blaettern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Blaettern.xsd
new file mode 100644
index 00000000..5b556802
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Blaettern.xsd
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Blaettern.xsd
+Zweck: Definiert Request-Typen für das allgemeine Blättern; Die Response hängt vom Workflow-Vorgang ab (Personensuchergebnis, Avisosuchergebnis, ...)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-04-19 toef: Richtungswerte 'Anfang' und 'Ende' hinzugefügt
+2005-09-20 tsch: Richtungswert 'Aktualisieren' hinzugefügt
+2004-06-14 tsch: Organisation nach ClientInfo verschoben
+2004-04-07 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="BlaetternRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Für Suchvorgänge, in deren Ergebnisliste geblättert werden kann, stellt dieser Request
+ eine generische Schnittstelle zum Blättern dar. Er wird mit demselben Vorgang-Namen in der
+ Workflowschnittstelle geschickt, wie der ursprüngliche Suche-Request. Als Ergebnis wird
+ das Suchergebnis des ensprechenden Suchvorgangs analog zur rsprünglichen Suche-Response geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BlaetternInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BlaetternInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ErgebnislisteName" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Richtung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Vor"/>
+ <xsd:enumeration value="Zurueck"/>
+ <xsd:enumeration value="Aktualisieren"/>
+ <xsd:enumeration value="Anfang"/>
+ <xsd:enumeration value="Ende"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/DokumentFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/DokumentFelder.xsd
new file mode 100644
index 00000000..270cb52a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/DokumentFelder.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: DokumentFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Dokumente/Reisedokumente
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-09-26 tsch: DokumentName hinzugefügt
+2004-09-29 tsch: Felder für Standard-Dokumente hinzugefügt
+2004-06-24 tsch: AusstellDatum: Timestamp wird xsd:date
+2004-01-22 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="DokumentArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="55"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="DokumentNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="256"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EintragungsNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="DokumentName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AusstellDatum" type="xsd:date"/>
+ <xsd:element name="AblaufDatum" type="xsd:date"/>
+ <xsd:element name="SterbeDatum" type="xsd:date"/>
+ <xsd:element name="SterbeUhrzeit" type="xsd:time"/>
+ <xsd:element name="AusstellBehoerde">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Ausstellungsstaat" type="StaatenNameType"/>
+ <xsd:element name="DokumentGiltBis" type="TimestampType"/>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/EingebundenProxy.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/EingebundenProxy.xsd
new file mode 100644
index 00000000..450fad59
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/EingebundenProxy.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: EingebundenProxy.xsd
+Zweck: Fasst XSD-Files zusammen, die oft eingebunden werden
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-07-07 teo: +PersonExport
+2003-12-10 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+ <xsd:include schemaLocation="InfoTechnisch.xsd"/>
+ <xsd:include schemaLocation="MeldungFelder.xsd"/>
+ <xsd:include schemaLocation="PersonFelder.xsd"/>
+ <xsd:include schemaLocation="DokumentFelder.xsd"/>
+ <xsd:include schemaLocation="Workflow.xsd"/>
+ <xsd:include schemaLocation="Blaettern.xsd"/>
+ <xsd:include schemaLocation="AkademischerGradFelder.xsd"/>
+ <xsd:include schemaLocation="AbfrageMuster.xsd"/>
+ <xsd:include schemaLocation="PersonExport.xsd"/>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Entity.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Entity.xsd
new file mode 100644
index 00000000..4ed61a4f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Entity.xsd
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Entity.xsd
+Zweck: Definiert allgemeine Datentypen für Entities (Person, Meldung, ...) der Register
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-08-09 xfu: Beginncode und -text ist optional
+2004-10-27 tsch: Behoerdenschluessel hinzugefügt
+2004-09-28 tsch: OrgBezeichnung hinzugefügt
+2004-06-21 tsch: EntityReferenz ohne LetzteAenderung
+2004-06-18 tsch: BeginnText hinzugefügt
+2004-01-22 tsch: EntityErgebnisReferenz statt Entity abstract
+2003-11-16 tsch: Erstellung
+-->
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="EntityErgebnisReferenz" type="EntityErgebnisReferenzType"/>
+ <xsd:complexType name="EntityErgebnisReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Referenziert eine Entity in der Datenbank für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:sequence>
+ <xsd:element ref="Technisch"/>
+ <xsd:group ref="ErgebnisFachlichGroup"/>
+ </xsd:sequence>
+ </xsd:sequence>
+
+ </xsd:complexType>
+
+ <xsd:element name="EntityReferenz" type="EntityReferenzType"/>
+ <xsd:complexType name="EntityReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Referenziert eine Entity in der Datenbank für Aenderungen (immer die aktuellste, das heisst jüngstes 'Von')</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EntityID"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Technisch">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityID"/>
+ <xsd:element ref="LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:group name="ErgebnisFachlichGroup">
+ <xsd:sequence>
+ <xsd:element ref="Von"/>
+ <xsd:element ref="BeginnCode" minOccurs="0"/> <!-- Einträge in BAS.STAAT und BAS.AKADGRAD haben keinen Beginncode (werden aber in BasTabelleAbfrage.xsd abgerufen) -->
+ <xsd:element ref="BeginnText" minOccurs="0"/>
+ <xsd:element ref="BeginnFreitext" minOccurs="0"/>
+ <xsd:element ref="Bis" minOccurs="0"/>
+ <xsd:element ref="DurchgefuehrtVon"/>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="Von" type="TimestampType"/>
+ <xsd:element name="Bis" type="TimestampType"/>
+ <xsd:element name="BeginnCode" type="GrundCodeType"/>
+ <xsd:element name="BeginnText" type="GrundTextType"/>
+ <xsd:element name="BeginnFreitext" type="GrundFreitextType"/>
+ <xsd:element name="EntityID" type="ENTITYIDType"/>
+ <xsd:element name="LetzteAenderung" type="TimestampType"/>
+ <xsd:element name="DurchgefuehrtVon" type="DurchgefuehrtVonType"/>
+ <xsd:complexType name="DurchgefuehrtVonType">
+ <xsd:sequence>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="Benutzer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Organisation">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>
+ Die derzeit bekannten Organisationen sind strikt definiert (BehoerdenNr, GemeindeNr, KundenNr);
+ neue, noch nicht definierte Organiationen, können mittels eines (Orgtyp, OrgCode)-Paares übermittelt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:choice>
+ <xsd:element ref="BehoerdenNr"/>
+ <xsd:element ref="GemeindeNr"/>
+ <xsd:element ref="KundenNr"/>
+ <xsd:element ref="Behoerdenschluessel"/>
+ </xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="OrgTyp"/>
+ <xsd:element ref="OrgCode"/>
+ </xsd:sequence>
+ </xsd:choice>
+ <xsd:element ref="OrgBezeichnung" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BehoerdenNr" type="BehoerdenNrType"/>
+ <xsd:element name="Behoerdenschluessel" type="BehoerdenschluesselType"/>
+ <xsd:element name="GemeindeNr" type="GemeindeNrType"/>
+ <xsd:element name="KundenNr" type="KundenNrType"/>
+ <xsd:element name="OrgTyp" type="OrgTypType"/>
+ <xsd:element name="OrgCode" type="OrgCodeType"/>
+ <xsd:element name="Benutzer" type="BenutzerType"/>
+ <xsd:element name="OrgBezeichnung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="80"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="BehoerdenBezeichnung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="80"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoFachlich.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoFachlich.xsd
new file mode 100644
index 00000000..9bf8ceb0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoFachlich.xsd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: InfoFachlich.xsd
+Zweck: Definiert Typen für allgemeine fachliche Informationen der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-08-08 tsch: Feld EingeschraenkteHistorie hinzugefügt
+2004-09-09 tsch: Register hinzugefügt
+2004-07-07 tsch: InfoFachlichType.Von optional, InfoFachlichType.GrundCode Mussfeld
+2004-06-22 tsch: SaetzeVon, SaetzeBis hinzugefügt
+2004-06-18 tsch: ErgebnissatzInfo, Beendigung hinzugefügt
+2004-04-17 tsch: Organisation entfernt
+2004-04-13 tsch: InfoFachlichType - GrundCode optional
+2003-11-16 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+ <xsd:include schemaLocation="Entity.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="PersonDataZMR.xsd"/>
+
+ <xsd:element name="ErgebnissatzInfo" type ="ErgebnissatzInfoType"/>
+ <xsd:complexType name="ErgebnissatzInfoType">
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Letze-Änderung-Timestamp des Gesamt-Satzes (Jüngster Timestamp aller Entities im Satz),
+ Muss bei einem Änderungsvorgang als Letzte-Änderung-Timestamp geschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Message">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Number"/>
+ <xsd:element ref="Text"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Number" type="IntegerType"/>
+ <xsd:element name="Text">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="250"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:complexType name="InfoFachlichType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine fachliche Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="Von" minOccurs="0"/>
+ <xsd:element name="GrundCode" type="GrundCodeType"/>
+ <xsd:element ref="GrundFreitext" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BPKPersonInfo" type="BPKPersonInfoType"/>
+ <xsd:complexType name="BPKPersonInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Bereichspezifische Bürgerkarten-Information einer Person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="Bereichskennung"/>
+ <xsd:element ref="BPK"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Beendigung" type="xsd:boolean"/>
+ <xsd:element name="Bezugsfeld" type="BezugsfeldType"/>
+
+ <xsd:element name="Stichtag" type="TimestampType"/>
+ <xsd:element name="InclusivHistorie" type="xsd:boolean"/>
+ <xsd:element name="EingeschraenkteHistorie" type="xsd:boolean"/>
+ <xsd:element name="Formalisiert" type="xsd:boolean"/>
+ <xsd:element name="ErstellePDF" type="xsd:boolean"/>
+ <xsd:element name="InclusivAusgeblendeteSaetze" type="xsd:boolean"/>
+ <xsd:element name="InclusivNameVorErsterEhe" type="xsd:boolean"/>
+ <xsd:element name="GefundeneSaetze" type="IntegerType"/>
+ <xsd:element name="AnzahlSaetze" type="IntegerType"/>
+ <xsd:element name="SaetzeVon" type="IntegerType"/>
+ <xsd:element name="SaetzeBis" type="IntegerType"/>
+ <xsd:element name="GrundFreitext" type="GrundFreitextType"/>
+ <xsd:element name="Bereichskennung" type="xsd:string"/>
+ <xsd:element name="BPK" type="xsd:string"/>
+ <xsd:element name="Register" type="RegisterType"/>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoTechnisch.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoTechnisch.xsd
new file mode 100644
index 00000000..567a91f0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/InfoTechnisch.xsd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: InfoTechnisch.xsd
+Zweck: Definiert Typen für allgemeine technische Informationen der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-09 tsch: ErrorCode, ErrorMessage hinzugefügt
+2004-06-24 tsch: UserInfo als Message definiert
+2004-05-17 tsch: Organisation, Client dazugefügt; Softwarehaus, ClientVersion entfernt
+2003-11-16 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="ClientInfo" type="ClientInfoType"/>
+
+ <xsd:complexType name="ClientInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Technische Client-Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="Client">
+ <xsd:annotation>
+ <xsd:documentation>Herstellername der Client-Software inklusive Version (Bsp.: ZMRHTMLClient V3.0)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Client">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="18"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+
+ <xsd:element name="ServerInfo" type="ServerInfoType"/>
+
+ <xsd:complexType name="ServerInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Technische Server-Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="GeneriertVon">
+ <xsd:annotation>
+ <xsd:documentation>Applikationsname und -version</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="GeneriertAm">
+ <xsd:annotation>
+ <xsd:documentation>Generierung Timestamp</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="ServerTransaktionNr">
+ <xsd:annotation>
+ <xsd:documentation>Transaktionsnummer des Servers</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="UserInfo" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enthält neue User-Information (wie z.B. Information über Wartungarbeiten am ZMR)
+ Diese Info kann dem User am Bildschirm angezeigt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="GeneriertVon">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="GeneriertAm" type="TimestampType"/>
+ <xsd:element name="ErrorCode" type="xsd:string"/>
+ <xsd:element name="ErrorMessage" type="xsd:string"/>
+ <xsd:element name="ServerTransaktionNr" type="IDType"/>
+ <xsd:element name="UserInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/MeldungFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/MeldungFelder.xsd
new file mode 100644
index 00000000..7a9feda1
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/MeldungFelder.xsd
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: MeldungFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Meldedaten
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-11-24 mp: +Infotext (ZMR-1513)
+2009-11-20 mp: Gebäudeeigenschaft und Nutzungsart hinzugefügt
+2006-06-26 tsch: OrientierungsnummerBis hinzugefügt
+2005-12-06 tsch: Detailfelder für GWR-Tueren hinzugefügt
+2004-12-09 tsch: OKZ und SKZ alphanumerisch
+2004-08-16 tsch: Bezirkskennung, DruckZusatztext hinzugefügt
+2004-08-02 tsch: PeriodeCode, PeriodeText, PeriodeFreitext hinzugefügt
+2004-07-30 tsch: HauptIdentadresse->HauptIdent; AdressZusatz enfernt; +OKZ; +SKZ; +Adressschluessel; +InfoMeldewesen
+2004-06-24 tsch: GBRRefkey, Postleitzahlgebiet hinzugefügt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+
+ <xsd:element name="GemeldetVon" type="TimestampType"/>
+ <xsd:element name="GemeldetBis" type="TimestampType"/>
+
+ <xsd:element name="PeriodeCode" type="GrundCodeType"/>
+ <xsd:element name="PeriodeText" type="GrundTextType"/>
+ <xsd:element name="PeriodeFreitext" type="GrundFreitextType"/>
+
+ <xsd:element name="Unterkunftgeber">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="250"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ADRRefkey">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="12"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="GBRRefkey">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="12"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="HauptIdent">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="H"/>
+ <xsd:enumeration value="I"/>
+ <xsd:enumeration value="B"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="OKZ">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="SKZ">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adressstatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="9"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Hofname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StrasseZweisprachig">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Gebaeudeunterscheidung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="60"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Postleitzahlgebiet">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="InfoMeldewesen">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="GBDUntteil" type="xsd:boolean"/>
+
+ <xsd:element name="NameZuteil" type="xsd:boolean"/>
+
+ <xsd:element name="Adressschluessel">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="OKZ" minOccurs="0"/>
+ <xsd:element ref="SKZ" minOccurs="0"/>
+ <xsd:element ref="ADRRefkey" minOccurs="0"/>
+ <xsd:element ref="GBRRefkey" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Bezirkskennung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="DruckZusatztext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="230"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Infotext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="230"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="TuerNr">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="TopNr">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Lagebeschreibung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzLage">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzStock">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzAdrart">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="OrientierungsnummerBis">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="32"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="GbdEigenschaft">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonDataZMR.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonDataZMR.xsd
new file mode 100644
index 00000000..8a05c612
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonDataZMR.xsd
@@ -0,0 +1,741 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonDataZMR.xsd
+Zweck: Striktere Redefinition des Generischen Schemas zum Speichern und Austauschen von Personendaten des Chief Information Office Austria, Stabsstelle IKT-Strategie des Bundes, BMÖLS
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-04-12 ee : element "Adresse" entfernt, substitutionGroups darauf entfernt
+ -> mit wsdl2java wieder kompilierbar, sonst "Adresse is referenced but not defined." error
+2010-07-09 rp : LMR-783: +GueltigVon, GueltigBis bei Staatsangehoerigkeit
+2009-11-25 teo : ZMR-1296 Anpassungen aufgrund Bundesgesetz über die eingetragene Partnerschaft (EPG)
+2006-04-18 woeg: Familienstand
+2005-09-26 tsch: Internetadresse, Telefonadresse übernommen, Postleitzahl alphanumerisch
+2004-01-31 tsch: maximale Feldlänge für Geburtsbundesland auf 72 erhöht, minimale auf 0.
+2004-12-09 tsch: Adresscode und Objektnummer alphanumerisch, Postleitzahl mit führender Null
+2004-11-02 tsch: Elemenent Affix in PersonenNameTyp Unbounded
+2004-08-24 tsch: Element PersonenDaten übernommen
+2004-07-30 tsch: Anpassungen von Personrecord-Feldern: +Adresszeile; Gebaeudeteil->Gebaeude; Nutzungseinheitnummer->Nutzungseinheit; NTZLNR->Nutzungseinheitlaufnummer; +Postfach; AdressRegEintrag->AdressRegisterEintrag;Gemeindekennzahl->Gemeindekennziffer
+2004-07-20 tsch: Staatsangehörigkeit-Felder optional
+2004-07-08 tsch: Region (Postleitzahlgebiet) hinzugefügt
+2004-06-24 tsch: StaatsCode, StaatsName in Postadresse übernommen
+2004-01-28 tsch: Adaptionen an neuen CIO-PersonDataDE Record
+2004-01-27 tsch: ZMRAdresse wird PostAdresse
+2004-01-15 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="W3C-XMLDSig.xsd"/>
+ <xsd:annotation>
+ <xsd:documentation>This version of person deploys only global elements. All types derived from abstract types have been replaced by substitution groups</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="Identification" type="IdentificationType">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:complexType name="IdentificationType">
+ <xsd:annotation>
+ <xsd:documentation>unique identifier</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Value" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>actual value of the identifier.</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Type" type="xsd:anyURI">
+ <xsd:annotation>
+ <xsd:documentation>type of value (eg 'ZMR', 'SV-Nummer', 'Martrikelnummer', database identification, ...)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>zusätzliche felder</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="PersonenDaten" type="PersonenDatenTyp">
+ <xsd:annotation>
+ <xsd:documentation>Personendatenstruktur</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="PersonenDatenTyp">
+ <xsd:sequence>
+ <xsd:element ref="NatuerlichePerson"/>
+ <xsd:element ref="PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonTyp" substitutionGroup="Person">
+ <xsd:annotation>
+ <xsd:documentation>element of physical person type</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Person" type="AbstractPersonType">
+ <xsd:annotation>
+ <xsd:documentation>element of person type</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="AbstractPersonType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>main structure of person data</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="Identification" type="IdentificationType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID" use="optional"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonTyp">
+ <xsd:annotation>
+ <xsd:documentation>physical person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractPersonType">
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonenName" minOccurs="0"/>
+ <xsd:element ref="AlternativName" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="Familienstand" minOccurs="0"/>
+ <xsd:element ref="Geschlecht" minOccurs="0"/>
+ <xsd:element ref="Geburtsdatum" minOccurs="0"/>
+ <xsd:element ref="Geburtsort" minOccurs="0"/>
+ <xsd:element ref="Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="Geburtsstaat" minOccurs="0"/>
+ <xsd:element ref="Sterbedatum" minOccurs="0"/>
+ <xsd:element ref="Staatsangehoerigkeit" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:element name="AlternativName">
+ <xsd:annotation>
+ <xsd:documentation>Former name, Artist name, changes of Given name ... type of name is given as attribute - choose from list or define new type</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Familienname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Type" type="DefinierterAlternativNamensTypTyp" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="DefinierterAlternativNamensTypTyp">
+ <xsd:annotation>
+ <xsd:documentation>known types of alternative names</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Kuenstlername"/>
+ <xsd:enumeration value="Spitzname"/>
+ <xsd:enumeration value="FruehererName"/>
+ <xsd:enumeration value="Alias"/>
+ <xsd:enumeration value="NameVorErsterEhe"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="PersonenName" type="PersonenNameTyp"/>
+
+ <xsd:complexType name="PersonenNameTyp">
+ <xsd:sequence>
+ <xsd:element ref="Vorname" minOccurs="0"/>
+ <xsd:element ref="Familienname" minOccurs="0"/>
+ <xsd:element ref="Affix" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="Familienname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Vorname" nillable="true">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Affix">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="typ" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="akademischerGrad"/>
+ <xsd:enumeration value="Adelstitel"/>
+ <xsd:enumeration value="FamiliennamenSuffix"/>
+ <xsd:enumeration value="Anrede"/>
+ <xsd:enumeration value="Generation"/>
+ <xsd:enumeration value="Qualifikation"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="position" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="prefix"/>
+ <xsd:enumeration value="suffix"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Sterbedatum">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Geburtsdatum">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Familienstand">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for marital status of a person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="ledig"/>
+ <xsd:enumeration value="verheiratet"/>
+ <xsd:enumeration value="in eingetragener Partnerschaft lebend"/>
+ <xsd:enumeration value="geschieden"/>
+ <xsd:enumeration value="eingetragene Partnerschaft aufgelöst oder für nichtig erklärt"/>
+<!-- <xsd:enumeration value="aufgelöste eingetragene Partnerschaft"/> -->
+ <xsd:enumeration value="verwitwet"/>
+ <xsd:enumeration value="hinterbliebener eingetragener Partner"/>
+ <xsd:enumeration value="Ehe aufgehoben oder für nichtig erklärt"/>
+ <xsd:enumeration value="unbekannt"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geschlecht">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for sex (gender) of person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geburtsort">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geburtsstaat">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Geburtsbundesland">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="72"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Staatsangehoerigkeit">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ISOCode3" minOccurs="0"/>
+ <xsd:element ref="StaatsnameDE" minOccurs="0"/>
+ <xsd:element ref="StaatsnameEN" minOccurs="0"/>
+ <xsd:element ref="StaatsnameFR" minOccurs="0"/>
+ <xsd:element name="GueltigVon" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="GueltigBis" type="xsd:date" minOccurs="0"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameDE">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameEN">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameFR">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="PostAdresse" type="PostAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Post oder ZMR Adresse, entspricht PostalAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:complexType name="AbstractAddressType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>main structure of address data</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="Identification" type="IdentificationType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID" use="optional"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ <xsd:complexType name="PostAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>postal address</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element ref="Staatscode" minOccurs="0"/>
+ <xsd:element ref="Staatsname" minOccurs="0"/>
+
+ <xsd:element ref="Postleitzahl" minOccurs="0"/>
+ <xsd:element ref="Region" minOccurs="0"/>
+ <xsd:element ref="Bundesland" minOccurs="0"/>
+ <xsd:element ref="Gemeinde" minOccurs="0"/>
+ <xsd:element ref="Gemeindekennziffer" minOccurs="0"/>
+ <xsd:element ref="Ortschaft" minOccurs="0"/>
+ <xsd:element ref="OrtschaftZweisprachig" minOccurs="0"/>
+ <xsd:element name="Zustelladresse" type="ZustelladresseTyp" minOccurs="0"/>
+
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="ZustelladresseTyp">
+ <xsd:sequence>
+ <xsd:element ref="Adresszeile" minOccurs="0"/>
+ <xsd:element ref="Strassenname" minOccurs="0"/>
+ <xsd:element ref="Orientierungsnummer" minOccurs="0"/>
+ <xsd:element ref="Gebaeude" minOccurs="0"/>
+ <xsd:element ref="Nutzungseinheit" minOccurs="0"/>
+ <xsd:element ref="Postfach" minOccurs="0"/>
+ <xsd:element ref="Wohnsitzqualitaet" minOccurs="0"/>
+ <xsd:element ref="Abgabestelle" minOccurs="0"/>
+ <xsd:element ref="Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element name="AdressRegisterEintrag" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Adresscode" minOccurs="0"/>
+ <xsd:element ref="Subcode" minOccurs="0"/>
+ <xsd:element ref="Objektnummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="InternetAdresse" type="InternetAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Entspricht InternetAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="TelefonAdresse" type="TelefonAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Container für Telefonnummern, entspricht TelephoneAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="InternetAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>internet based communication</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="dsig:KeyInfo" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>certificate for secure communication</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Adresse">
+ <xsd:annotation>
+ <xsd:documentation>eURI: mail-Adresse, Web, FTP, LDAP, ..., entspricht Address</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:anyURI">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="60"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TelefonAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>phone numbers</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element name="Typ">
+ <xsd:annotation>
+ <xsd:documentation>type of phononumber - category (eg 'Festnetz', 'Mobile', 'fax', ...)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Festnetz"/>
+ <xsd:enumeration value="Mobil"/>
+ <xsd:enumeration value="Fax"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Nummer" type="TelekomNummerTyp">
+ <xsd:annotation>
+ <xsd:documentation>phonenumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TelekomNummerTyp">
+ <xsd:choice>
+ <xsd:element ref="FormatierteNummer"/>
+ <xsd:group ref="TelekomNummernGruppe"/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:group name="TelekomNummernGruppe">
+ <xsd:sequence>
+ <xsd:element ref="InternationalerLaendercode" minOccurs="0"/>
+ <xsd:element ref="NationalNummer" minOccurs="0"/>
+ <xsd:element ref="Vorwahl" minOccurs="0"/>
+ <xsd:element ref="Anschlussnummer"/>
+ <xsd:element ref="Klappe" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="InternationalerLaendercode" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht InternationalCountryCode</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="NationalNummer" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht NationalNumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Vorwahl" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht AreaCityCode</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Anschlussnummer" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht SubscriberNumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="FormatierteNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Klappe" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht Extension</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+
+ <xsd:element name="Abgabestelle" type="xsd:boolean"/>
+
+ <xsd:element name="Wohnsitzqualitaet">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="H"/>
+ <xsd:enumeration value="N"/>
+ <xsd:enumeration value="O"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="ISOCode3">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Staatscode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Staatsname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Postleitzahl">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="10"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Region">
+ <xsd:annotation>
+ <xsd:documentation>entspricht Region</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Bundesland">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Wien"/>
+ <xsd:enumeration value="Niederösterreich"/>
+ <xsd:enumeration value="Burgenland"/>
+ <xsd:enumeration value="Oberösterreich"/>
+ <xsd:enumeration value="Steiermark"/>
+ <xsd:enumeration value="Salzburg"/>
+ <xsd:enumeration value="Kärnten"/>
+ <xsd:enumeration value="Tirol"/>
+ <xsd:enumeration value="Vorarlberg"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Gemeinde">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Gemeindekennziffer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Ortschaft">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="OrtschaftZweisprachig">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adresscode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Subcode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Nutzungseinheitlaufnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{4}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Objektnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Strassenname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Orientierungsnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="32"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Gebaeude">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="75"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Nutzungseinheit">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="40"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adresszeile">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Postfach">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonExport.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonExport.xsd
new file mode 100644
index 00000000..ae0b5712
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonExport.xsd
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Name: PersonExport.xsd
+ Zweck: Definiert allgemein nutzbare Export-Schnittstelle um eine Liste von Personen abzubilden.
+ Author(s): Ehrenmüller Oliver, ZMR-SU
+
+ Aenderungshistorie:
+ 2009-07-20 teo: Überarbeitung PersonExportElementType
+ 2009-07-08 teo: erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:annotation>
+ <xsd:documentation>Definiert allgemein nutzbare Export-Schnittstelle um eine Liste von Personen abzubilden.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="PersonExport" type="PersonExportType">
+ <xsd:annotation>
+ <xsd:documentation>Root-Element des Personenexports.</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="PersonExportType">
+ <xsd:annotation>
+ <xsd:documentation>Root-Element des Personenexports.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ <xsd:element ref="Stichtag"/>
+ <xsd:element name="Database">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Person" type="PersonExportElementType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Gruppiert nach Personen werden alle Elemente in dieser
+ Liste abgebildet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportElementType">
+ <xsd:annotation>
+ <xsd:documentation>Dieser Type beinhaltet alle Elemente die zu einer Person gehören.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="ID" type="ENTITYIDType"/>
+ <xsd:element name="Typ" type="xsd:string"/>
+ <xsd:element name="Satz" type="PersonExportSatzType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Diese Liste beinhaltet alle Sätze die zu einer
+ Person gehören. Unabhängig von der Tabelle oder
+ Strang-Historie.
+ Fehlt die Liste, ist die Entity zu löschen.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportSatzType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Dieser Type beinhaltet alle Elemente die sich auf einen Eintrag
+ in einer beliebigen Tabelle beziehen.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Tabelle">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="EntityID"/>
+ <xsd:element name="RecID" type="ENTITYIDType"/>
+ <xsd:element name="Created" type="TimestampType"/>
+ <xsd:element name="Feld" type="PersonExportFeldType" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportFeldType">
+ <xsd:annotation>
+ <xsd:documentation>Generiersche Name/Wert-Paare für Export</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Name" type="xsd:string"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonFelder.xsd
new file mode 100644
index 00000000..0a80e0de
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/PersonFelder.xsd
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Personendaten
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-06-26 tsch: GeburtsdatumBis hinzugefügt
+2005-08-30 tsch: OrdnungsZahlType hinzugefügt
+2004-01-15 tsch: SVNummer hinzugefügt
+2004-06-24 tsch: OrdnungsZahl, Titel hinzugefügt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:annotation>
+ <xsd:documentation>Personendaten-Felder</xsd:documentation>
+ </xsd:annotation>
+ <xsd:element name="ZMRZahl" type="ZMRZahlType"/>
+
+ <xsd:simpleType name="ZMRZahlType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{12}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="OrdnungsZahl" type="OrdnungsZahlType"/>
+
+ <xsd:simpleType name="OrdnungsZahlType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{12}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="SVNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{10}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Titel">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatZugezogen" type="StaatenNameType"/>
+ <xsd:element name="StaatVerzogen" type="StaatenNameType"/>
+
+ <xsd:element name="GeburtsdatumBis">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/SimpleTypes.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/SimpleTypes.xsd
new file mode 100644
index 00000000..fb02488d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/SimpleTypes.xsd
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SimpleTypes.xsd
+Zweck: Definiert allgemein nutzbare simple Datentypen
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+2010-08-25 teo: ZMR-339: ID 343 - USERID DB-Feld erweitern
+2006-05-03 tsch: KGNummerType hinzugefügt
+2004-10-27 tsch: BehoerdenschluesselType hinzugefügt
+2004-09-09 tsch: RegisterType hinzugefügt
+2004-09-08 tsch: BenutzerNameType hinzugefügt
+2004-08-17 tsch: GemeindeNrType hinzugefügt
+2004-06-18 tsch: GrundTextType hinzugefügt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:simpleType name="IntegerType">
+ <xsd:annotation>
+ <xsd:documentation>IntegerType: nicht negativer Integer mit Maximalwert 2^31-1 (Beschränkung durch Datenbank)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:nonNegativeInteger">
+ <xsd:maxExclusive value="2147483648"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DatumType">
+ <xsd:annotation>
+ <xsd:documentation>DatumType: Format richtet sich nach xsd:date, '00' bei Monat und Tag erlaubt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{4}[\-][0-9]{2}[\-][0-9]{2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+
+ <xsd:simpleType name="TimestampType">
+ <xsd:annotation>
+ <xsd:documentation>TimestampType: Format richtet sich nach xsd:dateTime, Angabe der Millisekunden ist Pflicht, Zeitzone nicht erlaubt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:pattern value="[0-9]{4}[\-][0-9]{2}[\-][0-9]{2}[T][0-9]{2}[:][0-9]{2}[:][0-9]{2}[.][0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="IDType">
+ <xsd:annotation>
+ <xsd:documentation>IDs</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:unsignedLong">
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ENTITYIDType">
+ <xsd:annotation>
+ <xsd:documentation>Entity-IDs (können auch alphanumerisch sein, z.B. alte edvzahlen)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="64"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="StaatenNameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="GrundCodeType">
+ <xsd:restriction base="xsd:string" >
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GrundTextType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GrundFreitextType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="228"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="BehoerdenNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BehoerdenschluesselType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{6}|C[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GemeindeNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="KGNummerType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="5"/>
+ <xsd:maxLength value="5"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GemeindenameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="KundenNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5,6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="OrgTypType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="OrgCodeType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BezugsfeldType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BenutzerType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BenutzerNameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="RegisterType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ZMR"/>
+ <xsd:enumeration value="EGR"/>
+ <xsd:enumeration value="LMR"/>
+ <xsd:enumeration value="ZPR"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/W3C-XMLDSig.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/W3C-XMLDSig.xsd
new file mode 100644
index 00000000..3745c774
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/W3C-XMLDSig.xsd
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
+ -->
+<!--<!DOCTYPE schema
+ [
+ <!ATTLIST schema
+ xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#"
+>
+ <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
+ <!ENTITY % p ''>
+ <!ENTITY % s ''>
+]> -->
+<!-- Schema for XML Signatures
+ http://www.w3.org/2000/09/xmldsig#
+ $Revision: 1.1 $ on $Date: 2002/11/11 16:24:27 $ by $Author: Linauer $
+
+ Copyright 2001 The Internet Society and W3C (Massachusetts Institute
+ of Technology, Institut National de Recherche en Informatique et en
+ Automatique, Keio University). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/
+
+ This document is governed by the W3C Software License [1] as described
+ in the FAQ [2].
+
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+<schema targetNamespace="http://www.w3.org/2000/09/xmldsig#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="0.1">
+ <!-- Basic Types Defined for Signatures -->
+ <!-- modified to ensure that whiteSpace is preserved
+<simpleType name="CryptoBinary">
+ <restriction base="base64Binary">
+ </restriction>
+</simpleType>
+ -->
+ <simpleType name="CryptoBinary">
+ <restriction base="string">
+ <whiteSpace value="preserve"/>
+ <pattern value="[A-Za-z0-9\+/=\n\r\t ]*"/>
+ </restriction>
+ </simpleType>
+ <!-- Start Signature -->
+ <element name="Signature" type="ds:SignatureType"/>
+ <complexType name="SignatureType">
+ <sequence>
+ <element ref="ds:SignedInfo"/>
+ <element ref="ds:SignatureValue"/>
+ <element ref="ds:KeyInfo" minOccurs="0"/>
+ <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureValue" type="ds:SignatureValueType"/>
+ <complexType name="SignatureValueType">
+ <simpleContent>
+ <extension base="ds:CryptoBinary">
+ <attribute name="Id" type="ID" use="optional"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ <!-- Start SignedInfo -->
+ <element name="SignedInfo" type="ds:SignedInfoType"/>
+ <complexType name="SignedInfoType">
+ <sequence>
+ <element ref="ds:CanonicalizationMethod"/>
+ <element ref="ds:SignatureMethod"/>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
+ <complexType name="CanonicalizationMethodType" mixed="true">
+ <sequence>
+ <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <element name="SignatureMethod" type="ds:SignatureMethodType"/>
+ <complexType name="SignatureMethodType" mixed="true">
+ <sequence>
+ <element name="HMACOutputLength" type="ds:HMACOutputLengthType" minOccurs="0"/>
+ <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) external namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <!-- Start Reference -->
+ <element name="Reference" type="ds:ReferenceType"/>
+ <complexType name="ReferenceType">
+ <sequence>
+ <element ref="ds:Transforms" minOccurs="0"/>
+ <element ref="ds:DigestMethod"/>
+ <element ref="ds:DigestValue"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="URI" type="anyURI" use="optional"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+ </complexType>
+ <element name="Transforms" type="ds:TransformsType"/>
+ <complexType name="TransformsType">
+ <sequence>
+ <element ref="ds:Transform" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+ <element name="Transform" type="ds:TransformType"/>
+ <complexType name="TransformType" mixed="true">
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <element name="XPath" type="string"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ </choice>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <!-- End Reference -->
+ <element name="DigestMethod" type="ds:DigestMethodType"/>
+ <complexType name="DigestMethodType" mixed="true">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <element name="DigestValue" type="ds:DigestValueType"/>
+ <simpleType name="DigestValueType">
+ <restriction base="ds:CryptoBinary"/>
+ </simpleType>
+ <!-- End SignedInfo -->
+ <!-- Start KeyInfo -->
+ <element name="KeyInfo" type="ds:KeyInfoType"/>
+ <complexType name="KeyInfoType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <element ref="ds:KeyName"/>
+ <element ref="ds:KeyValue"/>
+ <element ref="ds:RetrievalMethod"/>
+ <element ref="ds:X509Data"/>
+ <element ref="ds:PGPData"/>
+ <element ref="ds:SPKIData"/>
+ <element ref="ds:MgmtData"/>
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ </choice>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="KeyName" type="string"/>
+ <element name="MgmtData" type="string"/>
+ <element name="KeyValue" type="ds:KeyValueType"/>
+ <complexType name="KeyValueType" mixed="true">
+ <choice>
+ <element ref="ds:DSAKeyValue"/>
+ <element ref="ds:RSAKeyValue"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </complexType>
+ <element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
+ <complexType name="RetrievalMethodType">
+ <sequence>
+ <element name="Transforms" type="ds:TransformsType" minOccurs="0"/>
+ </sequence>
+ <attribute name="URI" type="anyURI"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+ </complexType>
+ <!-- Start X509Data -->
+ <element name="X509Data" type="ds:X509DataType"/>
+ <complexType name="X509DataType">
+ <sequence maxOccurs="unbounded">
+ <choice>
+ <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
+ <element name="X509SKI" type="ds:CryptoBinary"/>
+ <element name="X509SubjectName" type="string"/>
+ <element name="X509Certificate" type="ds:CryptoBinary"/>
+ <element name="X509CRL" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </sequence>
+ </complexType>
+ <complexType name="X509IssuerSerialType">
+ <sequence>
+ <element name="X509IssuerName" type="string"/>
+ <element name="X509SerialNumber" type="integer"/>
+ </sequence>
+ </complexType>
+ <!-- End X509Data -->
+ <!-- Begin PGPData -->
+ <element name="PGPData" type="ds:PGPDataType"/>
+ <complexType name="PGPDataType">
+ <choice>
+ <sequence>
+ <element name="PGPKeyID" type="ds:CryptoBinary"/>
+ <element name="PGPKeyPacket" type="ds:CryptoBinary" minOccurs="0"/>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <sequence>
+ <element name="PGPKeyPacket" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </choice>
+ </complexType>
+ <!-- End PGPData -->
+ <!-- Begin SPKIData -->
+ <element name="SPKIData" type="ds:SPKIDataType"/>
+ <complexType name="SPKIDataType">
+ <sequence maxOccurs="unbounded">
+ <element name="SPKISexp" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ <!-- End SPKIData -->
+ <!-- End KeyInfo -->
+ <!-- Start Object (Manifest, SignatureProperty) -->
+ <element name="Object" type="ds:ObjectType"/>
+ <complexType name="ObjectType" mixed="true">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##any" processContents="lax"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="MimeType" type="string" use="optional"/>
+ <attribute name="Encoding" type="anyURI" use="optional"/>
+ <!-- add a grep facet -->
+ </complexType>
+ <element name="Manifest" type="ds:ManifestType"/>
+ <complexType name="ManifestType">
+ <sequence>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
+ <complexType name="SignaturePropertiesType">
+ <sequence>
+ <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureProperty" type="ds:SignaturePropertyType"/>
+ <complexType name="SignaturePropertyType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (1,unbounded) namespaces -->
+ </choice>
+ <attribute name="Target" type="anyURI" use="required"/>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <!-- End Object (Manifest, SignatureProperty) -->
+ <!-- Start Algorithm Parameters -->
+ <simpleType name="HMACOutputLengthType">
+ <restriction base="integer"/>
+ </simpleType>
+ <!-- Start KeyValue Element-types -->
+ <element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
+ <complexType name="DSAKeyValueType">
+ <sequence>
+ <sequence minOccurs="0">
+ <element name="P" type="ds:CryptoBinary"/>
+ <element name="Q" type="ds:CryptoBinary"/>
+ </sequence>
+ <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
+ <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
+ <element name="Y" type="ds:CryptoBinary"/>
+ <sequence minOccurs="0">
+ <element name="Seed" type="ds:CryptoBinary"/>
+ <element name="PgenCounter" type="ds:CryptoBinary"/>
+ </sequence>
+ </sequence>
+ </complexType>
+ <element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
+ <complexType name="RSAKeyValueType">
+ <sequence>
+ <element name="Modulus" type="ds:CryptoBinary"/>
+ <element name="Exponent" type="ds:CryptoBinary"/>
+ </sequence>
+ </complexType>
+ <!-- End KeyValue Element-types -->
+ <!-- End Signature -->
+</schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Workflow.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Workflow.xsd
new file mode 100644
index 00000000..ce300b0e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/eingebunden/Workflow.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Workflow.xsd
+Zweck: Definiert Datentypen für die Geschäftsprozesssteuerung der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-08-02 tsch: Vorgang WorkflowsAuflisten hinzugefügt
+2004-06-29 tsch: Subprozess Struktur vereinfacht
+2004-06-14 tsch: ProzessAnzeigeenamen hinzugefügt
+2004-06-14 tsch: Optionale VerlassenerProzessInstanzID hinzugefügt
+2004-05-19 tsch: SequenceID hinzugefügt, Umbenennung Process->Prozess
+2004-05-17 tsch: Umbenennungen: Activity nach Vorgang, Workflowitems nach Subprozesse
+2004-05-04 tsch: ProcessID->ProcessName, ActivityID->ActivityName
+2003-12-12 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+
+ <xsd:element name="WorkflowInfoClient">
+ <xsd:annotation>
+ <xsd:documentation>Workflowinformationen des Clients</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ProzessName"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Wenn der Geschäftsprozess aus mehreren Vorgängen besteht,
+ müssen die ProzessinstanzID und SequenzID aus der letzten
+ Server-Response vom Client geschickt werden.
+ Beim ersten Vorgang eines neuen Geschäftsprozesses dürfen die beiden
+ Felder nicht geschickt werden.
+ Bei Beginn einen neuen Geschäftsprozesses SOLLTE die InstanzID des letztzen
+ Prozesses als VerlassenerProzessInstanzID mitgeschickt werden
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="ProzessInstanzID"/>
+ <xsd:element ref="VerlassenerProzessInstanzID" minOccurs="0"/>
+ <xsd:element ref="SequenzID"/>
+ </xsd:sequence>
+ <xsd:element ref="VorgangName"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WorkflowInfoServer">
+ <xsd:annotation>
+ <xsd:documentation>Workflowinformationen des Servers</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Der Prozessname dient zur technischen Identifikation des Prozesses, der ProzessAnzeigeName
+ kann zur Anzeige auf der Benutzeroberfläche verwendet werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="ProzessName"/>
+ <xsd:element ref="ProzessAnzeigeName" minOccurs="0"/>
+ <xsd:element ref="ProzessInstanzID"/>
+ <xsd:element ref="ProzessStatus"/>
+ <xsd:element ref="SequenzID"/>
+ <xsd:element ref="Subprozess" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="SubprozessType">
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Der VorgangName dient zur technischen Identifikation des Vorgangs, der VorgangAnzeigeName
+ kann zur Anzeige auf der Benutzeroberfläche verwendet werden.
+ Die Elemente VorgangRestriction und VorgangConditions werden in näherer Zukunft nicht implementiert
+ und können ignoriert werden (werden nicht befüllt).
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="VorgangName"/>
+ <xsd:element ref="VorgangAnzeigeName" minOccurs="0"/>
+ <xsd:element ref="VorgangStatus"/>
+ <xsd:element ref="VorgangRestriction" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="VorgangConditions" minOccurs="0"/>
+ <xsd:element name="Required" type="xsd:boolean"/>
+ <xsd:element name="Visible" type="xsd:boolean"/>
+ <xsd:element ref="Subprozess" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Subprozess" type="SubprozessType"/>
+
+ <xsd:element name="ProzessInstanzID" type="IDType"/>
+ <xsd:element name="VerlassenerProzessInstanzID" type="IDType"/>
+ <xsd:element name="SequenzID" type="IDType"/>
+
+ <xsd:element name="ProzessName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ProzessAnzeigeName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ProzessStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="O"/>
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="C"/>
+ <xsd:enumeration value="E"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangAnzeigeName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="O"/>
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="C"/>
+ <xsd:enumeration value="E"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangRestriction">
+ <xsd:annotation>
+ <xsd:documentation>regionale Restriktion, die fuer den Vorgang gilt (z.B. Gemeindenummer, fuer die Personen angemeldet werden duerfen.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="RestrictionType" type="xsd:string"/>
+ <xsd:element name="RestrictionValue" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="VorgangConditions">
+ <xsd:annotation>
+ <xsd:documentation>Liste von Bedingungen, unter denen das Item aktiv wird.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="SelectedItems" minOccurs="1" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>Liste von alternativen Voraussetzungen (ODER) für die Anwählbarkeit der Activity. Ein Eintrag repräsentiert eine Reihe von Objekten, die im Suchergebnis ausgewählt sein müssen (UND).</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="SelectedItem" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema>
+
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/Adresssuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/Adresssuche.xsd
new file mode 100644
index 00000000..4952ff44
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/Adresssuche.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Adresssuche.xsd
+Zweck: Definiert Datentypen für die Suche nach offiziellen STATA-Adressen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-11-20 mp: +Gebäudeeigenschaft, +Nutzungsart
+2005-06-15 pwag: CQ1370: Suchart ADRESSPRUEFUNG hinzugefügt
+2004-11-15 tsch: Detailgrad Gemeinde hinzugefügt
+2004-07-30 tsch: HauptIdentadresse->HauptIdent; Felder hinzu: Adressstatus, Adressschlüssel, HauptIdent, Hofname, Gebaeudeunterscheidung, GBDUntteil, InfoMeldewesen
+2004-07-08 tsch: Felder Adresszusatz, HauptIdentadresse hinzugefügt
+2004-06-24 tsch: GBRRefkey hinzugefügt
+2004-05-17 tsch: Organisation entfernt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="AdresssucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchdaten für die STATA - Adresssuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheInfo"/>
+ <xsd:element ref="Adressdaten"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten, sowie Suchergebnis oder Text-Meldung (falls nichts gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <!-- gibt an, ob Klaerungsadressen erlaubt sind oder nicht -->
+ <xsd:element name="inclKlaerungsadressen" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="Adresssuchergebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheInfo"/>
+ <xsd:element ref="Adressdaten"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheInfo" type="AdresssucheInfoType"/>
+ <xsd:complexType name="AdresssucheInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Adresssuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Suchart">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ADRESSSUCHE"/>
+ <xsd:enumeration value="IDENTEADRESSENSUCHE"/>
+ <xsd:enumeration value="ADRESSPRUEFUNG"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Adresssuchergebnis" type="AdresssuchergebnisType"/>
+ <xsd:complexType name="AdresssuchergebnisType">
+ <xsd:sequence>
+ <xsd:element name="Detailgrad">
+ <xsd:annotation>
+ <xsd:documentation>Gibt der Detailgrad der Adressen im Suchergebnis an</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Gemeinde"/>
+ <xsd:enumeration value="Ortschaft"/>
+ <xsd:enumeration value="Strassenname"/>
+ <xsd:enumeration value="Orientierungsnummer"/>
+ <xsd:enumeration value="Gebaeudeteil"/>
+ <xsd:enumeration value="Tuer"/>
+ <xsd:enumeration value="Gesamtadresse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der gefundenen Sätze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="Adressdaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Adressdaten">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="base:Adressstatus" minOccurs="0"/>
+ <xsd:element ref="base:Adressschluessel" minOccurs="0"/>
+ <xsd:element ref="base:HauptIdent" minOccurs="0"/>
+ <xsd:element ref="base:NameZuteil" minOccurs="0"/>
+ <xsd:element ref="base:Hofname" minOccurs="0"/>
+ <xsd:element ref="base:Gebaeudeunterscheidung" minOccurs="0"/>
+ <xsd:element ref="base:GBDUntteil" minOccurs="0"/>
+ <xsd:element ref="base:InfoMeldewesen" minOccurs="0"/>
+ <xsd:element ref="base:GbdEigenschaft" minOccurs="0"/>
+ <xsd:element ref="base:NtzArt" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/ZMRProxy.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/ZMRProxy.xsd
new file mode 100644
index 00000000..a29b2b92
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/addresssearching_client/xsd/zmr/ZMRProxy.xsd
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: ZMRProxy.xsd
+Zweck: Fasst alle ZMR-Vorgangs XSD-Files zusammen
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2011-09-05 teo: Änderungsdienst ZWR (PN126)
+2010-03-08 teo: Historische Meldungskorrektur
+2010-02-01 teo: MeldebestätigungenAnforderung hinzugefügt
+2009-08-24 mp: TechnischeAnsicht hinzugefügt
+2009-08-06 teo: Auskunftssperre ändern hinzugefügt
+2009-05-07 teo: Ummeldeserviceabfrage hinzugefügt
+2009-01-23 teo: GISSuche hinzugefügt
+2006-11-06 tsch: ORFGISAnforderung hinzugefügt
+2006-03-21 tsch: SZRSammelabfrage hinzugefügt
+2005-01-14 tsch: Aviso aktivieren entfernt, Gleichstzungtabelle Warten hinzugefügt
+2004-11-22 tsch: Gerichtskommissaerabfrage hinzugefügt
+2004-09-28 tsch: Wehrfplichtigenanfrage, ablaufende Auskunfssperren-Suche hinzugefügt
+2004-09-27 tsch: Storno/Korrektur hinzugefügt
+2004-09-09 tsch: SZR-Vorgänge sowie Person trennen/zusammenführen hinzugefügt
+2004-08-24 tsch: GISAdressabfrage hinzugefügt
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Adresssuche.xsd"/>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/ernp_client/openapi.json b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/ernp_client/openapi.json
new file mode 100644
index 00000000..9e09240f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/ernp_client/openapi.json
@@ -0,0 +1,1940 @@
+{
+ "openapi" : "3.0.1",
+ "info" : {
+ "title" : "ERNP",
+ "version" : "1.0.0"
+ },
+ "servers" : [ {
+ "url" : "https://stportal.bmi.intra.gv.at/at.gv.bmi.erpsrv-p/srv/rest/",
+ "description" : "Produktion",
+ "variables" : { }
+ }, {
+ "url" : "https://stportal.bmi.intra.gv.at/at.gv.bmi.erpsrv-e/srv/rest/",
+ "description" : "Entwicklung",
+ "variables" : { }
+ }, {
+ "url" : "https://stportal.bmi.intra.gv.at/at.gv.bmi.erpsrv-t/srv/rest/",
+ "description" : "Interne Test",
+ "variables" : { }
+ }, {
+ "url" : "https://stportal.bmi.intra.gv.at/at.gv.bmi.erpsrv-a/srv/rest/",
+ "description" : "Externe Test",
+ "variables" : { }
+ }, {
+ "url" : "https://stportal.bmi.intra.gv.at/at.gv.bmi.erpsrv-b/srv/rest/",
+ "description" : "Businespartner Test",
+ "variables" : { }
+ }, {
+ "url" : "http://localhost:29200/at.gv.bmi.erpv01-d/srv/rest/",
+ "description" : "Lokal",
+ "variables" : { }
+ }, {
+ "url" : "http://localhost:29200/at.gv.bmi.erpv01-e/srv/rest/",
+ "description" : "Entwicklung (kein Portal)",
+ "variables" : { }
+ }, {
+ "url" : "http://localhost:29200/at.gv.bmi.erpv01-t/srv/rest/",
+ "description" : "Interne Test (kein Portal)",
+ "variables" : { }
+ }, {
+ "url" : "http://localhost:29200/at.gv.bmi.erpv01-a/srv/rest/",
+ "description" : "Externe Test (kein Portal)",
+ "variables" : { }
+ }, {
+ "url" : "http://localhost:29200/at.gv.bmi.erpv11-a/srv/rest/",
+ "description" : "Businespartner Test (kein Portal)",
+ "variables" : { }
+ } ],
+ "paths" : {
+ "/eidas/person/aendern" : {
+ "post" : {
+ "operationId" : "aendern",
+ "parameters" : [ {
+ "name" : "Client-Request-Time",
+ "in" : "header",
+ "description" : "Client-Requestzeit im ISO-8601 Format mit optionaler Zeitzone (zb '2016-10-27T16:36:08.993')",
+ "schema" : {
+ "type" : "string",
+ "format" : "date-time"
+ }
+ }, {
+ "name" : "Client-Request-Id",
+ "in" : "header",
+ "description" : "Client-Request ID (um Systemübergreifende Fehlersuche zu vereinfache)",
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Behkz",
+ "in" : "header",
+ "description" : "Client-Behördenkennzeichen",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Name",
+ "in" : "header",
+ "description" : "Client-Name bzw Applikationskürzel und Version des aufrufenden Systems (zb 'ZMR 3.4.5')",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonAendern"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonAendern"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "default" : {
+ "description" : "Erfolgreicher Response hat Status 200 wenn Responsepayload vorhanden, sonst 204",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AendernResponse"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AendernResponse"
+ }
+ }
+ }
+ },
+ "4XX" : {
+ "description" : "Client Fehler (kann vom Client behoben werden)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ },
+ "5XX" : {
+ "description" : "Server Fehler (normalerweise nicht vom Client behebbar)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/eidas/person/anlegen" : {
+ "post" : {
+ "operationId" : "anlegen",
+ "parameters" : [ {
+ "name" : "Client-Request-Time",
+ "in" : "header",
+ "description" : "Client-Requestzeit im ISO-8601 Format mit optionaler Zeitzone (zb '2016-10-27T16:36:08.993')",
+ "schema" : {
+ "type" : "string",
+ "format" : "date-time"
+ }
+ }, {
+ "name" : "Client-Request-Id",
+ "in" : "header",
+ "description" : "Client-Request ID (um Systemübergreifende Fehlersuche zu vereinfache)",
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Behkz",
+ "in" : "header",
+ "description" : "Client-Behördenkennzeichen",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Name",
+ "in" : "header",
+ "description" : "Client-Name bzw Applikationskürzel und Version des aufrufenden Systems (zb 'ZMR 3.4.5')",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonAnlegen"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonAnlegen"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "default" : {
+ "description" : "Erfolgreicher Response hat Status 200 wenn Responsepayload vorhanden, sonst 204",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AnlegenResponse"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/AnlegenResponse"
+ }
+ }
+ }
+ },
+ "4XX" : {
+ "description" : "Client Fehler (kann vom Client behoben werden)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ },
+ "5XX" : {
+ "description" : "Server Fehler (normalerweise nicht vom Client behebbar)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "/eidas/person/suchen" : {
+ "post" : {
+ "operationId" : "suchen",
+ "parameters" : [ {
+ "name" : "Client-Request-Time",
+ "in" : "header",
+ "description" : "Client-Requestzeit im ISO-8601 Format mit optionaler Zeitzone (zb '2016-10-27T16:36:08.993')",
+ "schema" : {
+ "type" : "string",
+ "format" : "date-time"
+ }
+ }, {
+ "name" : "Client-Request-Id",
+ "in" : "header",
+ "description" : "Client-Request ID (um Systemübergreifende Fehlersuche zu vereinfache)",
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Behkz",
+ "in" : "header",
+ "description" : "Client-Behördenkennzeichen",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ }, {
+ "name" : "Client-Name",
+ "in" : "header",
+ "description" : "Client-Name bzw Applikationskürzel und Version des aufrufenden Systems (zb 'ZMR 3.4.5')",
+ "required" : true,
+ "schema" : {
+ "type" : "string"
+ }
+ } ],
+ "requestBody" : {
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonSuchen"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/PersonSuchen"
+ }
+ }
+ }
+ },
+ "responses" : {
+ "default" : {
+ "description" : "Erfolgreicher Response hat Status 200 wenn Responsepayload vorhanden, sonst 204",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SuchenResponse"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/SuchenResponse"
+ }
+ }
+ }
+ },
+ "4XX" : {
+ "description" : "Client Fehler (kann vom Client behoben werden)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ },
+ "5XX" : {
+ "description" : "Server Fehler (normalerweise nicht vom Client behebbar)",
+ "content" : {
+ "application/json" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ },
+ "application/xml" : {
+ "schema" : {
+ "$ref" : "#/components/schemas/Fault"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "components" : {
+ "schemas" : {
+ "Fault" : {
+ "required" : [ "message" ],
+ "type" : "object",
+ "properties" : {
+ "message" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Message"
+ }
+ },
+ "faultDetails" : {
+ "$ref" : "#/components/schemas/FaultDetails"
+ }
+ },
+ "xml" : {
+ "name" : "Fault"
+ }
+ },
+ "FaultDetails" : {
+ "required" : [ "fault" ],
+ "type" : "object",
+ "properties" : {
+ "faultNumber" : {
+ "type" : "integer",
+ "format" : "int32",
+ "xml" : {
+ "name" : "FaultNumber"
+ }
+ },
+ "fault" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Fault"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/FaultDetailsEntry"
+ }
+ }
+ }
+ },
+ "FaultDetailsEntry" : {
+ "type" : "object",
+ "properties" : {
+ "key" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "message" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "AendernResponse" : {
+ "required" : [ "person" ],
+ "type" : "object",
+ "properties" : {
+ "person" : {
+ "$ref" : "#/components/schemas/Person"
+ }
+ },
+ "xml" : {
+ "name" : "AendernResponse"
+ }
+ },
+ "AkademischerGrad" : {
+ "required" : [ "ebene", "kurzerName", "langerName", "stellung" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "ausgestelltVon" : {
+ "$ref" : "#/components/schemas/AusgestelltVon"
+ },
+ "ebene" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ebene"
+ },
+ "enum" : [ "0", "1", "2", "2/3", "3" ]
+ },
+ "stellung" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Stellung"
+ },
+ "enum" : [ "Vorangestellt", "Nachgestellt" ]
+ },
+ "langerName" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "LangerName"
+ }
+ },
+ "kurzerName" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "KurzerName"
+ }
+ }
+ }
+ },
+ "Anschrift" : {
+ "required" : [ "staat", "strasse", "type" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ },
+ "gemeinde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Gemeinde"
+ }
+ },
+ "strasse" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Strasse"
+ }
+ },
+ "postleitzahl" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postleitzahl"
+ }
+ },
+ "hausnummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Hausnummer"
+ }
+ },
+ "adresszusatz" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Adresszusatz"
+ }
+ },
+ "stiege" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Stiege"
+ }
+ },
+ "tuer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Tuer"
+ }
+ },
+ "kontaktinformationen" : {
+ "$ref" : "#/components/schemas/Kontaktinformationen"
+ },
+ "type" : {
+ "type" : "string"
+ }
+ },
+ "discriminator" : {
+ "propertyName" : "type"
+ }
+ },
+ "AnschriftInland" : {
+ "required" : [ "gemeinde", "hausnummer", "ort", "postleitzahl", "staat", "strasse" ],
+ "type" : "object",
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/Anschrift"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "adressstatus" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Adressstatus"
+ }
+ },
+ "ort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ort"
+ }
+ },
+ "ortZweisprachig" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "OrtZweisprachig"
+ }
+ },
+ "postort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postort"
+ }
+ },
+ "codes" : {
+ "$ref" : "#/components/schemas/Anschriftcodes"
+ },
+ "auskunftssperre" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Auskunftssperre"
+ }
+ },
+ "wohnsitzqualitaet" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Wohnsitzqualitaet"
+ },
+ "enum" : [ "H", "N", "O" ]
+ }
+ }
+ } ]
+ },
+ "AnschriftInlandAgs" : {
+ "required" : [ "gemeinde", "hausnummer", "ort", "postleitzahl", "staat", "strasse" ],
+ "type" : "object",
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/Anschrift"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "adressstatus" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Adressstatus"
+ }
+ },
+ "ort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ort"
+ }
+ },
+ "ortZweisprachig" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "OrtZweisprachig"
+ }
+ },
+ "postort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postort"
+ }
+ },
+ "codes" : {
+ "$ref" : "#/components/schemas/Anschriftcodes"
+ },
+ "auskunftssperre" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Auskunftssperre"
+ }
+ },
+ "wohnsitzqualitaet" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Wohnsitzqualitaet"
+ },
+ "enum" : [ "H", "N", "O" ]
+ },
+ "detailgrad" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Detailgrad"
+ }
+ },
+ "nutzungsartCode" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "NutzungsartCode"
+ }
+ },
+ "gebaeudeeigenschaft" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Gebaeudeeigenschaft"
+ }
+ }
+ }
+ } ]
+ },
+ "Anschriftcodes" : {
+ "type" : "object",
+ "properties" : {
+ "adresscode" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Adresscode",
+ "attribute" : true
+ }
+ },
+ "subcode" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Subcode",
+ "attribute" : true
+ }
+ },
+ "ortskennziffer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ortskennziffer",
+ "attribute" : true
+ }
+ },
+ "strassenkennziffer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Strassenkennziffer",
+ "attribute" : true
+ }
+ },
+ "objektnummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Objektnummer",
+ "attribute" : true
+ }
+ },
+ "nutzungseinheitlaufnummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Nutzungseinheitlaufnummer",
+ "attribute" : true
+ }
+ },
+ "adrRefkey" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "AdrRefkey",
+ "attribute" : true
+ }
+ },
+ "gbrRefkey" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "GbrRefkey",
+ "attribute" : true
+ }
+ },
+ "gemeindekennziffer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Gemeindekennziffer",
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "AusgestelltVon" : {
+ "required" : [ "behoerde", "datum", "staat" ],
+ "type" : "object",
+ "properties" : {
+ "datum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "Datum"
+ }
+ },
+ "behoerde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Behoerde"
+ }
+ },
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ }
+ }
+ },
+ "Benutzer" : {
+ "required" : [ "benutzer" ],
+ "type" : "object",
+ "properties" : {
+ "benutzer" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "behoerdenkennzeichen" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "Eidas" : {
+ "required" : [ "art", "staatscode2", "wert" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "art" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Art"
+ }
+ },
+ "wert" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Wert"
+ }
+ },
+ "ausstellDatum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "AusstellDatum"
+ }
+ },
+ "ablaufDatum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "AblaufDatum"
+ }
+ },
+ "ausstellBehoerde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "AusstellBehoerde"
+ }
+ },
+ "staatscode2" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Staatscode2"
+ }
+ }
+ }
+ },
+ "Kontaktinformationen" : {
+ "type" : "object",
+ "properties" : {
+ "firmenname1" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Firmenname1"
+ }
+ },
+ "firmenname2" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Firmenname2"
+ }
+ },
+ "ansprechpartner" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ansprechpartner"
+ }
+ },
+ "telefon" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Telefon"
+ }
+ },
+ "mobil" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Mobil"
+ }
+ },
+ "fax" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Fax"
+ }
+ },
+ "email" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Email"
+ }
+ },
+ "postfach" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postfach"
+ }
+ }
+ }
+ },
+ "LetzteOperation" : {
+ "required" : [ "begruendung", "durchgefuehrtVon" ],
+ "type" : "object",
+ "properties" : {
+ "begruendung" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Begruendung"
+ }
+ },
+ "durchgefuehrtVon" : {
+ "$ref" : "#/components/schemas/Benutzer"
+ },
+ "vorgang" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "zeitpunkt" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "PartialDate" : {
+ "required" : [ "jahr" ],
+ "type" : "object",
+ "properties" : {
+ "jahr" : {
+ "type" : "integer",
+ "format" : "int32",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "monat" : {
+ "type" : "integer",
+ "format" : "int32",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "tag" : {
+ "type" : "integer",
+ "format" : "int32",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "Person" : {
+ "required" : [ "letzteOperation", "personendaten", "type" ],
+ "type" : "object",
+ "properties" : {
+ "letzteOperation" : {
+ "$ref" : "#/components/schemas/LetzteOperation"
+ },
+ "personendaten" : {
+ "$ref" : "#/components/schemas/PersonendatenErgebnis"
+ },
+ "anschrift" : {
+ "$ref" : "#/components/schemas/Anschrift"
+ },
+ "akademischerGrad" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "AkademischerGrad"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/AkademischerGrad"
+ }
+ },
+ "reisedokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Reisedokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Reisedokument"
+ }
+ },
+ "sonstigesDokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "SonstigesDokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/SonstigesDokument"
+ }
+ },
+ "staatsangehoerigkeit" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Staatsangehoerigkeit"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Staatsangehoerigkeit"
+ }
+ },
+ "eidas" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Eidas"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Eidas"
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "version" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "type" : {
+ "type" : "string"
+ }
+ },
+ "discriminator" : {
+ "propertyName" : "type"
+ }
+ },
+ "PersonendatenErgebnis" : {
+ "required" : [ "basiszahl", "familienname", "geburtsdatum", "vorname" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "familienname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Familienname"
+ }
+ },
+ "nameVorEhe" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "NameVorEhe"
+ }
+ },
+ "vorname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Vorname"
+ }
+ },
+ "geburtsbundesland" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geburtsbundesland"
+ },
+ "enum" : [ "Burgenland", "Kärnten", "Niederösterreich", "Oberösterreich", "Salzburg", "Steiermark", "Tirol", "Vorarlberg", "Wien" ]
+ },
+ "geburtsort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geburtsort"
+ }
+ },
+ "geburtsstaat" : {
+ "$ref" : "#/components/schemas/Staat"
+ },
+ "geburtsdatum" : {
+ "$ref" : "#/components/schemas/PartialDate"
+ },
+ "geschlecht" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geschlecht"
+ },
+ "enum" : [ "Männlich", "Weiblich" ]
+ },
+ "basiszahl" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Basiszahl"
+ }
+ },
+ "kitquelle" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Kitquelle"
+ }
+ },
+ "bpkZp" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "BpkZp"
+ }
+ },
+ "sterbedatum" : {
+ "$ref" : "#/components/schemas/PartialDate"
+ },
+ "geprueft" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Geprueft"
+ }
+ }
+ }
+ },
+ "Reisedokument" : {
+ "required" : [ "art" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "ausgestelltVon" : {
+ "$ref" : "#/components/schemas/AusgestelltVon"
+ },
+ "art" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Art"
+ },
+ "enum" : [ "Asylwerber", "Dienstpass", "Elektronisch", "Fremdenpass", "Konventionspass", "Personalausweis", "Reisepass", "Staatenlos", "Sonstiges" ]
+ },
+ "nummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Nummer"
+ }
+ }
+ }
+ },
+ "SonstigesDokument" : {
+ "required" : [ "art", "nummer" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "ausgestelltVon" : {
+ "$ref" : "#/components/schemas/AusgestelltVon"
+ },
+ "art" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Art"
+ },
+ "enum" : [ "Führerschein", "Geburtsurkunde", "Heiratsurkunde", "Sonstiges", "Staatsbürgerschaftsnachweis", "Sterbeurkunde", "Todeserklärung" ]
+ },
+ "lichtbildausweis" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Lichtbildausweis"
+ }
+ },
+ "nummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Nummer"
+ }
+ },
+ "name" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Name"
+ }
+ }
+ }
+ },
+ "Staat" : {
+ "type" : "object",
+ "properties" : {
+ "isoCode3" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "name" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ }
+ },
+ "Staatsangehoerigkeit" : {
+ "required" : [ "staat" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ }
+ }
+ },
+ "ZmrPerson" : {
+ "required" : [ "letzteOperation", "personendaten", "qkz" ],
+ "type" : "object",
+ "allOf" : [ {
+ "$ref" : "#/components/schemas/Person"
+ }, {
+ "type" : "object",
+ "properties" : {
+ "auskunftssperre" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Auskunftssperre"
+ }
+ },
+ "qkz" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Qkz"
+ },
+ "items" : {
+ "type" : "string"
+ }
+ }
+ }
+ } ]
+ },
+ "Aendern" : {
+ "type" : "object",
+ "properties" : {
+ "personendaten" : {
+ "$ref" : "#/components/schemas/Personendaten"
+ },
+ "anschrift" : {
+ "$ref" : "#/components/schemas/Anschrift"
+ },
+ "akademischerGrad" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "AkademischerGrad"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/AkademischerGrad"
+ }
+ },
+ "reisedokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Reisedokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Reisedokument"
+ }
+ },
+ "sonstigesDokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "SonstigesDokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/SonstigesDokument"
+ }
+ },
+ "staatsangehoerigkeit" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Staatsangehoerigkeit"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Staatsangehoerigkeit"
+ }
+ },
+ "eidas" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Eidas"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Eidas"
+ }
+ }
+ }
+ },
+ "Anlegen" : {
+ "type" : "object",
+ "properties" : {
+ "anschrift" : {
+ "$ref" : "#/components/schemas/Anschrift"
+ },
+ "akademischerGrad" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "AkademischerGrad"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/AkademischerGrad"
+ }
+ },
+ "reisedokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Reisedokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Reisedokument"
+ }
+ },
+ "sonstigesDokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "SonstigesDokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/SonstigesDokument"
+ }
+ },
+ "staatsangehoerigkeit" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Staatsangehoerigkeit"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Staatsangehoerigkeit"
+ }
+ },
+ "eidas" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Eidas"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Eidas"
+ }
+ }
+ }
+ },
+ "Beenden" : {
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "EntityId"
+ },
+ "items" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "EntityId"
+ }
+ }
+ }
+ }
+ },
+ "PersonAendern" : {
+ "required" : [ "begruendung", "entityId", "version" ],
+ "type" : "object",
+ "properties" : {
+ "begruendung" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Begruendung"
+ }
+ },
+ "anlegen" : {
+ "$ref" : "#/components/schemas/Anlegen"
+ },
+ "aendern" : {
+ "$ref" : "#/components/schemas/Aendern"
+ },
+ "beenden" : {
+ "$ref" : "#/components/schemas/Beenden"
+ },
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "version" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ }
+ },
+ "xml" : {
+ "name" : "PersonAendern"
+ }
+ },
+ "Personendaten" : {
+ "required" : [ "familienname", "geburtsdatum", "vorname" ],
+ "type" : "object",
+ "properties" : {
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigAb" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "gueltigBis" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "attribute" : true
+ }
+ },
+ "familienname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Familienname"
+ }
+ },
+ "nameVorEhe" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "NameVorEhe"
+ }
+ },
+ "vorname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Vorname"
+ }
+ },
+ "geburtsbundesland" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geburtsbundesland"
+ },
+ "enum" : [ "Burgenland", "Kärnten", "Niederösterreich", "Oberösterreich", "Salzburg", "Steiermark", "Tirol", "Vorarlberg", "Wien" ]
+ },
+ "geburtsort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geburtsort"
+ }
+ },
+ "geburtsstaat" : {
+ "$ref" : "#/components/schemas/Staat"
+ },
+ "geburtsdatum" : {
+ "$ref" : "#/components/schemas/PartialDate"
+ },
+ "geschlecht" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geschlecht"
+ },
+ "enum" : [ "Männlich", "Weiblich" ]
+ }
+ }
+ },
+ "AnlegenResponse" : {
+ "required" : [ "person" ],
+ "type" : "object",
+ "properties" : {
+ "person" : {
+ "$ref" : "#/components/schemas/Person"
+ }
+ },
+ "xml" : {
+ "name" : "AnlegenResponse"
+ }
+ },
+ "PersonAnlegen" : {
+ "required" : [ "anschrift", "begruendung", "personendaten" ],
+ "type" : "object",
+ "properties" : {
+ "begruendung" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Begruendung"
+ }
+ },
+ "personendaten" : {
+ "$ref" : "#/components/schemas/Personendaten"
+ },
+ "anschrift" : {
+ "$ref" : "#/components/schemas/Anschrift"
+ },
+ "akademischerGrad" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "AkademischerGrad"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/AkademischerGrad"
+ }
+ },
+ "reisedokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Reisedokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Reisedokument"
+ }
+ },
+ "sonstigesDokument" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "SonstigesDokument"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/SonstigesDokument"
+ }
+ },
+ "staatsangehoerigkeit" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Staatsangehoerigkeit"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Staatsangehoerigkeit"
+ }
+ },
+ "eidas" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Eidas"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Eidas"
+ }
+ }
+ },
+ "xml" : {
+ "name" : "PersonAnlegen"
+ }
+ },
+ "SuchenResponse" : {
+ "type" : "object",
+ "properties" : {
+ "person" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Person"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/Person"
+ }
+ }
+ },
+ "xml" : {
+ "name" : "SuchenResponse"
+ }
+ },
+ "PersonSuchen" : {
+ "required" : [ "begruendung", "suchdaten", "suchoptionen" ],
+ "type" : "object",
+ "properties" : {
+ "begruendung" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Begruendung"
+ }
+ },
+ "suchoptionen" : {
+ "$ref" : "#/components/schemas/Suchoptionen"
+ },
+ "suchdaten" : {
+ "$ref" : "#/components/schemas/Suchdaten"
+ }
+ },
+ "xml" : {
+ "name" : "PersonSuchen"
+ }
+ },
+ "SuchAnschrift" : {
+ "type" : "object",
+ "properties" : {
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ },
+ "gemeinde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Gemeinde"
+ }
+ },
+ "strasse" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Strasse"
+ }
+ },
+ "ort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Ort"
+ }
+ },
+ "postleitzahl" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postleitzahl"
+ }
+ },
+ "hausnummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Hausnummer"
+ }
+ },
+ "adresszusatz" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Adresszusatz"
+ }
+ },
+ "stiege" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Stiege"
+ }
+ },
+ "tuer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Tuer"
+ }
+ },
+ "postfach" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Postfach"
+ }
+ }
+ }
+ },
+ "SuchAusgestelltVon" : {
+ "type" : "object",
+ "properties" : {
+ "datum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "Datum"
+ }
+ },
+ "behoerde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Behoerde"
+ }
+ },
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ }
+ }
+ },
+ "SuchEidas" : {
+ "type" : "object",
+ "properties" : {
+ "art" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Art"
+ }
+ },
+ "wert" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Wert"
+ }
+ },
+ "ausstellDatum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "AusstellDatum"
+ }
+ },
+ "ablaufDatum" : {
+ "type" : "string",
+ "format" : "date-time",
+ "xml" : {
+ "name" : "AblaufDatum"
+ }
+ },
+ "ausstellBehoerde" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "AusstellBehoerde"
+ }
+ },
+ "staatscode2" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Staatscode2"
+ }
+ }
+ }
+ },
+ "SuchReisedokument" : {
+ "type" : "object",
+ "properties" : {
+ "art" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Art"
+ },
+ "enum" : [ "Asylwerber", "Dienstpass", "Elektronisch", "Fremdenpass", "Konventionspass", "Personalausweis", "Reisepass", "Staatenlos", "Sonstiges" ]
+ },
+ "ausgestelltVon" : {
+ "$ref" : "#/components/schemas/SuchAusgestelltVon"
+ },
+ "nummer" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Nummer"
+ }
+ }
+ }
+ },
+ "SuchStaatsangehoerigkeit" : {
+ "type" : "object",
+ "properties" : {
+ "staat" : {
+ "$ref" : "#/components/schemas/Staat"
+ }
+ }
+ },
+ "Suchdaten" : {
+ "required" : [ "familienname", "vorname" ],
+ "type" : "object",
+ "properties" : {
+ "basiszahl" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Basiszahl"
+ }
+ },
+ "bpkZp" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "BpkZp"
+ }
+ },
+ "fremdBpkBmiZp" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "FremdBpkBmiZp"
+ }
+ },
+ "entityId" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "EntityId"
+ }
+ },
+ "familienname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Familienname"
+ }
+ },
+ "nameVorEhe" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "NameVorEhe"
+ }
+ },
+ "vorname" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Vorname"
+ }
+ },
+ "geburtsdatum" : {
+ "$ref" : "#/components/schemas/PartialDate"
+ },
+ "geburtsort" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geburtsort"
+ }
+ },
+ "geburtsstaat" : {
+ "$ref" : "#/components/schemas/Staat"
+ },
+ "geschlecht" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Geschlecht"
+ },
+ "enum" : [ "Männlich", "Weiblich" ]
+ },
+ "anschrift" : {
+ "$ref" : "#/components/schemas/SuchAnschrift"
+ },
+ "reisedokument" : {
+ "$ref" : "#/components/schemas/SuchReisedokument"
+ },
+ "staatsangehoerigkeit" : {
+ "$ref" : "#/components/schemas/SuchStaatsangehoerigkeit"
+ },
+ "eidas" : {
+ "type" : "array",
+ "xml" : {
+ "name" : "Eidas"
+ },
+ "items" : {
+ "$ref" : "#/components/schemas/SuchEidas"
+ }
+ }
+ }
+ },
+ "Suchoptionen" : {
+ "required" : [ "historisch" ],
+ "type" : "object",
+ "properties" : {
+ "historisch" : {
+ "type" : "string",
+ "xml" : {
+ "name" : "Historisch"
+ },
+ "enum" : [ "Aktuell", "AktuellDannHistorisch", "AktuellUndHistorisch" ]
+ },
+ "formalisiert" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Formalisiert"
+ }
+ },
+ "sucheMitNamensteilen" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "SucheMitNamensteilen"
+ }
+ },
+ "suchwizard" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Suchwizard"
+ }
+ },
+ "zmr" : {
+ "type" : "boolean",
+ "xml" : {
+ "name" : "Zmr"
+ }
+ }
+ },
+ "xml" : {
+ "name" : "Suchoptionen",
+ "namespace" : "http://bmi.gv.at/ernp"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.1.WSDL b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.1.WSDL
new file mode 100644
index 00000000..3c34458d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.1.WSDL
@@ -0,0 +1,939 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions targetNamespace="urn:SZRServices" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:szr="urn:SZRServices" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://reference.e-government.gv.at/namespace/persondata/20020228#">
+ <xs:complexType name="PhysicalPersonType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Identification" type="pd:IdentificationType" />
+ <xs:element minOccurs="1" name="Name" type="pd:PersonNameType" />
+ <xs:element minOccurs="0" name="AlternativeName" type="pd:AlternativeNameType" />
+ <xs:element minOccurs="0" name="Sex" type="xs:string" />
+ <xs:element minOccurs="0" name="DateOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="PlaceOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="CountryOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="Nationality" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="IdentificationType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Value" type="xs:string" />
+ <xs:element minOccurs="0" name="Type" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PersonNameType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PrefixedDegree" type="xs:string" />
+ <xs:element name="GivenName" type="xs:string" nillable="true" />
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="SuffixedDegree" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AlternativeNameType">
+ <xs:sequence>
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PostalAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PostalCode" type="xs:string" />
+ <xs:element minOccurs="0" name="Municipality" type="xs:string" />
+ <xs:element minOccurs="0" name="Locality" type="xs:string" />
+ <xs:element minOccurs="0" name="StateCode3" type="xs:string" />
+ <xs:element minOccurs="0" name="DeliveryAddress" type="pd:DeliveryAddressType" />
+ <xs:element minOccurs="0" name="HistoricRecord" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DeliveryAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="AddressLine" type="xs:string" />
+ <xs:element minOccurs="0" name="StreetName" type="xs:string" />
+ <xs:element minOccurs="0" name="BuildingNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="Unit" type="xs:string" />
+ <xs:element minOccurs="0" name="DoorNumber" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/04/xmldsig-more#">
+ <xs:element name="ECDSAKeyValue" type="ecdsa:ECDSAKeyValueType" nillable="true" />
+ <xs:complexType name="ECDSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DomainParameters" type="ecdsa:DomainParamsType" />
+ <xs:element name="PublicKey" type="ecdsa:ECPointType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DomainParamsType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="NamedCurve" type="ecdsa:NamedCurveType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="NamedCurveType">
+ <xs:attribute name="URN" type="xs:string" use="required" />
+ </xs:complexType>
+ <xs:complexType name="ECPointType">
+ <xs:sequence minOccurs="0">
+ <xs:element name="X" type="ecdsa:PrimeFieldElemType" />
+ <xs:element name="Y" type="ecdsa:PrimeFieldElemType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PrimeFieldElemType">
+ <xs:attribute name="Value" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2001/XMLSchema">
+ <xs:import namespace="http://www.w3.org/2001/04/xmldsig-more#" />
+ <xs:complexType name="KeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DSAKeyValue" type="dsig:DSAKeyValueType" />
+ <xs:element minOccurs="0" name="RSAKeyValue" type="dsig:RSAKeyValueType" />
+ <xs:element minOccurs="0" ref="ecdsa:ECDSAKeyValue" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="P" type="xs:string" />
+ <xs:element minOccurs="0" name="Q" type="xs:string" />
+ <xs:element minOccurs="0" name="J" type="xs:string" />
+ <xs:element minOccurs="0" name="G" type="xs:string" />
+ <xs:element minOccurs="0" name="Y" type="xs:string" />
+ <!-- https://www.w3.org/TR/xmldsig-core/ defines PgenCounter THEN Seed, SZR.wsdl used Seed BEFORE PgenCounter. To keep it backwards compatible but allow the usual order, both ways are allowed. -->
+ <xs:choice maxOccurs="unbounded">
+ <xs:element minOccurs="0" name="PgenCounter" type="xs:string" />
+ <xs:element minOccurs="0" name="Seed" type="xs:string" />
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Modulus" type="xs:string" />
+ <xs:element minOccurs="0" name="Exponent" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="urn:SZRServices">
+ <xs:import namespace="http://reference.e-government.gv.at/namespace/persondata/20020228#" />
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" />
+ <xs:element name="SZRException" type="szr:SZRException" />
+ <xs:complexType name="SZRException" />
+ <xs:complexType name="PersonInfoType">
+ <xs:sequence>
+ <xs:element name="Person" type="pd:PhysicalPersonType" />
+ <xs:element minOccurs="0" name="RegularDomicile" type="pd:PostalAddressType" />
+ <xs:element minOccurs="0" name="AddressCodes" type="szr:AddressCodesType" />
+ <xs:element minOccurs="0" name="TravelDocument" type="szr:TravelDocumentType" />
+ <xs:element minOccurs="0" name="DateOfBirthWildcard" type="xs:boolean" />
+ <xs:element minOccurs="0" name="AuskunftssperreGesetzt" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TravelDocumentType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DocumentNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="DocumentType" type="xs:string" />
+ <xs:element minOccurs="0" name="IssueDate" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingAuthority" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingCountry" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AddressCodesType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="OKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="SKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="ADRCD" type="xs:string" />
+ <xs:element minOccurs="0" name="SUBCD" type="xs:string" />
+ <xs:element minOccurs="0" name="OBJNR" type="xs:string" />
+ <xs:element minOccurs="0" name="NTZLNR" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="TransformBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="InputBPK" type="xs:string" />
+ <xs:element name="InputBereichsKennung" type="xs:string" />
+ <xs:element name="Begruendung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TransformBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="TransformBPKReturn" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermission">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="ParticipantId" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermissionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetVKZPermissionReturn" type="szr:GetVKZPermissionResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="IdentityLinkType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Assertion" type="xs:anyType" />
+ <xs:element minOccurs="0" name="AdditionalInfo" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ResultRecord">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Register" type="xs:string" />
+ <xs:element name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="NoInsert" />
+ <xs:enumeration value="InsertOnNoMatch" />
+ <xs:enumeration value="ForceInsert" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element minOccurs="0" name="Suchwizard" type="xs:boolean" />
+ <xs:element name="VKZ" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiResponseType">
+ <xs:complexContent>
+ <xs:extension base="szr:GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element name="FoundWithSuchwizard" type="xs:boolean" />
+ <xs:element name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" default="false" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:ResultRecord" />
+ <xs:element name="InsertERnPResult" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedRequestType">
+ <xs:sequence>
+ <xs:element minOccurs="1" name="StammzahlEncrypted" type="xs:string" />
+ <xs:element minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" maxOccurs="unbounded" name="KeyValue" type="dsig:KeyValueType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkEidas">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkEidasResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="ListMultiplePersons" type="xs:boolean" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GetBPKReturn" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element maxOccurs="5" minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKs">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKsResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:GetBPKsResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="GetBPKsResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element minOccurs="0" name="Fault">
+ <xs:complexType>
+ <xs:attribute name="Code" type="xs:string" />
+ <xs:attribute name="String" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetBPKKombi">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiRequest" type="szr:GetBPKKombiRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKKombiResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiResponse" type="szr:GetBPKKombiResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPV">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVRequest" type="szr:GetBPKZPVRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPVResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVResponse" type="szr:GetBPKZPVResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedRequest" type="szr:GetBPKFromStammzahlEncryptedRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse" type="szr:GetBPKFromStammzahlEncryptedResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="IdentityLink" type="szr:IdentityLinkType" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ValidateIdentityLinkReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="BPKzuBasiszahlReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="FremdBPKRequestType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FremdBPKType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="FremdBPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetVKZPermissionResponseType">
+ <xs:sequence>
+ <xs:element name="isAllowed" type="xs:boolean" />
+ <xs:element minOccurs="0" name="behSchluessel" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="BasiszahlZuBPKReturnType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="BasiszahlZuBPKReturn" type="szr:BasiszahlZuBPKReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ZMRAnwendungsIntegration">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ <xs:element maxOccurs="unbounded" name="ZMRfremdbPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="ZMRAnwendungsIntegrationReturnType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="ZMRAnwendungsIntegrationResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ZMRAnwendungsIntegrationReturn" type="szr:ZMRAnwendungsIntegrationReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVersion" nillable="true" />
+ <xs:element name="GetVersionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Version" type="xs:string" />
+ <xs:element name="Revision" type="xs:string" />
+ <xs:element name="Time" type="xs:string" />
+ <xs:element name="IdentityLinkNotAfter" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ <xs:schema targetNamespace="http://egov.gv.at/pvp1.xsd">
+ <xs:include schemaLocation="pvp1.xsd" />
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext">
+ <xs:element name="Security">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- add the pvpToken here. You can also uncomment the following line if you support XSD 1.1 -->
+ <!-- <xs:element ref="pvp:pvpToken" /> -->
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute processContents="lax" />
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ </types>
+ <message name="Header">
+ <part name="SecurityHeader" element="wsse:Security" />
+ </message>
+ <message name="GetIdentityLinkRequest">
+ <part element="szr:GetIdentityLink" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkResponse">
+ <part element="szr:GetIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkEidasRequest">
+ <part element="szr:GetIdentityLinkEidas" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkEidasResponse">
+ <part element="szr:GetIdentityLinkEidasResponse" name="parameters" />
+ </message>
+ <message name="GetBPKRequest">
+ <part element="szr:GetBPK" name="parameters" />
+ </message>
+ <message name="GetBPKResponse">
+ <part element="szr:GetBPKResponse" name="parameters" />
+ </message>
+ <message name="GetBPKsRequest">
+ <part element="szr:GetBPKs" name="parameters" />
+ </message>
+ <message name="GetBPKsResponse">
+ <part element="szr:GetBPKsResponse" name="parameters" />
+ </message>
+ <message name="GetBPKKombiRequest">
+ <part element="szr:GetBPKKombi" name="parameters" />
+ </message>
+ <message name="GetBPKKombiResponse">
+ <part element="szr:GetBPKKombiResponse" name="parameters" />
+ </message>
+ <message name="GetBPKZPVRequest">
+ <part element="szr:GetBPKZPV" name="parameters" />
+ </message>
+ <message name="GetBPKZPVResponse">
+ <part element="szr:GetBPKZPVResponse" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedRequest">
+ <part element="szr:GetBPKFromStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedResponse">
+ <part element="szr:GetBPKFromStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlRequest">
+ <part element="szr:BPKzuBasiszahl" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlResponse">
+ <part element="szr:BPKzuBasiszahlResponse" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKRequest">
+ <part element="szr:BasiszahlZuBPK" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKResponse">
+ <part element="szr:BasiszahlZuBPKResponse" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkRequest">
+ <part element="szr:ValidateIdentityLink" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkResponse">
+ <part element="szr:ValidateIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="TransformBPKRequest">
+ <part element="szr:TransformBPK" name="parameters" />
+ </message>
+ <message name="TransformBPKResponse">
+ <part element="szr:TransformBPKResponse" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionRequest">
+ <part element="szr:GetVKZPermission" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionResponse">
+ <part element="szr:GetVKZPermissionResponse" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationRequest">
+ <part element="szr:ZMRAnwendungsIntegration" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationResponse">
+ <part element="szr:ZMRAnwendungsIntegrationResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlRequest">
+ <part element="szr:GetStammzahl" name="parameters" />
+ </message>
+ <message name="GetStammzahlResponse">
+ <part element="szr:GetStammzahlResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedRequest">
+ <part element="szr:GetStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedResponse">
+ <part element="szr:GetStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="GetVersionRequest">
+ <part element="szr:GetVersion" name="parameters" />
+ </message>
+ <message name="GetVersionResponse">
+ <part element="szr:GetVersionResponse" name="parameters" />
+ </message>
+ <message name="SZRException">
+ <part element="szr:SZRException" name="fault" />
+ </message>
+ <portType name="SZR">
+ <operation name="GetIdentityLink">
+ <input message="szr:GetIdentityLinkRequest" name="GetIdentityLinkRequest" />
+ <output message="szr:GetIdentityLinkResponse" name="GetIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetIdentityLinkEidas">
+ <input message="szr:GetIdentityLinkEidasRequest" name="GetIdentityLinkEidasRequest" />
+ <output message="szr:GetIdentityLinkEidasResponse" name="GetIdentityLinkEidasResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPK">
+ <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
+ <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
+ </jaxws:bindings>
+ <input message="szr:GetBPKRequest" name="GetBPKRequest" />
+ <output message="szr:GetBPKResponse" name="GetBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKs">
+ <input message="szr:GetBPKsRequest" name="GetBPKsRequest" />
+ <output message="szr:GetBPKsResponse" name="GetBPKsResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKKombi">
+ <input message="szr:GetBPKKombiRequest" name="GetBPKKombiRequest" />
+ <output message="szr:GetBPKKombiResponse" name="GetBPKKombiResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKZPV">
+ <input message="szr:GetBPKZPVRequest" name="GetBPKZPVRequest" />
+ <output message="szr:GetBPKZPVResponse" name="GetBPKZPVResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <input message="szr:GetBPKFromStammzahlEncryptedRequest" name="GetBPKFromStammzahlEncryptedRequest" />
+ <output message="szr:GetBPKFromStammzahlEncryptedResponse" name="GetBPKFromStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <input message="szr:ValidateIdentityLinkRequest" name="ValidateIdentityLinkRequest" />
+ <output message="szr:ValidateIdentityLinkResponse" name="ValidateIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="TransformBPK">
+ <input message="szr:TransformBPKRequest" name="TransformBPKRequest" />
+ <output message="szr:TransformBPKResponse" name="TransformBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVKZPermission">
+ <input message="szr:GetVKZPermissionRequest" name="GetVKZPermissionRequest" />
+ <output message="szr:GetVKZPermissionResponse" name="GetVKZPermissionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <input message="szr:BPKzuBasiszahlRequest" name="BPKzuBasiszahlRequest" />
+ <output message="szr:BPKzuBasiszahlResponse" name="BPKzuBasiszahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <input message="szr:BasiszahlZuBPKRequest" name="BasiszahlZuBPKRequest" />
+ <output message="szr:BasiszahlZuBPKResponse" name="BasiszahlZuBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <input message="szr:ZMRAnwendungsIntegrationRequest" name="ZMRAnwendungsIntegrationRequest" />
+ <output message="szr:ZMRAnwendungsIntegrationResponse" name="ZMRAnwendungsIntegrationResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahl">
+ <input message="szr:GetStammzahlRequest" name="GetStammzahlRequest" />
+ <output message="szr:GetStammzahlResponse" name="GetStammzahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <input message="szr:GetStammzahlEncryptedRequest" name="GetStammzahlEncryptedRequest" />
+ <output message="szr:GetStammzahlEncryptedResponse" name="GetStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVersion">
+ <input message="szr:GetVersionRequest" name="GetVersionRequest" />
+ <output message="szr:GetVersionResponse" name="GetVersionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ </portType>
+ <binding name="SZRSoapBinding" type="szr:SZR">
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+ <operation name="GetIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetIdentityLinkEidas">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetIdentityLinkEidasRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetIdentityLinkEidasResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKs">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKsRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKsResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKKombi">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKKombiRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKKombiResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKZPV">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKZPVRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKZPVResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKFromStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKFromStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVKZPermission">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVKZPermissionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVKZPermissionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ValidateIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ValidateIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="TransformBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="TransformBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="TransformBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BPKzuBasiszahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BPKzuBasiszahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BasiszahlZuBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BasiszahlZuBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ZMRAnwendungsIntegrationRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ZMRAnwendungsIntegrationResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVersion">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVersionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVersionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ </binding>
+ <service name="SZRService">
+ <port binding="szr:SZRSoapBinding" name="SZRBusinesspartnerTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/at.gv.bmi.szrsrv-b/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services-T/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRProduktionsumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services/services/SZR" />
+ </port>
+ </service>
+</definitions> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.WSDL b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.WSDL
new file mode 100644
index 00000000..4ad2645a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR-1.WSDL
@@ -0,0 +1,901 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions targetNamespace="urn:SZRServices" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:szr="urn:SZRServices" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://reference.e-government.gv.at/namespace/persondata/20020228#">
+ <xs:complexType name="PhysicalPersonType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Identification" type="pd:IdentificationType" />
+ <xs:element minOccurs="1" name="Name" type="pd:PersonNameType" />
+ <xs:element minOccurs="0" name="AlternativeName" type="pd:AlternativeNameType" />
+ <xs:element minOccurs="0" name="Sex" type="xs:string" />
+ <xs:element minOccurs="0" name="DateOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="PlaceOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="CountryOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="Nationality" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="IdentificationType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Value" type="xs:string" />
+ <xs:element minOccurs="0" name="Type" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PersonNameType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PrefixedDegree" type="xs:string" />
+ <xs:element name="GivenName" type="xs:string" nillable="true" />
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="SuffixedDegree" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AlternativeNameType">
+ <xs:sequence>
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PostalAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PostalCode" type="xs:string" />
+ <xs:element minOccurs="0" name="Municipality" type="xs:string" />
+ <xs:element minOccurs="0" name="Locality" type="xs:string" />
+ <xs:element minOccurs="0" name="StateCode3" type="xs:string" />
+ <xs:element minOccurs="0" name="DeliveryAddress" type="pd:DeliveryAddressType" />
+ <xs:element minOccurs="0" name="HistoricRecord" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DeliveryAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="AddressLine" type="xs:string" />
+ <xs:element minOccurs="0" name="StreetName" type="xs:string" />
+ <xs:element minOccurs="0" name="BuildingNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="Unit" type="xs:string" />
+ <xs:element minOccurs="0" name="DoorNumber" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2001/04/xmldsig-more#">
+ <xs:element name="ECDSAKeyValue" type="ecdsa:ECDSAKeyValueType" nillable="true" />
+ <xs:complexType name="ECDSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DomainParameters" type="ecdsa:DomainParamsType" />
+ <xs:element name="PublicKey" type="ecdsa:ECPointType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DomainParamsType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="NamedCurve" type="ecdsa:NamedCurveType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="NamedCurveType">
+ <xs:attribute name="URN" type="xs:string" use="required" />
+ </xs:complexType>
+ <xs:complexType name="ECPointType">
+ <xs:sequence minOccurs="0">
+ <xs:element name="X" type="ecdsa:PrimeFieldElemType" />
+ <xs:element name="Y" type="ecdsa:PrimeFieldElemType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PrimeFieldElemType">
+ <xs:attribute name="Value" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2001/XMLSchema">
+ <xs:import namespace="http://www.w3.org/2001/04/xmldsig-more#" />
+ <xs:complexType name="KeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DSAKeyValue" type="dsig:DSAKeyValueType" />
+ <xs:element minOccurs="0" name="RSAKeyValue" type="dsig:RSAKeyValueType" />
+ <xs:element minOccurs="0" ref="ecdsa:ECDSAKeyValue" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="P" type="xs:string" />
+ <xs:element minOccurs="0" name="Q" type="xs:string" />
+ <xs:element minOccurs="0" name="J" type="xs:string" />
+ <xs:element minOccurs="0" name="G" type="xs:string" />
+ <xs:element minOccurs="0" name="Y" type="xs:string" />
+ <!-- https://www.w3.org/TR/xmldsig-core/ defines PgenCounter THEN Seed, SZR.wsdl used Seed BEFORE PgenCounter. To keep it backwards compatible but allow the usual order, both ways are allowed. -->
+ <xs:choice maxOccurs="unbounded">
+ <xs:element minOccurs="0" name="PgenCounter" type="xs:string" />
+ <xs:element minOccurs="0" name="Seed" type="xs:string" />
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RSAKeyValueType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Modulus" type="xs:string" />
+ <xs:element minOccurs="0" name="Exponent" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="urn:SZRServices">
+ <xs:import namespace="http://reference.e-government.gv.at/namespace/persondata/20020228#" />
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" />
+ <xs:element name="SZRException" type="szr:SZRException" />
+ <xs:complexType name="SZRException" />
+ <xs:complexType name="PersonInfoType">
+ <xs:sequence>
+ <xs:element name="Person" type="pd:PhysicalPersonType" />
+ <xs:element minOccurs="0" name="RegularDomicile" type="pd:PostalAddressType" />
+ <xs:element minOccurs="0" name="AddressCodes" type="szr:AddressCodesType" />
+ <xs:element minOccurs="0" name="TravelDocument" type="szr:TravelDocumentType" />
+ <xs:element minOccurs="0" name="DateOfBirthWildcard" type="xs:boolean" />
+ <xs:element minOccurs="0" name="AuskunftssperreGesetzt" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TravelDocumentType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DocumentNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="DocumentType" type="xs:string" />
+ <xs:element minOccurs="0" name="IssueDate" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingAuthority" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingCountry" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AddressCodesType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="OKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="SKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="ADRCD" type="xs:string" />
+ <xs:element minOccurs="0" name="SUBCD" type="xs:string" />
+ <xs:element minOccurs="0" name="OBJNR" type="xs:string" />
+ <xs:element minOccurs="0" name="NTZLNR" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="TransformBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="InputBPK" type="xs:string" />
+ <xs:element name="InputBereichsKennung" type="xs:string" />
+ <xs:element name="Begruendung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TransformBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="TransformBPKReturn" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermission">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="ParticipantId" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermissionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetVKZPermissionReturn" type="szr:GetVKZPermissionResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="IdentityLinkType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Assertion" type="xs:anyType" />
+ <xs:element minOccurs="0" name="AdditionalInfo" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ResultRecord">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Register" type="xs:string" />
+ <xs:element name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="NoInsert" />
+ <xs:enumeration value="InsertOnNoMatch" />
+ <xs:enumeration value="ForceInsert" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element minOccurs="0" name="Suchwizard" type="xs:boolean" />
+ <xs:element name="VKZ" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiResponseType">
+ <xs:complexContent>
+ <xs:extension base="szr:GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element name="FoundWithSuchwizard" type="xs:boolean" />
+ <xs:element name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" default="false" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:ResultRecord" />
+ <xs:element name="InsertERnPResult" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedRequestType">
+ <xs:sequence>
+ <xs:element minOccurs="1" name="StammzahlEncrypted" type="xs:string" />
+ <xs:element minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element maxOccurs="unbounded" name="KeyValue" type="dsig:KeyValueType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="ListMultiplePersons" type="xs:boolean" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GetBPKReturn" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element maxOccurs="5" minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKs">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKsResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:GetBPKsResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="GetBPKsResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element minOccurs="0" name="Fault">
+ <xs:complexType>
+ <xs:attribute name="Code" type="xs:string" />
+ <xs:attribute name="String" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetBPKKombi">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiRequest" type="szr:GetBPKKombiRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKKombiResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiResponse" type="szr:GetBPKKombiResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPV">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVRequest" type="szr:GetBPKZPVRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPVResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVResponse" type="szr:GetBPKZPVResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedRequest" type="szr:GetBPKFromStammzahlEncryptedRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse" type="szr:GetBPKFromStammzahlEncryptedResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="IdentityLink" type="szr:IdentityLinkType" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ValidateIdentityLinkReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="BPKzuBasiszahlReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="FremdBPKRequestType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FremdBPKType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="FremdBPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetVKZPermissionResponseType">
+ <xs:sequence>
+ <xs:element name="isAllowed" type="xs:boolean" />
+ <xs:element minOccurs="0" name="behSchluessel" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="BasiszahlZuBPKReturnType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="BasiszahlZuBPKReturn" type="szr:BasiszahlZuBPKReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ZMRAnwendungsIntegration">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ <xs:element maxOccurs="unbounded" name="ZMRfremdbPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="ZMRAnwendungsIntegrationReturnType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="ZMRAnwendungsIntegrationResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ZMRAnwendungsIntegrationReturn" type="szr:ZMRAnwendungsIntegrationReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVersion" />
+ <xs:element name="GetVersionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Version" type="xs:string" />
+ <xs:element name="Revision" type="xs:string" />
+ <xs:element name="Time" type="xs:string" />
+ <xs:element name="IdentityLinkNotAfter" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ <xs:schema targetNamespace="http://egov.gv.at/pvp1.xsd">
+ <xs:include schemaLocation="pvp1.xsd" />
+ </xs:schema>
+ <xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext">
+ <xs:element name="Security">
+ <xs:complexType>
+ <xs:sequence>
+ <!-- add the pvpToken here. You can also uncomment the following line if you support XSD 1.1 -->
+ <!-- <xs:element ref="pvp:pvpToken" /> -->
+ <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:anyAttribute processContents="lax" />
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ </types>
+ <message name="Header">
+ <part name="SecurityHeader" element="wsse:Security" />
+ </message>
+ <message name="GetIdentityLinkRequest">
+ <part element="szr:GetIdentityLink" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkResponse">
+ <part element="szr:GetIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="GetBPKRequest">
+ <part element="szr:GetBPK" name="parameters" />
+ </message>
+ <message name="GetBPKResponse">
+ <part element="szr:GetBPKResponse" name="parameters" />
+ </message>
+ <message name="GetBPKsRequest">
+ <part element="szr:GetBPKs" name="parameters" />
+ </message>
+ <message name="GetBPKsResponse">
+ <part element="szr:GetBPKsResponse" name="parameters" />
+ </message>
+ <message name="GetBPKKombiRequest">
+ <part element="szr:GetBPKKombi" name="parameters" />
+ </message>
+ <message name="GetBPKKombiResponse">
+ <part element="szr:GetBPKKombiResponse" name="parameters" />
+ </message>
+ <message name="GetBPKZPVRequest">
+ <part element="szr:GetBPKZPV" name="parameters" />
+ </message>
+ <message name="GetBPKZPVResponse">
+ <part element="szr:GetBPKZPVResponse" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedRequest">
+ <part element="szr:GetBPKFromStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedResponse">
+ <part element="szr:GetBPKFromStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlRequest">
+ <part element="szr:BPKzuBasiszahl" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlResponse">
+ <part element="szr:BPKzuBasiszahlResponse" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKRequest">
+ <part element="szr:BasiszahlZuBPK" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKResponse">
+ <part element="szr:BasiszahlZuBPKResponse" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkRequest">
+ <part element="szr:ValidateIdentityLink" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkResponse">
+ <part element="szr:ValidateIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="TransformBPKRequest">
+ <part element="szr:TransformBPK" name="parameters" />
+ </message>
+ <message name="TransformBPKResponse">
+ <part element="szr:TransformBPKResponse" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionRequest">
+ <part element="szr:GetVKZPermission" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionResponse">
+ <part element="szr:GetVKZPermissionResponse" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationRequest">
+ <part element="szr:ZMRAnwendungsIntegration" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationResponse">
+ <part element="szr:ZMRAnwendungsIntegrationResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlRequest">
+ <part element="szr:GetStammzahl" name="parameters" />
+ </message>
+ <message name="GetStammzahlResponse">
+ <part element="szr:GetStammzahlResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedRequest">
+ <part element="szr:GetStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedResponse">
+ <part element="szr:GetStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="GetVersionRequest">
+ <part element="szr:GetVersion" name="parameters" />
+ </message>
+ <message name="GetVersionResponse">
+ <part element="szr:GetVersionResponse" name="parameters" />
+ </message>
+ <message name="SZRException">
+ <part element="szr:SZRException" name="fault" />
+ </message>
+ <portType name="SZR">
+ <operation name="GetIdentityLink">
+ <input message="szr:GetIdentityLinkRequest" name="GetIdentityLinkRequest" />
+ <output message="szr:GetIdentityLinkResponse" name="GetIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPK">
+ <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
+ <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
+ </jaxws:bindings>
+ <input message="szr:GetBPKRequest" name="GetBPKRequest" />
+ <output message="szr:GetBPKResponse" name="GetBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKs">
+ <input message="szr:GetBPKsRequest" name="GetBPKsRequest" />
+ <output message="szr:GetBPKsResponse" name="GetBPKsResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKKombi">
+ <input message="szr:GetBPKKombiRequest" name="GetBPKKombiRequest" />
+ <output message="szr:GetBPKKombiResponse" name="GetBPKKombiResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKZPV">
+ <input message="szr:GetBPKZPVRequest" name="GetBPKZPVRequest" />
+ <output message="szr:GetBPKZPVResponse" name="GetBPKZPVResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <input message="szr:GetBPKFromStammzahlEncryptedRequest" name="GetBPKFromStammzahlEncryptedRequest" />
+ <output message="szr:GetBPKFromStammzahlEncryptedResponse" name="GetBPKFromStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <input message="szr:ValidateIdentityLinkRequest" name="ValidateIdentityLinkRequest" />
+ <output message="szr:ValidateIdentityLinkResponse" name="ValidateIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="TransformBPK">
+ <input message="szr:TransformBPKRequest" name="TransformBPKRequest" />
+ <output message="szr:TransformBPKResponse" name="TransformBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVKZPermission">
+ <input message="szr:GetVKZPermissionRequest" name="GetVKZPermissionRequest" />
+ <output message="szr:GetVKZPermissionResponse" name="GetVKZPermissionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <input message="szr:BPKzuBasiszahlRequest" name="BPKzuBasiszahlRequest" />
+ <output message="szr:BPKzuBasiszahlResponse" name="BPKzuBasiszahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <input message="szr:BasiszahlZuBPKRequest" name="BasiszahlZuBPKRequest" />
+ <output message="szr:BasiszahlZuBPKResponse" name="BasiszahlZuBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <input message="szr:ZMRAnwendungsIntegrationRequest" name="ZMRAnwendungsIntegrationRequest" />
+ <output message="szr:ZMRAnwendungsIntegrationResponse" name="ZMRAnwendungsIntegrationResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahl">
+ <input message="szr:GetStammzahlRequest" name="GetStammzahlRequest" />
+ <output message="szr:GetStammzahlResponse" name="GetStammzahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <input message="szr:GetStammzahlEncryptedRequest" name="GetStammzahlEncryptedRequest" />
+ <output message="szr:GetStammzahlEncryptedResponse" name="GetStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVersion">
+ <input message="szr:GetVersionRequest" name="GetVersionRequest" />
+ <output message="szr:GetVersionResponse" name="GetVersionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ </portType>
+ <binding name="SZRSoapBinding" type="szr:SZR">
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+ <operation name="GetIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKs">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKsRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKsResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKKombi">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKKombiRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKKombiResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKZPV">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKZPVRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKZPVResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKFromStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKFromStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVKZPermission">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVKZPermissionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVKZPermissionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ValidateIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ValidateIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="TransformBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="TransformBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="TransformBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BPKzuBasiszahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BPKzuBasiszahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BasiszahlZuBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BasiszahlZuBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ZMRAnwendungsIntegrationRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ZMRAnwendungsIntegrationResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVersion">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVersionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVersionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ </binding>
+ <service name="SZRService">
+ <port binding="szr:SZRSoapBinding" name="SZRBusinesspartnerTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/at.gv.bmi.szrsrv-b/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services-T/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRProduktionsumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services/services/SZR" />
+ </port>
+ </service>
+</definitions> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR_v4.0.wsdl b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR_v4.0.wsdl
new file mode 100644
index 00000000..e7f296bd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/SZR_v4.0.wsdl
@@ -0,0 +1,441 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<definitions targetNamespace="urn:SZRServices" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:szr="urn:SZRServices" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <types>
+ <xs:schema>
+ <xs:import namespace="urn:SZRServices" schemaLocation="szr_v4.0.xsd"/>
+ </xs:schema>
+ </types>
+ <message name="Header">
+ <part name="SecurityHeader" element="wsse:Security" />
+ </message>
+ <message name="GetIdentityLinkRequest">
+ <part element="szr:GetIdentityLink" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkResponse">
+ <part element="szr:GetIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkEidasRequest">
+ <part element="szr:GetIdentityLinkEidas" name="parameters" />
+ </message>
+ <message name="GetIdentityLinkEidasResponse">
+ <part element="szr:GetIdentityLinkEidasResponse" name="parameters" />
+ </message>
+ <message name="GetBPKRequest">
+ <part element="szr:GetBPK" name="parameters" />
+ </message>
+ <message name="GetBPKResponse">
+ <part element="szr:GetBPKResponse" name="parameters" />
+ </message>
+ <message name="GetBPKsRequest">
+ <part element="szr:GetBPKs" name="parameters" />
+ </message>
+ <message name="GetBPKsResponse">
+ <part element="szr:GetBPKsResponse" name="parameters" />
+ </message>
+ <message name="GetBPKKombiRequest">
+ <part element="szr:GetBPKKombi" name="parameters" />
+ </message>
+ <message name="GetBPKKombiResponse">
+ <part element="szr:GetBPKKombiResponse" name="parameters" />
+ </message>
+ <message name="GetBPKZPVRequest">
+ <part element="szr:GetBPKZPV" name="parameters" />
+ </message>
+ <message name="GetBPKZPVResponse">
+ <part element="szr:GetBPKZPVResponse" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedRequest">
+ <part element="szr:GetBPKFromStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetBPKFromStammzahlEncryptedResponse">
+ <part element="szr:GetBPKFromStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="SignContentRequest">
+ <part element="szr:SignContent" name="parameters" />
+ </message>
+ <message name="SignContentResponse">
+ <part element="szr:SignContentResponse" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlRequest">
+ <part element="szr:BPKzuBasiszahl" name="parameters" />
+ </message>
+ <message name="BPKzuBasiszahlResponse">
+ <part element="szr:BPKzuBasiszahlResponse" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKRequest">
+ <part element="szr:BasiszahlZuBPK" name="parameters" />
+ </message>
+ <message name="BasiszahlZuBPKResponse">
+ <part element="szr:BasiszahlZuBPKResponse" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkRequest">
+ <part element="szr:ValidateIdentityLink" name="parameters" />
+ </message>
+ <message name="ValidateIdentityLinkResponse">
+ <part element="szr:ValidateIdentityLinkResponse" name="parameters" />
+ </message>
+ <message name="TransformBPKRequest">
+ <part element="szr:TransformBPK" name="parameters" />
+ </message>
+ <message name="TransformBPKResponse">
+ <part element="szr:TransformBPKResponse" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionRequest">
+ <part element="szr:GetVKZPermission" name="parameters" />
+ </message>
+ <message name="GetVKZPermissionResponse">
+ <part element="szr:GetVKZPermissionResponse" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationRequest">
+ <part element="szr:ZMRAnwendungsIntegration" name="parameters" />
+ </message>
+ <message name="ZMRAnwendungsIntegrationResponse">
+ <part element="szr:ZMRAnwendungsIntegrationResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlRequest">
+ <part element="szr:GetStammzahl" name="parameters" />
+ </message>
+ <message name="GetStammzahlResponse">
+ <part element="szr:GetStammzahlResponse" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedRequest">
+ <part element="szr:GetStammzahlEncrypted" name="parameters" />
+ </message>
+ <message name="GetStammzahlEncryptedResponse">
+ <part element="szr:GetStammzahlEncryptedResponse" name="parameters" />
+ </message>
+ <message name="GetVersionRequest">
+ <part element="szr:GetVersion" name="parameters" />
+ </message>
+ <message name="GetVersionResponse">
+ <part element="szr:GetVersionResponse" name="parameters" />
+ </message>
+ <message name="SZRException">
+ <part element="szr:SZRException" name="fault" />
+ </message>
+ <portType name="SZR">
+ <operation name="GetIdentityLink">
+ <input message="szr:GetIdentityLinkRequest" name="GetIdentityLinkRequest" />
+ <output message="szr:GetIdentityLinkResponse" name="GetIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetIdentityLinkEidas">
+ <input message="szr:GetIdentityLinkEidasRequest" name="GetIdentityLinkEidasRequest" />
+ <output message="szr:GetIdentityLinkEidasResponse" name="GetIdentityLinkEidasResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPK">
+ <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
+ <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
+ </jaxws:bindings>
+ <input message="szr:GetBPKRequest" name="GetBPKRequest" />
+ <output message="szr:GetBPKResponse" name="GetBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKs">
+ <input message="szr:GetBPKsRequest" name="GetBPKsRequest" />
+ <output message="szr:GetBPKsResponse" name="GetBPKsResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKKombi">
+ <input message="szr:GetBPKKombiRequest" name="GetBPKKombiRequest" />
+ <output message="szr:GetBPKKombiResponse" name="GetBPKKombiResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKZPV">
+ <input message="szr:GetBPKZPVRequest" name="GetBPKZPVRequest" />
+ <output message="szr:GetBPKZPVResponse" name="GetBPKZPVResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <input message="szr:GetBPKFromStammzahlEncryptedRequest" name="GetBPKFromStammzahlEncryptedRequest" />
+ <output message="szr:GetBPKFromStammzahlEncryptedResponse" name="GetBPKFromStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="SignContent">
+ <input message="szr:SignContentRequest" name="SignContentRequest" />
+ <output message="szr:SignContentResponse" name="SignContentResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <input message="szr:ValidateIdentityLinkRequest" name="ValidateIdentityLinkRequest" />
+ <output message="szr:ValidateIdentityLinkResponse" name="ValidateIdentityLinkResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="TransformBPK">
+ <input message="szr:TransformBPKRequest" name="TransformBPKRequest" />
+ <output message="szr:TransformBPKResponse" name="TransformBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVKZPermission">
+ <input message="szr:GetVKZPermissionRequest" name="GetVKZPermissionRequest" />
+ <output message="szr:GetVKZPermissionResponse" name="GetVKZPermissionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <input message="szr:BPKzuBasiszahlRequest" name="BPKzuBasiszahlRequest" />
+ <output message="szr:BPKzuBasiszahlResponse" name="BPKzuBasiszahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <input message="szr:BasiszahlZuBPKRequest" name="BasiszahlZuBPKRequest" />
+ <output message="szr:BasiszahlZuBPKResponse" name="BasiszahlZuBPKResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <input message="szr:ZMRAnwendungsIntegrationRequest" name="ZMRAnwendungsIntegrationRequest" />
+ <output message="szr:ZMRAnwendungsIntegrationResponse" name="ZMRAnwendungsIntegrationResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahl">
+ <input message="szr:GetStammzahlRequest" name="GetStammzahlRequest" />
+ <output message="szr:GetStammzahlResponse" name="GetStammzahlResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <input message="szr:GetStammzahlEncryptedRequest" name="GetStammzahlEncryptedRequest" />
+ <output message="szr:GetStammzahlEncryptedResponse" name="GetStammzahlEncryptedResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ <operation name="GetVersion">
+ <input message="szr:GetVersionRequest" name="GetVersionRequest" />
+ <output message="szr:GetVersionResponse" name="GetVersionResponse" />
+ <fault message="szr:SZRException" name="SZRException" />
+ </operation>
+ </portType>
+ <binding name="SZRSoapBinding" type="szr:SZR">
+ <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
+ <operation name="GetIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetIdentityLinkEidas">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetIdentityLinkEidasRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetIdentityLinkEidasResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKs">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKsRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKsResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKKombi">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKKombiRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKKombiResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKZPV">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKZPVRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKZPVResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetBPKFromStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetBPKFromStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetBPKFromStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="SignContent">
+ <wsdlsoap:operation soapAction="" />
+ <input name="SignContentRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="SignContentResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVKZPermission">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVKZPermissionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVKZPermissionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ValidateIdentityLink">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ValidateIdentityLinkRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ValidateIdentityLinkResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="TransformBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="TransformBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="TransformBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BPKzuBasiszahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BPKzuBasiszahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BPKzuBasiszahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="BasiszahlZuBPK">
+ <wsdlsoap:operation soapAction="" />
+ <input name="BasiszahlZuBPKRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="BasiszahlZuBPKResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="ZMRAnwendungsIntegration">
+ <wsdlsoap:operation soapAction="" />
+ <input name="ZMRAnwendungsIntegrationRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="ZMRAnwendungsIntegrationResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahl">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetStammzahlEncrypted">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetStammzahlEncryptedRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetStammzahlEncryptedResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ <operation name="GetVersion">
+ <wsdlsoap:operation soapAction="" />
+ <input name="GetVersionRequest">
+ <wsdlsoap:header message="szr:Header" part="SecurityHeader" use="literal" />
+ <wsdlsoap:body use="literal" />
+ </input>
+ <output name="GetVersionResponse">
+ <wsdlsoap:body use="literal" />
+ </output>
+ <fault name="SZRException">
+ <wsdlsoap:fault name="SZRException" use="literal" />
+ </fault>
+ </operation>
+ </binding>
+ <service name="SZRService">
+ <port binding="szr:SZRSoapBinding" name="SZRBusinesspartnerTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/at.gv.bmi.szrsrv-b/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRTestumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services-T/services/SZR" />
+ </port>
+ <port binding="szr:SZRSoapBinding" name="SZRProduktionsumgebung">
+ <wsdlsoap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/SZ2Services/services/SZR" />
+ </port>
+ </service>
+</definitions> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp1.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp1.xsd
new file mode 100644
index 00000000..09c0b1e3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp1.xsd
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by BM (Bundeskanzleramt) -->
+<!-- PVP Schema 1.8.10 -->
+<!-- pvpToken wird über das Element <Security> aus der Spezifikation WS-Security in den SOAP-Header eingebunden -->
+<!--erstellt: rainer.hoerbe@bmi.gv.at 2004-04-30 -->
+<!--geändert: rainer.hoerbe@beko.at 2007-04-04: Extensions Points definiert -->
+<xs:schema targetNamespace="http://egov.gv.at/pvp1.xsd" xmlns="http://egov.gv.at/pvp1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="pvpToken">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpTokenType" />
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="pvpTokenType">
+ <xs:sequence>
+ <xs:element name="authenticate">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="participantId" type="xs:string" />
+ <xs:element name="gvOuDomain" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:choice>
+ <xs:element name="userPrincipal">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="gvGid" type="xs:string" />
+ <xs:element name="mail" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="tel" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="bpk" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="gvFunction" type="xs:string" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="systemPrincipal" type="pvpPrincipalType" />
+ </xs:choice>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authentication properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="authorize" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:sequence minOccurs="0">
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ </xs:sequence>
+ <xs:element name="role" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="value" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authorization properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="accounting" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pvpChainedToken" type="pvpTokenType" minOccurs="0" />
+ <xs:element name="pvpExtension" block="extension" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="version" type="gvVersionType" use="required" />
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="userId" type="xs:string" />
+ <xs:element name="cn" type="xs:string" />
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ <xs:element name="gvOuOKZ" type="xs:string" minOccurs="0" /> <!-- steht auch in der pvp doku, fehlt aber im normalen pvp1.xsd -->
+ <xs:element name="gvSecClass" type="gvSecClassType" minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional principal attributes</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:simpleType name="gvSecClassType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="gvVersionType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="1.0" />
+ <xs:enumeration value="1.1" />
+ <xs:enumeration value="1.2" />
+ <xs:enumeration value="1.8" />
+ <xs:enumeration value="1.9" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="logLevelType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ <xs:enumeration value="4" />
+ <xs:enumeration value="5" />
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp19.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp19.xsd
new file mode 100644
index 00000000..596a2b99
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/pvp19.xsd
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- edited with XMLSPY v2004 rel. 2 U (http://www.xmlspy.com) by BM (Bundeskanzleramt) -->
+<!-- PVP Schema 1.8.10 -->
+<!-- pvpToken wird über das Element <Security> aus der Spezifikation WS-Security in den SOAP-Header eingebunden -->
+<!--erstellt: rainer.hoerbe@bmi.gv.at 2004-04-30 -->
+<!--geändert: rainer.hoerbe@beko.at 2007-04-04: Extensions Points definiert -->
+<xs:schema targetNamespace="http://egov.gv.at/pvp1.xsd" xmlns="http://egov.gv.at/pvp1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="pvpToken">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpTokenType" />
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="pvpTokenType">
+ <xs:sequence>
+ <xs:element name="authenticate">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="participantId" type="xs:string" />
+ <xs:element name="gvOuDomain" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:choice>
+ <xs:element name="userPrincipal">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="gvGid" type="xs:string" />
+ <xs:element name="mail" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="tel" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="bpk" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="gvFunction" type="xs:string" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="systemPrincipal" type="pvpPrincipalType" />
+ </xs:choice>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authentication properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="authorize" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:sequence minOccurs="0">
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ </xs:sequence>
+ <xs:element name="role" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ <xs:attribute name="value" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authorization properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="accounting" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pvpChainedToken" type="pvpTokenType" minOccurs="0" />
+ <xs:element name="pvpExtension" block="extension" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="version" type="gvVersionType" use="required" />
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="userId" type="xs:string" />
+ <xs:element name="cn" type="xs:string" />
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ <xs:element name="gvOuOKZ" type="xs:string" minOccurs="0" />
+ <xs:element name="gvSecClass" type="gvSecClassType" minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional principal attributes</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:simpleType name="gvSecClassType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="gvVersionType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="1.0" />
+ <xs:enumeration value="1.1" />
+ <xs:enumeration value="1.2" />
+ <xs:enumeration value="1.8" />
+ <xs:enumeration value="1.9" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="logLevelType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ <xs:enumeration value="4" />
+ <xs:enumeration value="5" />
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr.xsd
new file mode 100644
index 00000000..85acfb65
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr.xsd
@@ -0,0 +1,388 @@
+<xs:schema elementFormDefault="qualified" targetNamespace="urn:SZRServices" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:szr="urn:SZRServices" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:import namespace="http://reference.e-government.gv.at/namespace/persondata/20020228#" />
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" />
+ <xs:element name="SZRException" type="szr:SZRException" />
+ <xs:complexType name="SZRException" />
+ <xs:complexType name="PersonInfoType">
+ <xs:sequence>
+ <xs:element name="Person" type="pd:PhysicalPersonType" />
+ <xs:element minOccurs="0" name="RegularDomicile" type="pd:PostalAddressType" />
+ <xs:element minOccurs="0" name="AddressCodes" type="szr:AddressCodesType" />
+ <xs:element minOccurs="0" name="TravelDocument" type="szr:TravelDocumentType" />
+ <xs:element minOccurs="0" name="DateOfBirthWildcard" type="xs:boolean" />
+ <xs:element minOccurs="0" name="AuskunftssperreGesetzt" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TravelDocumentType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="DocumentNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="DocumentType" type="xs:string" />
+ <xs:element minOccurs="0" name="IssueDate" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingAuthority" type="xs:string" />
+ <xs:element minOccurs="0" name="IssuingCountry" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AddressCodesType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="OKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="SKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="ADRCD" type="xs:string" />
+ <xs:element minOccurs="0" name="SUBCD" type="xs:string" />
+ <xs:element minOccurs="0" name="OBJNR" type="xs:string" />
+ <xs:element minOccurs="0" name="NTZLNR" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="TransformBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="InputBPK" type="xs:string" />
+ <xs:element name="InputBereichsKennung" type="xs:string" />
+ <xs:element name="Begruendung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TransformBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="TransformBPKReturn" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermission">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="ParticipantId" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermissionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetVKZPermissionReturn" type="szr:GetVKZPermissionResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="IdentityLinkType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Assertion" type="xs:anyType" />
+ <xs:element minOccurs="0" name="AdditionalInfo" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ResultRecord">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element name="Register" type="xs:string" />
+ <xs:element name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="NoInsert" />
+ <xs:enumeration value="InsertOnNoMatch" />
+ <xs:enumeration value="ForceInsert" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element minOccurs="0" name="Suchwizard" type="xs:boolean" />
+ <xs:element name="VKZ" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiResponseType">
+ <xs:complexContent>
+ <xs:extension base="szr:GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element name="FoundWithSuchwizard" type="xs:boolean" />
+ <xs:element name="Sessionid" type="xs:string" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" default="false" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BehoerdenKennzeichen" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:ResultRecord" />
+ <xs:element name="InsertERnPResult" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedRequestType">
+ <xs:sequence>
+ <xs:element minOccurs="1" name="StammzahlEncrypted" type="xs:string" />
+ <xs:element minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="1" name="VKZ" type="xs:string" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="bPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element maxOccurs="unbounded" name="KeyValue" type="dsig:KeyValueType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ <xs:element minOccurs="0" name="ListMultiplePersons" type="xs:boolean" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="GetBPKReturn" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element maxOccurs="5" minOccurs="0" name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKs">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Target" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKsResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ResultRecord" type="szr:GetBPKsResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="GetBPKsResponseType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPK" type="szr:FremdBPKType" />
+ <xs:element minOccurs="0" name="Fault">
+ <xs:complexType>
+ <xs:attribute name="Code" type="xs:string" />
+ <xs:attribute name="String" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetBPKKombi">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiRequest" type="szr:GetBPKKombiRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKKombiResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiResponse" type="szr:GetBPKKombiResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPV">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVRequest" type="szr:GetBPKZPVRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPVResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVResponse" type="szr:GetBPKZPVResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedRequest" type="szr:GetBPKFromStammzahlEncryptedRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse" type="szr:GetBPKFromStammzahlEncryptedResponseType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="IdentityLink" type="szr:IdentityLinkType" />
+ <xs:element name="BereichsKennung" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ValidateIdentityLinkReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="BPKzuBasiszahlReturn" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="FremdBPKRequestType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="VKZ" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FremdBPKType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string" />
+ <xs:element name="FremdBPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetVKZPermissionResponseType">
+ <xs:sequence>
+ <xs:element name="isAllowed" type="xs:boolean" />
+ <xs:element minOccurs="0" name="behSchluessel" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element minOccurs="0" name="VKZ" type="xs:string" />
+ <xs:element maxOccurs="unbounded" name="BasisZahl" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="BasiszahlZuBPKReturnType">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="BasiszahlZuBPKReturn" type="szr:BasiszahlZuBPKReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ZMRAnwendungsIntegration">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKTargets" type="szr:FremdBPKRequestType" />
+ <xs:element maxOccurs="unbounded" name="ZMRfremdbPK" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="ZMRAnwendungsIntegrationReturnType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string" />
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="FremdBPKs" type="szr:FremdBPKType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="ZMRAnwendungsIntegrationResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" name="ZMRAnwendungsIntegrationReturn" type="szr:ZMRAnwendungsIntegrationReturnType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" />
+ <xs:element minOccurs="0" name="InsertERnP" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVersion" />
+ <xs:element name="GetVersionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Version" type="xs:string" />
+ <xs:element name="Revision" type="xs:string" />
+ <xs:element name="Time" type="xs:string" />
+ <xs:element name="IdentityLinkNotAfter" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_ecdsa.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_ecdsa.xsd
new file mode 100644
index 00000000..87ee80be
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_ecdsa.xsd
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://www.w3.org/2001/04/xmldsig-more#" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#">
+ <xs:element name="ECDSAKeyValue" type="ecdsa:ECDSAKeyValueType" />
+ <xs:complexType name="ECDSAKeyValueType">
+ <xs:sequence>
+ <xs:element name="DomainParameters" type="ecdsa:DomainParamsType"
+ minOccurs="0" />
+ <xs:element name="PublicKey" type="ecdsa:ECPointType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DomainParamsType">
+ <xs:sequence>
+ <xs:element name="NamedCurve" minOccurs="0"
+ type="ecdsa:NamedCurveType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="NamedCurveType">
+ <xs:attribute name="URN" type="xs:string" use="required" />
+ </xs:complexType>
+ <xs:complexType name="ECPointType">
+ <xs:sequence minOccurs="0">
+ <xs:element name="X" type="ecdsa:PrimeFieldElemType" />
+ <xs:element name="Y" type="ecdsa:PrimeFieldElemType" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PrimeFieldElemType">
+ <xs:attribute name="Value" type="xs:string" use="required" />
+ </xs:complexType>
+</xs:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_persondata.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_persondata.xsd
new file mode 100644
index 00000000..3c9ac932
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_persondata.xsd
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#"
+ targetNamespace="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:complexType name="PhysicalPersonType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Identification" type="pd:IdentificationType" />
+ <xs:element minOccurs="1" name="Name" type="pd:PersonNameType" />
+ <xs:element minOccurs="0" name="AlternativeName" type="pd:AlternativeNameType" />
+ <xs:element minOccurs="0" name="Sex" type="xs:string" />
+ <xs:element minOccurs="0" name="DateOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="PlaceOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="CountryOfBirth" type="xs:string" />
+ <xs:element minOccurs="0" name="Nationality" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="IdentificationType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="Value" type="xs:string" />
+ <xs:element minOccurs="0" name="Type" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PersonNameType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PrefixedDegree" type="xs:string" />
+ <xs:element name="GivenName" type="xs:string" nillable="true" />
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ <xs:element minOccurs="0" name="SuffixedDegree" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AlternativeNameType">
+ <xs:sequence>
+ <xs:element name="FamilyName" type="xs:string" nillable="true" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PostalAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="PostalCode" type="xs:string" />
+ <xs:element minOccurs="0" name="Municipality" type="xs:string" />
+ <xs:element minOccurs="0" name="Locality" type="xs:string" />
+ <xs:element minOccurs="0" name="StateCode3" type="xs:string" />
+ <xs:element minOccurs="0" name="DeliveryAddress" type="pd:DeliveryAddressType" />
+ <xs:element minOccurs="0" name="HistoricRecord" type="xs:boolean" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DeliveryAddressType">
+ <xs:sequence>
+ <xs:element minOccurs="0" name="AddressLine" type="xs:string" />
+ <xs:element minOccurs="0" name="StreetName" type="xs:string" />
+ <xs:element minOccurs="0" name="BuildingNumber" type="xs:string" />
+ <xs:element minOccurs="0" name="Unit" type="xs:string" />
+ <xs:element minOccurs="0" name="DoorNumber" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_pvp_sec.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_pvp_sec.xsd
new file mode 100644
index 00000000..5001c1b8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_pvp_sec.xsd
@@ -0,0 +1,10 @@
+<xs:schema xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" elementFormDefault="qualified">
+ <xs:import namespace="http://egov.gv.at/pvp1.xsd" schemaLocation="pvp19.xsd"/>
+ <xs:element name="Security">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="pvp:pvpToken"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-schemas.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-schemas.xml
new file mode 100644
index 00000000..d40efa45
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-schemas.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
+ xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc">
+
+ <bindings schemaLocation="../szr_v4/szr_v4.0.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr_v4" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+ <bindings schemaLocation="../szr/szr_ecdsa.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr.ecdsa" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+ <bindings schemaLocation="../szr_v4/szr_persondata.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr.persondata" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+ <bindings schemaLocation="../szr_v4/szr_pvp_sec.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr.pvp19.sec" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+ <bindings schemaLocation="../szr_v4/pvp19.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr.pvp19" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+ <bindings schemaLocation="../szr/szr_xmldsig.xsd">
+ <bindings node="/xsd:schema">
+ <schemaBindings>
+ <package name="at.gv.util.xsd.szr.xmldsig" />
+ </schemaBindings>
+ </bindings>
+ </bindings>
+
+</bindings> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-wsdl.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-wsdl.xml
new file mode 100644
index 00000000..f95c35f0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0-wsdl.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bindings xmlns="http://java.sun.com/xml/ns/jaxws"
+ xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
+ <enableWrapperStyle>false</enableWrapperStyle>
+ <package name="at.gv.util.wsdl.szr_v4"/>
+
+</bindings> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0.xsd
new file mode 100644
index 00000000..2d25f2dc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_v4.0.xsd
@@ -0,0 +1,443 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:szr="urn:SZRServices" xmlns:pd="http://reference.e-government.gv.at/namespace/persondata/20020228#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" targetNamespace="urn:SZRServices" elementFormDefault="qualified">
+ <xs:import namespace="http://reference.e-government.gv.at/namespace/persondata/20020228#" schemaLocation="szr_persondata.xsd"/>
+ <xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="szr_xmldsig.xsd"/>
+ <xs:element name="SZRException" type="szr:SZRException"/>
+ <xs:complexType name="SZRException"/>
+ <xs:complexType name="PersonInfoType">
+ <xs:sequence>
+ <xs:element name="Person" type="pd:PhysicalPersonType"/>
+ <xs:element name="RegularDomicile" type="pd:PostalAddressType" minOccurs="0"/>
+ <xs:element name="AddressCodes" type="szr:AddressCodesType" minOccurs="0"/>
+ <xs:element name="TravelDocument" type="szr:TravelDocumentType" minOccurs="0"/>
+ <xs:element name="DateOfBirthWildcard" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="AuskunftssperreGesetzt" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TravelDocumentType">
+ <xs:sequence>
+ <xs:element name="DocumentNumber" type="xs:string" minOccurs="0"/>
+ <xs:element name="DocumentType" type="xs:string" minOccurs="0"/>
+ <xs:element name="IssueDate" type="xs:string" minOccurs="0"/>
+ <xs:element name="IssuingAuthority" type="xs:string" minOccurs="0"/>
+ <xs:element name="IssuingCountry" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AddressCodesType">
+ <xs:sequence>
+ <xs:element name="GKZ" type="xs:string" minOccurs="0"/>
+ <xs:element name="OKZ" type="xs:string" minOccurs="0"/>
+ <xs:element name="SKZ" type="xs:string" minOccurs="0"/>
+ <xs:element name="ADRCD" type="xs:string" minOccurs="0"/>
+ <xs:element name="SUBCD" type="xs:string" minOccurs="0"/>
+ <xs:element name="OBJNR" type="xs:string" minOccurs="0"/>
+ <xs:element name="NTZLNR" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="TransformBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="InputBPK" type="xs:string"/>
+ <xs:element name="InputBereichsKennung" type="xs:string"/>
+ <xs:element name="Begruendung" type="xs:string"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="TransformBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="TransformBPKReturn" type="szr:FremdBPKType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermission">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="VKZ" type="xs:string"/>
+ <xs:element name="BereichsKennung" type="xs:string"/>
+ <xs:element name="ParticipantId" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVKZPermissionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetVKZPermissionReturn" type="szr:GetVKZPermissionResponseType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="IdentityLinkType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="Assertion" type="xs:anyType"/>
+ <xs:element name="AdditionalInfo" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ResultRecord">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="Register" type="xs:string"/>
+ <xs:element name="bPK" type="xs:string"/>
+ <xs:element name="FremdBPK" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="InsertERnP" minOccurs="0">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="NoInsert"/>
+ <xs:enumeration value="InsertOnNoMatch"/>
+ <xs:enumeration value="ForceInsert"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ <xs:element name="Suchwizard" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="VKZ" type="xs:string" nillable="true"/>
+ <xs:element name="BehoerdenKennzeichen" type="xs:string" minOccurs="0"/>
+ <xs:element name="BereichsKennung" type="xs:string" minOccurs="0"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Sessionid" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKKombiResponseType">
+ <xs:complexContent>
+ <xs:extension base="szr:GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element name="FoundWithSuchwizard" type="xs:boolean"/>
+ <xs:element name="Sessionid" type="xs:string"/>
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVRequestType">
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="InsertERnP" type="xs:boolean" default="false" minOccurs="0"/>
+ <xs:element name="VKZ" type="xs:string" minOccurs="1"/>
+ <xs:element name="BehoerdenKennzeichen" type="xs:string" minOccurs="0"/>
+ <xs:element name="BereichsKennung" type="xs:string" minOccurs="0"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKZPVResponseType">
+ <xs:sequence>
+ <xs:element name="ResultRecord" type="szr:ResultRecord" maxOccurs="unbounded"/>
+ <xs:element name="InsertERnPResult" type="xs:boolean"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedRequestType">
+ <xs:sequence>
+ <xs:element name="StammzahlEncrypted" type="xs:string" minOccurs="1"/>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" minOccurs="0"/>
+ <xs:element name="VKZ" type="xs:string" minOccurs="1"/>
+ <xs:element name="BereichsKennung" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="key"/>
+ </xs:complexType>
+ <xs:complexType name="GetBPKFromStammzahlEncryptedResponseType">
+ <xs:sequence>
+ <xs:element name="bPK" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="FremdBPK" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Fault" type="szr:Fault" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attribute name="key"/>
+ </xs:complexType>
+ <xs:complexType name="Fault">
+ <xs:attribute name="Code" type="xs:string"/>
+ <xs:attribute name="String" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="SignContentResponseType">
+ <xs:sequence>
+ <xs:element name="JwsAlg" type="xs:string" minOccurs="0"/>
+ <xs:element name="Out" type="szr:SignContentEntry" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="SignContentEntry">
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="key"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:element name="GetIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="KeyValue" type="dsig:KeyValueType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="InsertERnP" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkEidas">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetIdentityLinkEidasResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetIdentityLinkReturn" type="szr:IdentityLinkType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="BereichsKennung" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="VKZ" type="xs:string" minOccurs="0"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="ListMultiplePersons" type="xs:boolean" minOccurs="0"/>
+ <xs:element name="InsertERnP" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKReturn" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="FremdBPK" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" minOccurs="0" maxOccurs="5"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKs">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType" maxOccurs="unbounded"/>
+ <xs:element name="BereichsKennung" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="VKZ" type="xs:string"/>
+ <xs:element name="Target" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKsResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ResultRecord" type="szr:GetBPKsResponseType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="GetBPKsResponseType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="FremdBPK" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="Fault" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="Code" type="xs:string"/>
+ <xs:attribute name="String" type="xs:string"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="GetBPKKombi">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiRequest" type="szr:GetBPKKombiRequestType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKKombiResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKKombiResponse" type="szr:GetBPKKombiResponseType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPV">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVRequest" type="szr:GetBPKZPVRequestType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKZPVResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="GetBPKZPVResponse" type="szr:GetBPKZPVResponseType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="In" type="szr:GetBPKFromStammzahlEncryptedRequestType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetBPKFromStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Out" type="szr:GetBPKFromStammzahlEncryptedResponseType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="SignContent">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="AppendCert" type="xs:boolean" default="false" minOccurs="0"/>
+ <xs:element name="JWSHeaderParam" type="szr:JwsHeaderParam" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="In" type="szr:SignContentEntry" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="JwsHeaderParam">
+ <xs:attribute name="key" type="xs:string" use="required"/>
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ </xs:complexType>
+ <xs:element name="SignContentResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="SignContentResponse" type="szr:SignContentResponseType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLink">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="IdentityLink" type="szr:IdentityLinkType"/>
+ <xs:element name="BereichsKennung" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ValidateIdentityLinkResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ValidateIdentityLinkReturn" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string"/>
+ <xs:element name="BPK" type="xs:string"/>
+ <xs:element name="BasisZahl" type="xs:string" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="BPKzuBasiszahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="BPKzuBasiszahlReturn" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="FremdBPKRequestType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string"/>
+ <xs:element name="VKZ" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FremdBPKType">
+ <xs:sequence>
+ <xs:element name="BereichsKennung" type="xs:string"/>
+ <xs:element name="FremdBPK" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GetVKZPermissionResponseType">
+ <xs:sequence>
+ <xs:element name="isAllowed" type="xs:boolean"/>
+ <xs:element name="behSchluessel" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPK">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="VKZ" type="xs:string" minOccurs="0"/>
+ <xs:element name="BasisZahl" type="xs:string" maxOccurs="unbounded"/>
+ <xs:element name="Bereich" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="FremdBPKTargets" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="BasiszahlZuBPKReturnType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="FremdBPKs" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="BasiszahlZuBPKResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="BasiszahlZuBPKReturn" type="szr:BasiszahlZuBPKReturnType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ZMRAnwendungsIntegration">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Bereich" type="xs:string"/>
+ <xs:element name="FremdBPKTargets" type="szr:FremdBPKRequestType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="ZMRfremdbPK" type="xs:string" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="ZMRAnwendungsIntegrationReturnType">
+ <xs:sequence>
+ <xs:element name="BPK" type="xs:string"/>
+ <xs:element name="FremdBPKs" type="szr:FremdBPKType" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="ZMRAnwendungsIntegrationResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ZMRAnwendungsIntegrationReturn" type="szr:ZMRAnwendungsIntegrationReturnType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahl">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncrypted">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="PersonInfo" type="szr:PersonInfoType"/>
+ <xs:element name="InsertERnP" type="xs:boolean" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetStammzahlEncryptedResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Stammzahl" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="GetVersion" nillable="true"/>
+ <xs:element name="GetVersionResponse">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="Version" type="xs:string"/>
+ <xs:element name="Revision" type="xs:string"/>
+ <xs:element name="Time" type="xs:string"/>
+ <xs:element name="IdentityLinkNotAfter" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_xmldsig.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_xmldsig.xsd
new file mode 100644
index 00000000..96b50b40
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/szr_client/szr_xmldsig.xsd
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ecdsa="http://www.w3.org/2001/04/xmldsig-more#"
+ targetNamespace="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#">
+ <xs:import namespace="http://www.w3.org/2001/04/xmldsig-more#" schemaLocation="szr_ecdsa.xsd"/>
+ <xs:complexType name="KeyValueType">
+ <xs:sequence>
+ <xs:element name="DSAKeyValue" minOccurs="0"
+ type="dsig:DSAKeyValueType" />
+ <xs:element name="RSAKeyValue" minOccurs="0"
+ type="dsig:RSAKeyValueType" />
+ <xs:element ref="ecdsa:ECDSAKeyValue" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DSAKeyValueType">
+ <xs:sequence>
+ <xs:element name="P" minOccurs="0" type="xs:string" />
+ <xs:element name="Q" minOccurs="0" type="xs:string" />
+ <xs:element name="J" minOccurs="0" type="xs:string" />
+ <xs:element name="G" minOccurs="0" type="xs:string" />
+ <xs:element name="Y" minOccurs="0" type="xs:string" />
+ <xs:element name="PgenCounter" minOccurs="0" type="xs:string" />
+ <xs:element name="Seed" minOccurs="0" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RSAKeyValueType">
+ <xs:sequence>
+ <xs:element name="Modulus" minOccurs="0" type="xs:string" />
+ <xs:element name="Exponent" minOccurs="0" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/soapenv.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/soapenv.xsd
new file mode 100644
index 00000000..cb89c710
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/soapenv.xsd
@@ -0,0 +1,125 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+
+<!-- Schema for the SOAP/1.1 envelope
+
+ This schema has been produced using W3C's SOAP Version 1.2 schema
+ found at:
+
+ http://www.w3.org/2001/06/soap-envelope
+
+ Copyright 2001 Martin Gudgin, Developmentor.
+
+ Changes made are the following:
+ - reverted namespace to http://schemas.xmlsoap.org/soap/envelope/
+ - reverted mustUnderstand to only allow 0 and 1 as lexical values
+ - made encodingStyle a global attribute 20020825
+
+ Further changes:
+
+ - removed default value from mustUnderstand attribute declaration - 20030314
+
+ Original copyright:
+
+ Copyright 2001 W3C (Massachusetts Institute of Technology,
+ Institut National de Recherche en Informatique et en Automatique,
+ Keio University). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/
+
+ This document is governed by the W3C Software License [1] as
+ described in the FAQ [2].
+
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/"
+ targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" >
+
+
+ <!-- Envelope, header and body -->
+ <xs:element name="Envelope" type="tns:Envelope" />
+ <xs:complexType name="Envelope" >
+ <xs:sequence>
+ <xs:element ref="tns:Header" minOccurs="0" />
+ <xs:element ref="tns:Body" minOccurs="1" />
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax" />
+ </xs:complexType>
+
+ <xs:element name="Header" type="tns:Header" />
+ <xs:complexType name="Header" >
+ <xs:sequence>
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax" />
+ </xs:complexType>
+
+ <xs:element name="Body" type="tns:Body" />
+ <xs:complexType name="Body" >
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="strict" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" >
+ <xs:annotation>
+ <xs:documentation>
+ Prose in the spec does not specify that attributes are allowed on the Body element
+ </xs:documentation>
+ </xs:annotation>
+ </xs:anyAttribute>
+ </xs:complexType>
+
+
+ <!-- Global Attributes. The following attributes are intended to be usable via qualified attribute names on any complex type referencing them. -->
+ <xs:attribute name="mustUnderstand" >
+ <xs:simpleType>
+ <xs:restriction base='xs:boolean'>
+ <xs:pattern value='0|1' />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="actor" type="xs:anyURI" />
+
+ <xs:simpleType name="encodingStyle" >
+ <xs:annotation>
+ <xs:documentation>
+ 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification
+ </xs:documentation>
+ </xs:annotation>
+ <xs:list itemType="xs:anyURI" />
+ </xs:simpleType>
+
+ <xs:attribute name="encodingStyle" type="tns:encodingStyle" />
+ <xs:attributeGroup name="encodingStyle" >
+ <xs:attribute ref="tns:encodingStyle" />
+ </xs:attributeGroup>
+
+ <xs:element name="Fault" type="tns:Fault" />
+ <xs:complexType name="Fault" final="extension" >
+ <xs:annotation>
+ <xs:documentation>
+ Fault reporting structure
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element name="faultcode" type="xs:QName" />
+ <xs:element name="faultstring" type="xs:string" />
+ <xs:element name="faultactor" type="xs:anyURI" minOccurs="0" />
+ <xs:element name="detail" type="tns:detail" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="detail">
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+
+</xs:schema>
+
+
+
+
+
+
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenrequest.xml
new file mode 100644
index 00000000..173c3894
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenrequest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Ablaufende_Auskunftssperren</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Ablaufende_Auskunftssperren</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:AblaufendeAuskunftssperrenSucheRequest>
+ <zmr:SperreBis>2005-01-01T00:00:00.000</zmr:SperreBis>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:AblaufendeAuskunftssperrenSucheRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenresponse.xml
new file mode 100644
index 00000000..75fbd86f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/ablaufendeauskunftssperrenresponse.xml
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Ablaufende_Auskunftssperren</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Ablaufende_Auskunftssperren</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AblaufendeAuskunftssperrenSucheResponse>
+ <zmr:AblaufendeAuskunftssperrenSucheAnfrage>
+ <zmr:SperreBis>2005-01-01T00:00:00.000</zmr:SperreBis>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:AblaufendeAuskunftssperrenSucheAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:AblaufendeAuskunftssperreErgebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:AblaufendeAuskunftssperreErgebnis>
+ </zmr:AblaufendeAuskunftssperrenSucheResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternrequest.xml
new file mode 100644
index 00000000..50517e75
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternrequest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Ablaufende_Auskunftssperren</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <!-- Die InstanzID der laufenden Prozesses muss hier übermittelt werden, um die Suche fortzusetzen (aus WorkflowInfoServer des ersten Suchergebnisses-->
+ <base:SequenzID>00034</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Ablaufende_Auskunftssperren</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <base:BlaetternRequest>
+ <base:BlaetternInfo>
+ <base:Richtung>Vor</base:Richtung>
+ <base:AnzahlSaetze>3</base:AnzahlSaetze>
+ </base:BlaetternInfo>
+ </base:BlaetternRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternresponse.xml
new file mode 100644
index 00000000..add2f3ad
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/ablaufendeauskunfssperren/blaetternresponse.xml
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Ablaufende_Auskunftssperren</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Ablaufende_Auskunftssperren</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AblaufendeAuskunftssperrenSucheResponse>
+ <zmr:AblaufendeAuskunftssperrenSucheAnfrage>
+ <zmr:SperreBis>2005-01-01T00:00:00.000</zmr:SperreBis>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:AblaufendeAuskunftssperrenSucheAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:AblaufendeAuskunftssperreErgebnis>
+ <base:GefundeneSaetze>4</base:GefundeneSaetze>
+ <base:SaetzeVon>3</base:SaetzeVon>
+ <!-- Es wurde weitergeblättert - der letzte Satz wird geliefert -->
+ <base:SaetzeBis>4</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:AblaufendeAuskunftssperreErgebnis>
+ </zmr:AblaufendeAuskunftssperrenSucheResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionrequest.xml
new file mode 100644
index 00000000..9e8746ce
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionrequest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Adoption</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Adoption</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:AdoptionRequest>
+ <zmr:AdoptionInfo>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ </zmr:AdoptionInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>2434</base:EntityID>
+ <base:LetzteAenderung>2003-03-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <Familienname>MustermannAdoption</Familienname>
+ </zmr:AdoptionRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionresponse.xml
new file mode 100644
index 00000000..466bdc2c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adoption/adoptionresponse.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Adoption</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Adoption</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdoptionResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Person wurde geändert</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>NAMENSAENDERUNG</base:BeginnCode>
+ <base:BeginnText>Namensänderung</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Anna</Vorname>
+ <Familienname>MustermannAdoption</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:AdoptionResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucherequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucherequest.xml
new file mode 100644
index 00000000..b37c1ecf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucherequest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>Meldevorgang</base:ProzessName>
+ <base:VorgangName>Adresssuche</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>ZMRHTMLClient V3.0</base:Client>
+ </base:ClientInfo>
+ <zmr:AdresssucheRequest>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucheresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucheresponse.xml
new file mode 100644
index 00000000..53c04d79
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/adresssuche/adresssucheresponse.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>Meldevorgang</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>Adresssuche</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>true</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:AdresssucheResponse>
+ <zmr:AdresssucheAnfrage>
+ <zmr:AdresssucheInfo>
+ <zmr:Suchart>ADRESSSUCHE</zmr:Suchart>
+ </zmr:AdresssucheInfo>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Adressdaten>
+ </zmr:AdresssucheAnfrage>
+ <base:Message>
+ <base:Number>123</base:Number>
+ <base:Text>Adressen gefunden.</base:Text>
+ </base:Message>
+ <zmr:Adresssuchergebnis>
+ <zmr:Detailgrad>Orientierungsnummer</zmr:Detailgrad>
+ <base:GefundeneSaetze>3</base:GefundeneSaetze>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>2</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Adressdaten>
+ <zmr:Adressdaten>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Adressdaten>
+ </zmr:Adresssuchergebnis>
+ </zmr:AdresssucheResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe1.xml
new file mode 100644
index 00000000..0aa8460b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe1.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Behoerdenabfrage_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Behoerdenabfrage_Ueberblick_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:BehoerdenabfrageRequest>
+ <zmr:BehoerdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BehoerdenabfrageAction>SONSTIGES</zmr:BehoerdenabfrageAction>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:BehoerdenabfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2000-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:BehoerdenabfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe2.xml
new file mode 100644
index 00000000..a68cd27d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfragerequestStufe2.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Behoerdenabfrage_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Behoerdenabfrage_Detail_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:BehoerdenabfrageRequest>
+ <zmr:BehoerdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BehoerdenabfrageAction>SONSTIGES</zmr:BehoerdenabfrageAction>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:BehoerdenabfrageInfo>
+ <zmr:PersonKey>1</zmr:PersonKey>
+ </zmr:BehoerdenabfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe1.xml
new file mode 100644
index 00000000..cf18458e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe1.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Behoerdenabfrage_erstellen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Behoerdenabfrage_Detail_erstellen</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:BehoerdenabfrageResponse>
+ <zmr:BehoerdenabfrageAnfrage>
+ <zmr:BehoerdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BehoerdenabfrageAction>SONSTIGES</zmr:BehoerdenabfrageAction>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:BehoerdenabfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2000-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:BehoerdenabfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurden 3 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:BehoerdenabfrageUeberblick>
+ <base:AnzahlSaetze>3</base:AnzahlSaetze>
+ <zmr:PersonUeberblick>
+ <zmr:PersonKey>0</zmr:PersonKey>
+ <Geburtsdatum>2001-01-01</Geburtsdatum>
+ <Geburtsort>Wien - Ottakring</Geburtsort>
+ <Postleitzahl>1010</Postleitzahl>
+ <Ortschaft>Wien - Innere Stadt</Ortschaft>
+ </zmr:PersonUeberblick>
+ <zmr:PersonUeberblick>
+ <zmr:PersonKey>1</zmr:PersonKey>
+ <Geburtsdatum>2001-01-01</Geburtsdatum>
+ <Geburtsort>Testort</Geburtsort>
+ <Postleitzahl>9999</Postleitzahl>
+ <Ortschaft>Testort</Ortschaft>
+ </zmr:PersonUeberblick>
+ <zmr:PersonUeberblick>
+ <zmr:PersonKey>2</zmr:PersonKey>
+ <Geburtsdatum>2001-01-01</Geburtsdatum>
+ <Geburtsort>Testort2</Geburtsort>
+ <Postleitzahl>8888</Postleitzahl>
+ <Ortschaft>Testort2</Ortschaft>
+ </zmr:PersonUeberblick>
+ </zmr:BehoerdenabfrageUeberblick>
+ </zmr:BehoerdenabfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe2.xml
new file mode 100644
index 00000000..909c491e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/behoerdenabfrage/behoerdenabfrageresponseStufe2.xml
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Behoerdenabfrage_erstellen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Behoerdenabfrage_Detail_erstellen</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:BehoerdenabfrageResponse>
+ <zmr:BehoerdenabfrageAnfrage>
+ <zmr:BehoerdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BehoerdenabfrageAction>SONSTIGES</zmr:BehoerdenabfrageAction>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:BehoerdenabfrageInfo>
+ <zmr:PersonKey>1</zmr:PersonKey>
+ </zmr:BehoerdenabfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Person im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:BehoerdenabfrageDetail>
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ <zmr:PDFDaten>XXYY</zmr:PDFDaten>
+ </zmr:BehoerdenabfrageDetail>
+ </zmr:BehoerdenabfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenrequest.xml
new file mode 100644
index 00000000..db6014cd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenrequest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>Abfragen</base:ProzessName>
+ <base:VorgangName>Bestandsaenderungen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>ZMRHTMLClient V3.0</base:Client>
+ </base:ClientInfo>
+ <zmr:BestandsaenderungenRequest>
+ <zmr:BestandsaenderungenInfo>
+ <zmr:AenderungenVon>2004-01-01T00:00:00.000</zmr:AenderungenVon>
+ <zmr:AenderungenBis>2004-07-01T00:00:00.000</zmr:AenderungenBis>
+ <zmr:InclusiveAdressen>true</zmr:InclusiveAdressen>
+ <zmr:Veraenderung>TYP_ZUGANG</zmr:Veraenderung>
+ </zmr:BestandsaenderungenInfo>
+ </zmr:BestandsaenderungenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenresponse.xml
new file mode 100644
index 00000000..b66a6636
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bestandsaenderungen/bestandsaenderungenresponse.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>Abfragen</base:ProzessName>
+ <base:ProzessAnzeigeName>Bestandsaenderung</base:ProzessAnzeigeName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>Bestandsaenderung</base:VorgangName>
+ <base:VorgangAnzeigeName>Bestandsaenderung</base:VorgangAnzeigeName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>true</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-06-01T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:BestandsaenderungenResponse>
+ <zmr:BestandsaenderungenAnfrage>
+ <zmr:BestandsaenderungenInfo>
+ <zmr:AenderungenVon>2004-01-01T00:00:00.000</zmr:AenderungenVon>
+ <zmr:AenderungenBis>2004-07-01T00:00:00.000</zmr:AenderungenBis>
+ <zmr:InclusiveAdressen>true</zmr:InclusiveAdressen>
+ <zmr:Veraenderung>TYP_ZUGANG</zmr:Veraenderung>
+ </zmr:BestandsaenderungenInfo>
+ </zmr:BestandsaenderungenAnfrage>
+ <base:Message>
+ <base:Number>0004</base:Number>
+ <base:Text>Die Abgleichdaten wurden erstellt</base:Text>
+ </base:Message>
+ <zmr:Bestandsaenderungen>
+ <base:GefundeneSaetze>230</base:GefundeneSaetze>
+ <base:AnzahlSaetze>2</base:AnzahlSaetze>
+ <zmr:BestandsaenderungSatz>
+ <zmr:Aenderungszeitpunkt>2004-01-01T08:00:00.000</zmr:Aenderungszeitpunkt>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geschlecht>männlich</Geschlecht>
+ <zmr:Bestandsaenderung>
+ <zmr:Veraenderung>TYP_ZUGANG</zmr:Veraenderung>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>7</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Bestandsaenderung>
+ </zmr:BestandsaenderungSatz>
+ <zmr:BestandsaenderungSatz>
+ <zmr:Aenderungszeitpunkt>2004-01-02T08:00:00.000</zmr:Aenderungszeitpunkt>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <Geburtsdatum>2003-05-07</Geburtsdatum>
+ <Geschlecht>weiblich</Geschlecht>
+ <zmr:Bestandsaenderung>
+ <zmr:Veraenderung>TYP_ZUGANG</zmr:Veraenderung>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:Bestandsaenderung>
+ </zmr:BestandsaenderungSatz>
+ </zmr:Bestandsaenderungen>
+ </zmr:BestandsaenderungenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfragerequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfragerequest.xml
new file mode 100644
index 00000000..73c30b8b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfragerequest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Businesspartnerabfrage_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Businesspartnerabfrage_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>ZMRHTMLClient V4.0</base:Client>
+ </base:ClientInfo>
+ <zmr:BPAbfrageRequest>
+ <zmr:BPAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BPAbfrageAction>SONSTIGES</zmr:BPAbfrageAction>
+ </zmr:BPAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2005-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:BPAbfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfrageresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfrageresponse.xml
new file mode 100644
index 00000000..bd7d3a22
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/bpabfrage/bpabfrageresponse.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <ns1:WorkflowInfoServer xmlns:ns1="http://bmi.gv.at/namespace/zmr-su/base/20040201#">
+ <ns1:ProzessName>GP_Businesspartnerabfrage_erstellen</ns1:ProzessName>
+ <ns1:ProzessAnzeigeName>Businesspartnerabfragen</ns1:ProzessAnzeigeName>
+ <ns1:ProzessInstanzID>62700000000195</ns1:ProzessInstanzID>
+ <ns1:ProzessStatus>C</ns1:ProzessStatus>
+ <ns1:SequenzID>0</ns1:SequenzID>
+ <ns1:Subprozess>
+ <ns1:VorgangName>ZMR_VO_Businesspartnerabfrage_erstellen</ns1:VorgangName>
+ <ns1:VorgangAnzeigeName>Businesspartnerabfrage</ns1:VorgangAnzeigeName>
+ <ns1:VorgangStatus>C</ns1:VorgangStatus>
+ <ns1:Required>false</ns1:Required>
+ <ns1:Visible>true</ns1:Visible>
+ </ns1:Subprozess>
+ </ns1:WorkflowInfoServer>
+ <ns1:ServerInfo xmlns:ns1="http://bmi.gv.at/namespace/zmr-su/base/20040201#">
+ <ns1:GeneriertVon>ZMR-Server</ns1:GeneriertVon>
+ <ns1:GeneriertAm>2005-03-10T13:38:22.617</ns1:GeneriertAm>
+ <ns1:ServerTransaktionNr>32900000000018</ns1:ServerTransaktionNr>
+ </ns1:ServerInfo>
+ <zmr:BPAbfrageResponse>
+ <zmr:BPAbfrageAnfrage>
+ <zmr:BPAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:BPAbfrageAction>SONSTIGES</zmr:BPAbfrageAction>
+ </zmr:BPAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2005-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:BPAbfrageAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden</base:Text>
+ </base:Message>
+ <zmr:BPAbfrageErgebnis>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2005-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Postleitzahl>1160</Postleitzahl>
+ <Ortschaft>Wien,Ottakring</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Ottakringer Straße</Strassenname>
+ <Orientierungsnummer>101</Orientierungsnummer>
+ <Nutzungseinheit>7</Nutzungseinheit>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0003</Nutzungseinheitlaufnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ <zmr:AktMeldesatz>true</zmr:AktMeldesatz>
+ <zmr:PDFDaten>JVBERi0xLjMKJaqrrK0KNCAwIG9iago8PCAvVHlwZSAvSW5mbwovUHJvZHVjZXIgKG51bGwpID4+CmVuZG9iago1IDAgb2JqCjw8IC9MZW5ndGggODA2IC9GaWx0ZXIgL0ZsYXRlRGVjb2RlIAogPj4Kc3RyZWFtCnicnVbbctMwEH33V+ixnaGqpNXNfUsGtwRIWhIDMwUe3FZNMyQOOA4w/XrWt8hOYwpMHqJozp69nN1VhnFweg6EC8pIfB+w4us2YGQecMLww4mQnGoAooWhoQlJvCKfjq6i6exyEk1eDuJocky+kPg18nDCecXTGHMrqVCcaKaoCE1lfJ6sFsuFS9Nk5c6OyYliEFJhgByNt5vcZaskTWvOfR4VChoKUfF8WGcNhRGa1xTJrz5by6iSdQwX7mab5Zu7JN+uCgIZWoEEQpEjhjkgGWNql5gv0I6UYzUQrYSkFlRFOlohkzAWoUfXLs2zZOlSfzV2yzuXufmiSNJfb24f3CJtA+/Xy7lL79yeKQbbRiXb+7M6wigOvpeiGUat1kQq/MaUpQJMGQgmTjJH7oN3wTD+o1AyBKrrdAZf861bLtuxvkq23/Kf64d0s8gfz3oKLY2imumKZIZV+AxgSpksYNlKmS7zPPmaLdJ5m32H9Veccf/D9DnUQAXwujXfXp9eZnnZFbZ0V4jKuWae6CN234tdCD1FNFJSwJ6tiiiwiNAp4tOmaAwxf7B1OMMxPaejySSaRjMfwGAY09GHU+FvRvHJeNaepB5u7HO7446mFxdUwl5ZdvFbHwZnYTv/0W5qy6ytojiDpTkwapglEkcSdEiMklTakNyugtPRipOX6yr9qljUCiMVlqw5XQRaVc5FSI2QpTRFB54odFGU76Ztj5Y9+G7HttGAaG1QeEQXKKUr4n2oQkbJwr/C1kE00D8FcSDlpt64CsoU6qE7AV7Z37Q6RnZVFQo1UkAMh6JRK63GXqj3reHwx9gfI3+c7k8Ht9Tg6g0NVc3KHDxH/eYgYOKP590wLMi9Wxxg2QmqwQyf8z066DA6iG0dr1pj1XX8tFyHeaedDdCvsMblKNoKo2pdhZ/OrWD4UIAh2gK2o61kSLYb7/3O/dOz4TcE69kQuPrrZzpO5m73xh3aEbrY1DX4/UP26BZ5DxL3ADS0M4SV+7xZ0v74Y5127rsdiX8lDIhOiEUW0H5t98HtEDmcgd3DgTG4scIO6f8sXRT/N+i29j4KZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjw8L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEKL0xlbmd0aCAyMDU1Ci9XaWR0aCAxMDgKL0hlaWdodCAzOQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIC9EZXZpY2VSR0IKL0ZpbHRlciAvRmxhdGVEZWNvZGUgCj4+CnN0cmVhbQp4nO1aK7CrOhStPPLI2iuRSCyyEolFIpG1SGQkFllZeWxl5ZXHVlZW8layIA35lZ72zdx572YYhk+ys7Oy9ieBcfxb/mtlvz+U1VAUfb4Tu50oyr6uh04cI02EOFa1bLJTTXZFDwmQ80atfgvxe7+XR11Ph7p1a0KBLBd5/p6zHkVZ9qFqbXcHp2kGPMyyDkcqz0Jf4AyIhIMksJU6L2vqW8hvfEhCjlcfeRTDBNp+/10U31l22W4vHx/fm81ls+GZF9fN5pCmrnAOwdU/My7STA8zWBmvgNt9aoo+VLNtD8s6wif5frtv75hU1WA1sZRkk8LQZEK+O7oKs4lIikuSuKBdDPSm64+PvutcDDEd6Wvo8QJyTLGgkEkSs2aneKi45EXDgwllwsADWnmal0sYZwyn+kkm8rQFeqfN59WBzgWTJITjcAGcMbQsYu3ZVLvrFkbn8PB+hi3DhAPEc9GQZ9APbAzNaUh/0w9oHpJ+dVpp9DTHYMLXLOMhmWlYNGqettthGNZgGNDnAbx1Ywtf8nAhh97MR2mL/J62D6fSrA/kTQzT+ZX4TCfctttbWd76fjydxuvVhgZPcJxOqHCra/hZL4Dj3R96rCOioanqbmc7HwPD+DDVq/xhX8785p7KLgEyw70oDOXDw0dyJXptO95uC8TOZ3l8f8vDfPWowG/A7gp16AvrOmY1uRiGL1esGy9sf1UN2tYgwfF1/okDtUQ/ter74zLEeNDWusGBwAFK+/38uKN3PuP6mueMKTy+DbsG/cbD4XI+h6x4ZYGqPiOaYGxbf0pm8dBib+nEzVHFXF8Tf9x3OvKnOtpLi+5w3HzekkQyDeXrC9C52YsbU0BadPwKgOOSURY9TIezutWCHmbph6+wMxTZMu7rYgVcqzs9xcj64Pok/U4njd5VHSZ6+sllRShZWbAWCHHJ6wYtDL0RAYuRUKtwjO7clC/QauEhmVtiiSGtchxhudJOFT6wawSX/WdWbXfFrwJHW5SgHLLok4rIBDMSStYUWHEkJvY+LunizQ/ZMMLePLdNUnfthn6nlY08rsHDcz/cigIhA2dSDtDlv8ok2Sdpm2Rdomo2zX1mQTzk0sgGQwnh+mImIZZvj4yIJRCX5W1kVYseQ8n8mlauBwAyICF8IO2X6P1K25SS57wuYhqvlNnDe1YuXt9uFW9+OPmoLriZ4MzaIjOPtvKEvESt4xA+bnmOgEL0El+KDpf1Q5jCBev6kE2FfLtVQjzERbcKQztTfaqVAlCUSSPTY7W5U1X7xJdG8hzKLl4p4bxXxLekdPH5w2mYEQmu99AX7gaO2cpVNUU2uBdyfaEyExi1GpSf5HHf/oMit60C64WHblCXyDoljoZ3ifdsK5CwLgSicJtPQaFtBwWaf/34FD4PC1gdWikAlvVyvDzMnK0Aq3gZxYbr2ctggXBcpxVMmHW4Xg5tBawf18MyyCzXm/CLPH9usiL7h+vQsAm8Bvmpl1QtCZs9shedsSxT8QWM78WwKM3FxcKrR8KiX1R4//B5Hj5mr6ltKjczpT80MyJnD3ZxfmpokYLuvBkCLpA+YQjy6I+RC3MF97I/tDPSKHvtdeVk0R4MPbHyXf4Qw4+4C/e599rMGyP7h+ut0hz1M8jfG5oYeqPJG3noLG/9K9DQHqy7iIvsYz+T2zwbU2ytIjy8y1+X8cZLs7Biz6hD02elcKWBYTguP2fLT+WHrt+I+MM3xhQhjk7vHo55s2Wr/lt5aOuwPqaY/Tq27Df5FzEMTOIa6Oxz9YCHP4gpK5G3d9r1resPPTHrNVsup730uP2GwLQVjn5fvleL8zBgEStt2YYowEObMD8GENlI7nz6D92uuTB3P/R/Dm61CBrydxGf/J+1woXeTMDEhZTP3xFT/pY/rcArvn0bpGkGa3uqDG+Gryx9f/T+mfOvFoxize5r6vzz8HqBxzO7Vp8aXw2m3uGsHKMu8DCYX3hdPR2QIH9aUwhg5YJbLJPxhL6IYQKOBRU69b9H30u+oQKEoDLXejqGok5t8Ad16iWdUB8Pu7kLqcm8twYm41rfomsGfTSH163V32KmWK3zvpWa8FOUpQBu0Va/xUS0ulo98CHTCdqRKVmoURMQE0MI4U8s/JpQq9/5uIONc6teAV61nSgnnWEC0tgR6qMvOGTcUg7VYD5MHy7UuVGapOpLpRkauEJHK/6/N/XYDFx4cvro8NEFhk/6Nc2Bn+alzs2AxAYySX5KgJ5C6c9lPhUQqm1N/JWGzTwRmfo8RMW4dzqqdcdONafatfq+ibd9b5uYkP/yTdTN1PdHSIaGnCxKE7PhYMhEW/78UN5bocLpdCKSmocQAh2gCcYOmYeD/JMBrcxPS0SeUNCCIITMyeTnpGHxXLEdCqAvSMvUR2qAUBo6c/OTwvn/hnylFFDzJdui4EI6w2YaDl5x4ITOHCPnixiGwjdxI13RKRw1FOMtSTLO31bG+X/LcemdmBa2aiVF02Au10p29VoaGIuH5IDJw5QYKngpmXyTCxO1I8R5x7gq9W8Je+FX71FFFvROt2PqrImkFWBbzBrrwAtBGcJC78SHeozVUnIVwBBtJbdrOYl0ZZxQbvhD+Vrle/wZZpz9J/mjnQweYiDKdx043nrOEiUJq4G3/DeGc6oV0F3QdRAEDln6LlWff9dIf6ue07eYnrP26aznSAqZn/C2oS2rCWIgIAK81mO00KD/9/Lwf1UYUKSf/JtU/xnlH7uDa8sKZW5kc3RyZWFtCmVuZG9iago3IDAgb2JqCjw8IC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL01lZGlhQm94IFsgMCAwIDU5NSA4NDIgXQovUmVzb3VyY2VzIDMgMCBSCi9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKOCAwIG9iago8PCAvVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL05hbWUgL0YzCi9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcgPj4KZW5kb2JqCjkgMCBvYmoKPDwgL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9OYW1lIC9GMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZyA+PgplbmRvYmoKMSAwIG9iago8PCAvVHlwZSAvUGFnZXMKL0NvdW50IDEKL0tpZHMgWzcgMCBSIF0gPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cKL1BhZ2VzIDEgMCBSCiA+PgplbmRvYmoKMyAwIG9iago8PCAKL0ZvbnQgPDwgL0YzIDggMCBSIC9GMSA5IDAgUiA+PiAKL1Byb2NTZXQgWyAvUERGIC9JbWFnZUMgL1RleHQgXSAvWE9iamVjdCA8PC9JbTEgNiAwIFIgCiA+Pgo+PiAKZW5kb2JqCnhyZWYKMCAxMAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDM1MDQgMDAwMDAgbiAKMDAwMDAwMzU2MiAwMDAwMCBuIAowMDAwMDAzNjEyIDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwOTQ0IDAwMDAwIG4gCjAwMDAwMDMxNzkgMDAwMDAgbiAKMDAwMDAwMzI4NSAwMDAwMCBuIAowMDAwMDAzMzk3IDAwMDAwIG4gCnRyYWlsZXIKPDwKL1NpemUgMTAKL1Jvb3QgMiAwIFIKL0luZm8gNCAwIFIKPj4Kc3RhcnR4cmVmCjM3MjcKJSVFT0YK</zmr:PDFDaten>
+ </zmr:BPAbfrageErgebnis>
+ </zmr:BPAbfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichrequest.xml
new file mode 100644
index 00000000..07c501c6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichrequest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Datenabgleich_anfordern</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Datenabgleich_anfordern</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:DatenabgleichRequest>
+ <zmr:DatenabgleichInfo>
+ <base:GemeindeNr>91601</base:GemeindeNr>
+ <zmr:DatenabgleichAction>AENDERUNGEN</zmr:DatenabgleichAction>
+ <zmr:AbgleichVon>2004-01-01T00:00:00.000</zmr:AbgleichVon>
+ <zmr:AbgleichBis>2004-02-01T00:00:00.000</zmr:AbgleichBis>
+ </zmr:DatenabgleichInfo>
+ </zmr:DatenabgleichRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichresponse.xml
new file mode 100644
index 00000000..86d96963
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/datenabgleich/datenabgleichresponse.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Datenabgleich_anfordern</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Datenabgleich_anfordern</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-06-01T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:DatenabgleichResponse>
+ <zmr:DatenabgleichAnfrage>
+ <zmr:DatenabgleichInfo>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ <zmr:DatenabgleichAction>AENDERUNGEN</zmr:DatenabgleichAction>
+ <zmr:AbgleichVon>2004-01-01T00:00:00.000</zmr:AbgleichVon>
+ <zmr:AbgleichBis>2004-02-01T00:00:00.000</zmr:AbgleichBis>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:DatenabgleichInfo>
+ </zmr:DatenabgleichAnfrage>
+ <base:Message>
+ <base:Number>0004</base:Number>
+ <base:Text>Die Abgleichdaten wurden erstellt</base:Text>
+ </base:Message>
+ <zmr:Datenabgleich>
+ <base:GefundeneSaetze>230</base:GefundeneSaetze>
+ <base:AnzahlSaetze>2</base:AnzahlSaetze>
+ <zmr:DatenabgleichSatz>
+ <zmr:Aenderungszeitpunkt>2004-01-01T08:00:00.000</zmr:Aenderungszeitpunkt>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <Familienname>Mustermann</Familienname>
+ <Vorname>Max</Vorname>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <zmr:PersonAbgleich>
+ <zmr:DatenAktiv>
+ <zmr:Person>
+ <!-- geaenderte Personendaten (ohne Staatsbuergerschaft, Reisedokument, ... -->
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-01T08:00:00.000</base:Von>
+ <base:BeginnCode>PAN</base:BeginnCode>
+ <base:BeginnText>Personensnlage</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ </zmr:NatuerlichePerson>
+ </zmr:Person>
+ </zmr:DatenAktiv>
+ </zmr:PersonAbgleich>
+ </zmr:DatenabgleichSatz>
+ </zmr:Datenabgleich>
+ </zmr:DatenabgleichResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfragerequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfragerequest.xml
new file mode 100644
index 00000000..6e9ad235
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfragerequest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Fremden_abfrage</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Fremden_abfrage</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:FremdenabfrageRequest>
+ <zmr:FremdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:FremdenabfrageAction>NICHT_OESTERREICH</zmr:FremdenabfrageAction>
+ <base:Bezirkskennung>916</base:Bezirkskennung>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ <zmr:AlsDruck>true</zmr:AlsDruck>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:FremdenabfrageInfo>
+ <base:GemeldetVon>2004-01-01T00:00:00.000</base:GemeldetVon>
+ <base:GemeldetBis>2004-01-07T00:00:00.000</base:GemeldetBis>
+ </zmr:FremdenabfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfrageresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfrageresponse.xml
new file mode 100644
index 00000000..7f0adb0d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/fremdenabfrage/fremdenabfrageresponse.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Fremden_abfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Fremden_abfrage</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:FremdenabfrageResponse>
+ <zmr:FremdenabfrageAnfrage>
+ <zmr:FremdenabfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:FremdenabfrageAction>NICHT_OESTERREICH</zmr:FremdenabfrageAction>
+ <base:Bezirkskennung>916</base:Bezirkskennung>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ <zmr:AlsDruck>true</zmr:AlsDruck>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:FremdenabfrageInfo>
+ <base:GemeldetVon>2004-01-01T00:00:00.000</base:GemeldetVon>
+ <base:GemeldetBis>2004-01-07T00:00:00.000</base:GemeldetBis>
+ </zmr:FremdenabfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:PDFDaten>XXYY</zmr:PDFDaten>
+ </zmr:FremdenabfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest1.xml
new file mode 100644
index 00000000..50bd6226
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest1.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_GIS_Adressabfrage</base:ProzessName>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:GISAdressabfrageRequest>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:GISAdressabfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest2.xml
new file mode 100644
index 00000000..86ddb20e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfragerequest2.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_GIS_Adressabfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage_Druck</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>ZMRHTMLClient V3.0</base:Client>
+ </base:ClientInfo>
+ <zmr:GISAdressabfrageDetailRequest>
+ <zmr:Bestaetigt>true</zmr:Bestaetigt>
+ </zmr:GISAdressabfrageDetailRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse1.xml
new file mode 100644
index 00000000..f17c9596
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse1.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_GIS_Adressabfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage_Druck</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:GISAdressabfrageResponse>
+ <zmr:GISAdressabfrageAnfrage>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:GISAdressabfrageAnfrage>
+ <base:Message>
+ <base:Number>023</base:Number>
+ <base:Text>Personen gefunden.</base:Text>
+ </base:Message>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ </zmr:GISAdressabfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse2.xml
new file mode 100644
index 00000000..68018bfc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/gisadressabfrage/gisadressabfrageresponse2.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_GIS_Adressabfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00134</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_GIS_Adressabfrage_Druck</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:GISAdressabfrageDetailResponse>
+ <zmr:GISAdressabfrageAnfrage>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:GISAdressabfrageAnfrage>
+ <base:Message>
+ <base:Number>023</base:Number>
+ <base:Text>Personen gefunden.</base:Text>
+ </base:Message>
+ <zmr:GISAdressabfrageErgebnis>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <PersonenDaten>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2003-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </PersonenDaten>
+ <PersonenDaten>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Ida</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2004-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ <Nutzungseinheit>3</Nutzungseinheit>
+ </Zustelladresse>
+ </PostAdresse>
+ </PersonenDaten>
+ <zmr:PDFDaten>WFhYWVlZ</zmr:PDFDaten>
+ </zmr:GISAdressabfrageErgebnis>
+ </zmr:GISAdressabfrageDetailResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfragerequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfragerequest.xml
new file mode 100644
index 00000000..c35e07e2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfragerequest.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Hauseigentuemerabfrage_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Hauseigentuemerabfrage_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:HauseigentuemerAbfrageRequest>
+ <zmr:HauseigentuemerAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:InclusiveAuskunftsgesperrt>false</zmr:InclusiveAuskunftsgesperrt>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:HauseigentuemerAbfrageInfo>
+ <PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:HauseigentuemerAbfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfrageresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfrageresponse.xml
new file mode 100644
index 00000000..e954abd5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/hauseigentuemerabfrage/hauseigentuemerabfrageresponse.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Hauseigentuemerabfrage_erstellen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Hauseigentuemerabfrage_erstellen</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Hauseigentuemerabfrage_Druck_erstellen</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:HauseigentuemerAbfrageResponse>
+ <zmr:HauseigentuemerAbfrageAnfrage>
+ <zmr:HauseigentuemerAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:InclusiveAuskunftsgesperrt>false</zmr:InclusiveAuskunftsgesperrt>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:HauseigentuemerAbfrageInfo>
+ <PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:HauseigentuemerAbfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:HauseigentuemerAbfrageErgebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:HauseigentuemerAbfrageErgebnis>
+ </zmr:HauseigentuemerAbfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftrequest.xml
new file mode 100644
index 00000000..f67f145e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftrequest.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Meldeauskunft_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Meldeauskunft_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:MeldeauskunftRequest>
+ <zmr:MeldeauskunftInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Ergebnisdaten>
+ <zmr:AlleAktuellenWohnsitze>false</zmr:AlleAktuellenWohnsitze>
+ <zmr:OhneGeburtsdatum>false</zmr:OhneGeburtsdatum>
+ </zmr:Ergebnisdaten>
+ <base:DruckZusatztext>Testdruck 099999</base:DruckZusatztext>
+ </zmr:MeldeauskunftInfo>
+ <base:Bereichskennung>urn:publicid:gv.at:wbpk0009999999</base:Bereichskennung>
+ <base:BPK>000123456789</base:BPK>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2003-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:MeldeauskunftRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftresponse.xml
new file mode 100644
index 00000000..75273ec7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldeauskunft/meldeauskunftresponse.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Meldeauskunft_erstellen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Meldeauskunft_erstellen</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:MeldeauskunftResponse>
+ <zmr:MeldeauskunftAnfrage>
+ <zmr:MeldeauskunftInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Ergebnisdaten>
+ <zmr:AlleAktuellenWohnsitze>false</zmr:AlleAktuellenWohnsitze>
+ <zmr:OhneGeburtsdatum>false</zmr:OhneGeburtsdatum>
+ </zmr:Ergebnisdaten>
+ <base:DruckZusatztext>Testdruck 099999</base:DruckZusatztext>
+ </zmr:MeldeauskunftInfo>
+ <base:Bereichskennung>urn:publicid:gv.at:wbpk0009999999</base:Bereichskennung>
+ <base:BPK>000123456789</base:BPK>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2003-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ </Zustelladresse>
+ </PostAdresse>
+ </zmr:MeldeauskunftAnfrage>
+ <base:Message>
+ <base:Number>123</base:Number>
+ <base:Text>Meldeauskunft erstellt.</base:Text>
+ </base:Message>
+ <zmr:Meldeauskunft>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geburtsdatum>2003-01-01</Geburtsdatum>
+ </NatuerlichePerson>
+ <PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ </Zustelladresse>
+ </PostAdresse>
+ <zmr:AktMeldesatz>true</zmr:AktMeldesatz>
+ <zmr:PDFDaten></zmr:PDFDaten>
+ </zmr:Meldeauskunft>
+ </zmr:MeldeauskunftResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungrequest.xml
new file mode 100644
index 00000000..312e16b7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungrequest.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Meldebestaetigung_erstellen</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Meldebestaetigung_erstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>ZMRHTMLClient V3.0</base:Client>
+ </base:ClientInfo>
+ <zmr:MeldebestaetigungRequest>
+ <zmr:MeldebestaetigungInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:MeldebestaetigungArt>AKTLETZT</zmr:MeldebestaetigungArt>
+ </zmr:MeldebestaetigungInfo>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:MeldebestaetigungRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungresponse.xml
new file mode 100644
index 00000000..e3e4a42b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/meldebestaetigung/meldebestaetigungresponse.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+ <soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Meldebestaetigung_erstellen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Meldebestaetigung_erstellen</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>true</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:MeldebestaetigungResponse>
+ <zmr:MeldebestaetigungAnfrage>
+ <zmr:MeldebestaetigungInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:MeldebestaetigungArt>AKTLETZT</zmr:MeldebestaetigungArt>
+ </zmr:MeldebestaetigungInfo>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:MeldebestaetigungAnfrage>
+ <base:Message>
+ <base:Number>01234</base:Number>
+ <base:Text>Die Meldebestätigung wurde erstellt</base:Text>
+ </base:Message>
+ <zmr:Meldebestaetigung>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2000-01-01</Geburtsdatum>
+ <Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ </Staatsangehoerigkeit>
+ </NatuerlichePerson>
+ <zmr:Meldung>
+ <PostAdresse>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <Zustelladresse>
+ <Strassenname>Teststraße</Strassenname>
+ <Orientierungsnummer>3</Orientierungsnummer>
+ </Zustelladresse>
+ </PostAdresse>
+ <base:GemeldetVon>2000-01-01T00:00:00.000</base:GemeldetVon>
+ </zmr:Meldung>
+ <zmr:AktMeldesatz>true</zmr:AktMeldesatz>
+ <zmr:PDFDaten></zmr:PDFDaten>
+ </zmr:Meldebestaetigung>
+ </zmr:MeldebestaetigungResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/blaetternrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/blaetternrequest.xml
new file mode 100644
index 00000000..a5733f30
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/blaetternrequest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+>
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Militaerbehoerde</base:ProzessName>
+ <base:ProzessInstanzID>37300000000157</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Wehrpflichtige_abfragen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Client>ZMRGUI v4_9_3-04</base:Client>
+ </base:ClientInfo>
+ <base:BlaetternRequest>
+ <base:BlaetternInfo>
+ <base:Richtung>Vor</base:Richtung>
+ <base:AnzahlSaetze>30</base:AnzahlSaetze>
+ </base:BlaetternInfo>
+ </base:BlaetternRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/wehrpflichtigeAbfragenRequst.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/wehrpflichtigeAbfragenRequst.xml
new file mode 100644
index 00000000..1d4d1e1d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/militaerbehoerden/wehrpflichtigeAbfragenRequst.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+>
+ <soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Militaerbehoerde</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Wehrpflichtige_abfragen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Client>ZMRGUI v4_9_3-04</base:Client>
+ </base:ClientInfo>
+ <zmr:WehrpflichtigeAbfragenRequest>
+ <zmr:WehrpflichtigeAbfragenInfo>
+ <zmr:AlsDruck>false</zmr:AlsDruck>
+ <base:AnzahlSaetze>30</base:AnzahlSaetze>
+ </zmr:WehrpflichtigeAbfragenInfo>
+ <cio:Bundesland>Wien</cio:Bundesland>
+ <zmr:GeburtsdatumVon>1980-01-01T00:00:00.000</zmr:GeburtsdatumVon>
+ <zmr:GeburtsdatumBis>1980-02-01T00:00:00.000</zmr:GeburtsdatumBis>
+ <cio:Familienname>A</cio:Familienname>
+ </zmr:WehrpflichtigeAbfragenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/natuerlicheperson.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/natuerlicheperson.xml
new file mode 100644
index 00000000..23958f84
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/natuerlicheperson.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<NatuerlichePerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xsi:schemaLocation="http://reference.e-government.gv.at/namespace/persondata/de/20040201# ../../xsd/eingebunden/PersonDataZMR.xsd">
+
+ <Identification>
+ <Value>000111111111</Value>
+ <Type>ZMR</Type>
+ </Identification>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ <Affix typ="akademischerGrad" position="prefix">Mag. rer. nat.</Affix>
+ </PersonenName>
+ <AlternativName Type="NameVorErsterEhe">
+ <Familienname>Musterfrau</Familienname>
+ </AlternativName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <Sterbedatum>2003-05-07</Sterbedatum>
+ <Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ </Staatsangehoerigkeit>
+</NatuerlichePerson>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest1.xml
new file mode 100644
index 00000000..62449f25
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest1.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_aendern</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_aendern</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonAendernRequest>
+ <zmr:PersonAendernInfo>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:GrundCode>NAMENSAENDERUNG</base:GrundCode>
+ </zmr:PersonAendernInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>2434</base:EntityID>
+ <base:LetzteAenderung>2003-03-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:PersonAenderung>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Anna</Vorname> <!--Umbenennung auf Anna-->
+ </zmr:PersonenName>
+ </zmr:NatuerlichePerson>
+ <base:Titel></base:Titel> <!-- Feld Titel wird gelöscht-->
+ </zmr:PersonAenderung>
+ </zmr:PersonAendernRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest2.xml
new file mode 100644
index 00000000..c93c5b72
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernrequest2.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_aendern</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_aendern</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonAendernRequest>
+ <zmr:PersonAendernInfo>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:GrundCode>XXX</base:GrundCode>
+ </zmr:PersonAendernInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>2434</base:EntityID>
+ <base:LetzteAenderung>2003-03-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:ReisedokumentAenderung>
+ <base:EntityReferenz>
+ <base:EntityID>0004</base:EntityID>
+ </base:EntityReferenz>
+ <base:Beendigung>true</base:Beendigung>
+ <!-- Das Reisedokument wird fachlich beendet, andere Felder werden nicht geändert.
+ Es könnten auch andere Felder hier zugleich mit der Beendigung noch verändert werden.
+ Die Beendigung ist nicht an das Feld DokumentGiltBis gekoppelt
+ -->
+ </zmr:ReisedokumentAenderung>
+ </zmr:PersonAendernRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse1.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse1.xml
new file mode 100644
index 00000000..dde7e494
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse1.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Person_aendern</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_aendern</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAendernResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Person wurde geändert</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>NAMENSAENDERUNG</base:BeginnCode>
+ <base:BeginnText>Namensänderung</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Anna</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <AlternativName Type="NameVorErsterEhe">
+ <Familienname>Huber</Familienname>
+ </AlternativName>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:PersonAendernResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse2.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse2.xml
new file mode 100644
index 00000000..d824dfac
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personaendern/personaendernresponse2.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Person_aendern</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_aendern</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAendernResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Personendaten wurden geändert</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>2434</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Anna</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <AlternativName Type="NameVorErsterEhe">
+ <Familienname>Huber</Familienname>
+ </AlternativName>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0004</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:Reisedokument>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0004</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <!-- Nulldauersatz des beendeten Reisedokuments -->
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_AENDERN</base:BeginnCode>
+ <base:BeginnText>Reisedokument geändert</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:DokumentArt>Reisedokument</base:DokumentArt>
+ <base:DokumentNummer>123</base:DokumentNummer>
+ <base:AusstellDatum>2003-01-01</base:AusstellDatum>
+ <base:Ausstellungsstaat>Libyen</base:Ausstellungsstaat>
+ <base:DokumentGiltBis>2004-01-26T00:00:00.000</base:DokumentGiltBis>
+ </zmr:Reisedokument>
+ </zmr:PersonErgebnis>
+ </zmr:PersonAendernResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenrequest.xml
new file mode 100644
index 00000000..c9d604cd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenrequest.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_anlegen</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_anlegen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonAnlegenRequest>
+ <zmr:PersonAnlegenInfo>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:GrundCode>GEBURT</base:GrundCode>
+ </zmr:PersonAnlegenInfo>
+ <zmr:PersonAnlage>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonAnlage>
+ <zmr:MeldungAnlage>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <zmr:Zustelladresse>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1234567</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ <!-- Offizielle Adresse, es müssen nur die Adresscodes geschickt werden-->
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ </zmr:Wohnsitz>
+ </zmr:MeldungAnlage>
+ </zmr:PersonAnlegenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenresponse.xml
new file mode 100644
index 00000000..dbc29ee8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personanlegen/personanlegenresponse.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Person_anlegen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_anlegen</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAnlegenResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Person wurde angelegt</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit angelegt</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:PersonAnlegenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternrequest.xml
new file mode 100644
index 00000000..57395ab5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternrequest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <!-- Die InstanzID der laufenden Prozesses muss hier übermittelt werden, um die Suche fortzusetzen (aus WorkflowInfoServer des ersten Suchergebnisses-->
+ <base:SequenzID>00034</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Person_abfragen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <base:BlaetternRequest>
+ <base:BlaetternInfo>
+ <base:Richtung>Vor</base:Richtung>
+ <base:AnzahlSaetze>3</base:AnzahlSaetze>
+ </base:BlaetternInfo>
+ </base:BlaetternRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternresponse.xml
new file mode 100644
index 00000000..50e831f2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/blaetternresponse.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_abfragen</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonenAbfrageResponse>
+ <zmr:PersonenAbfrageAnfrage>
+ <zmr:PersonenAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonenAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonenAbfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:PersonenAbfrageErgebnis>
+ <base:GefundeneSaetze>4</base:GefundeneSaetze>
+ <base:SaetzeVon>3</base:SaetzeVon>
+ <!-- Es wurde weitergeblättert - der letzte Satz wird geliefert -->
+ <base:SaetzeBis>4</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:PersonenAbfrageErgebnis>
+ </zmr:PersonenAbfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckrequest.xml
new file mode 100644
index 00000000..2a6cc5e0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckrequest.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_abfragen_drucken</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonenAbfrageDruckRequest>
+ <base:EntityID>00001</base:EntityID>
+ <base:EntityID>00008</base:EntityID>
+ <base:EntityID>00003</base:EntityID>
+ </zmr:PersonenAbfrageDruckRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckresponse.xml
new file mode 100644
index 00000000..6463624b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragedruckresponse.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_abfragen_drucken</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonenAbfrageDruckResponse>
+ <zmr:PersonenAbfrageAnfrage>
+ <zmr:PersonenAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonenAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonenAbfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Die Druckdaten wurden aufbereitet</base:Text>
+ </base:Message>
+ <zmr:PDFDaten>XXYY</zmr:PDFDaten>
+ </zmr:PersonenAbfrageDruckResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragerequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragerequest.xml
new file mode 100644
index 00000000..a856e8ab
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfragerequest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_abfragen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonenAbfrageRequest>
+ <zmr:PersonenAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonenAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonenAbfrageRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfrageresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfrageresponse.xml
new file mode 100644
index 00000000..70b6aef3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personenabfrage/personenabfrageresponse.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Verknuepfungsanfrage</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_abfragen</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonenAbfrageResponse>
+ <zmr:PersonenAbfrageAnfrage>
+ <zmr:PersonenAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonenAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonenAbfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:PersonenAbfrageErgebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:PersonenAbfrageErgebnis>
+ </zmr:PersonenAbfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternrequest.xml
new file mode 100644
index 00000000..4458527e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternrequest.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_suchen_Meldevorgang</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <!-- Die InstanzID der laufenden Prozesses muss hier übermittelt werden, um die Suche fortzusetzen (aus WorkflowInfoServer des ersten Suchergebnisses-->
+ <base:SequenzID>00034</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <base:BlaetternRequest>
+ <base:BlaetternInfo>
+ <base:Richtung>Vor</base:Richtung>
+ <base:AnzahlSaetze>3</base:AnzahlSaetze>
+ </base:BlaetternInfo>
+ </base:BlaetternRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternresponse.xml
new file mode 100644
index 00000000..f082c3cc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/blaetternresponse.xml
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Person_suchen_Meldevorgang</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonenAbfrageResponse>
+ <zmr:PersonenAbfrageAnfrage>
+ <zmr:PersonenAbfrageInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonenAbfrageInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonenAbfrageAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:PersonenAbfrageErgebnis>
+ <base:GefundeneSaetze>4</base:GefundeneSaetze>
+ <base:SaetzeVon>3</base:SaetzeVon>
+ <!-- Es wurde weitergeblättert - der letzte Satz wird geliefert -->
+ <base:SaetzeBis>4</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:PersonenAbfrageErgebnis>
+ </zmr:PersonenAbfrageResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucherequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucherequest.xml
new file mode 100644
index 00000000..ca8bf47e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucherequest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_suchen_Meldevorgang</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonSuchenRequest>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonSuchenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucheresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucheresponse.xml
new file mode 100644
index 00000000..5a2526fa
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personensuche/personensucheresponse.xml
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Person_suchen_Meldevorgang</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>A</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZPR_VO_Person_suchen_Meldevorgang</base:VorgangName>
+ <base:VorgangStatus>A</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Test</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>Max</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </PersonenName>
+ </NatuerlichePerson>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>0003</base:Number>
+ <base:Text>Es wurde 1 Personen im ZMR gefunden</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <!-- 1. gelieferte Person im Suchergebnis (Personendaten + Meldedaten, historisch und aktuell) -->
+ <zmr:Personendaten>
+ <!-- Historienliste der Personendaten. Nur ein PersonErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:PersonErgebnis>
+ <!-- aktueller Personendaten Gesamtdatensatz -->
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Person-Gesamtdatensatzes (mit Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Person-Entity (ohne Staatsangehörigkeiten, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>AMKOR</base:BeginnCode>
+ <base:BeginnText>Amtliche Korrektur</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Maximilian</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ <zmr:PersonErgebnis>
+ <!-- historischer Personendaten Gesamtdatensatz (durch Vornamen-Änderung entstanden. Die Staatsagehörigkeit wurde nicht geändert und ist somit mit der im aktuellen Satz identisch-->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>GEBURT</base:BeginnCode>
+ <base:BeginnText>Geburt</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <zmr:PersonenName>
+ <Vorname>Hans</Vorname>
+ <Familienname>Mustermann</Familienname>
+ </zmr:PersonenName>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>2001-05-07</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2003-01-01T00:00:00.000</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ </base:Organisation>
+ <base:Benutzer>test@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <!-- Historienliste einer Meldung. Nur ein MeldungErgebnis-Element, wenn nur aktuelle Daten -->
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <!-- letzter Änderungs-Zeitpunkt des Meldung-Gesamtdatensatzes (mit Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <!-- letzter Änderungs-Zeitpunkt der Meldung-Entity (ohne Auskunftssperren, ...)-->
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennenrequest.xml
new file mode 100644
index 00000000..82643121
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennenrequest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_trennen</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <!-- Die InstanzID der laufenden Prozesses muss hier übermittelt werden, um die Suche fortzusetzen (aus WorkflowInfoServer des ersten Suchergebnisses-->
+ <base:SequenzID>11111</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Person_trennen_durchfuehren</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonTrennenRequest>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>123</base:EntityID>
+ <base:LetzteAenderung>2004-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:MeldungReferenz>
+ <base:Technisch>
+ <base:EntityID>1234</base:EntityID>
+ <base:LetzteAenderung>2004-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <Wohnsitzqualitaet>N</Wohnsitzqualitaet>
+ </zmr:MeldungReferenz>
+ </zmr:PersonTrennenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennensucherequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennensucherequest.xml
new file mode 100644
index 00000000..2ab231dd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/persontrennen/persontrennensucherequest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_trennen</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_trennen_darstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonTrennenSucheRequest>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonTrennenSucheRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrenrequest.xml
new file mode 100644
index 00000000..0442b0e0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrenrequest.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_zusammenfuehren</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <!-- Die InstanzID der laufenden Prozesses muss hier übermittelt werden, um die Suche fortzusetzen (aus WorkflowInfoServer des ersten Suchergebnisses-->
+ <base:SequenzID>11111</base:SequenzID>
+ <base:VorgangName>ZPR_VO_Person_zusammenfuehren_durchfuehren</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonZusammenfuehrenRequest>
+ <zmr:QuellpersonReferenz>
+ <base:Technisch>
+ <base:EntityID>123</base:EntityID>
+ <base:LetzteAenderung>2004-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:QuellpersonReferenz>
+ <zmr:ZielpersonReferenz>
+ <base:Technisch>
+ <base:EntityID>222</base:EntityID>
+ <base:LetzteAenderung>2004-02-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000222222222</base:ZMRZahl>
+ </zmr:ZielpersonReferenz>
+ </zmr:PersonZusammenfuehrenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrensucherequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrensucherequest.xml
new file mode 100644
index 00000000..be5b38ba
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/personzusammenfuehren/personzusammenfuehrensucherequest.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Person_zusammenfuehren</base:ProzessName>
+ <base:VorgangName>ZPR_VO_Person_zusammenfuehren_darstellen</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:PersonZusammenfuehrenSucheRequest>
+ <zmr:QuellpersonZMRZahl>000111111111</zmr:QuellpersonZMRZahl>
+ <zmr:ZielpersonZMRZahl>000222222222</zmr:ZielpersonZMRZahl>
+ </zmr:PersonZusammenfuehrenSucheRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenrequest.xml
new file mode 100644
index 00000000..69675bd3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenrequest.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Wohnsitz_abmelden</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Wohnsitz_abmelden</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:WohnsitzAbmeldenRequest>
+ <zmr:WohnsitzAbmeldenInfo>
+ <!-- Fachlicher Zeitpunkt der Abmeldung -->
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:GrundCode>WSABM</base:GrundCode>
+ </zmr:WohnsitzAbmeldenInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:MeldungReferenz>
+ <base:Technisch>
+ <base:EntityID>0000002</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:MeldungReferenz>
+ </zmr:WohnsitzAbmeldenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenresponse.xml
new file mode 100644
index 00000000..a1f2a361
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzabmelden/wohnsitzabmeldenresponse.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Wohnsitz_abmelden</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Wohnsitz_abmelden</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:WohnsitzAbmeldenResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Der Wohnsitz wurde abgemeldet</base:Text>
+ </base:Message>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000002</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <!-- Nulldauersatz der abgemeldeten Meldung -->
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSABM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz abmelden</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2003-01-01T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSABM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz abmelden</base:PeriodeText>
+ <base:GemeldetBis>2004-01-26T00:00:00.000</base:GemeldetBis>
+ </zmr:MeldungErgebnis>
+ </zmr:WohnsitzAbmeldenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenrequest.xml
new file mode 100644
index 00000000..44ebbb56
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenrequest.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Wohnsitz_anmelden</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Wohnsitz_anmelden</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:WohnsitzAnmeldenRequest>
+ <zmr:WohnsitzAnmeldenInfo>
+ <!-- Fachlicher Zeitpunkt der Anmeldung -->
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:GrundCode>WSANM</base:GrundCode>
+ </zmr:WohnsitzAnmeldenInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:MeldungAnlage>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <zmr:Zustelladresse>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1234567</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ <!-- Offizielle Adresse, es müssen nur die Adresscodes geschickt werden-->
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ </zmr:Wohnsitz>
+ </zmr:MeldungAnlage>
+ </zmr:WohnsitzAnmeldenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenresponse.xml
new file mode 100644
index 00000000..ccbc350d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzanmelden/wohnsitzanmeldenresponse.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Wohnsitz_anmelden</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Wohnsitz_anmelden</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:WohnsitzAnmeldenResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Der Wohnsitz wurde angemeldet</base:Text>
+ </base:Message>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>00000002</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1234567</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ </zmr:MeldungErgebnis>
+ </zmr:WohnsitzAnmeldenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenrequest.xml
new file mode 100644
index 00000000..039626bb
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenrequest.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Wohnsitz_ummelden</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Wohnsitz_ummelden</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:WohnsitzUmmeldenRequest>
+ <zmr:WohnsitzUmmeldenInfo>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <zmr:UmmeldungAktion>HWS_NWS_HWS</zmr:UmmeldungAktion>
+ </zmr:WohnsitzUmmeldenInfo>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:UMMVorgang1>
+ <!-- Hauptwohnsitz wird abgemeldet -->
+ <zmr:MeldungReferenz>
+ <base:Technisch>
+ <base:EntityID>0000003</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ </zmr:MeldungReferenz>
+ </zmr:UMMVorgang1>
+ <zmr:UMMVorgang2>
+ <!-- neuer Hauptwohnsitz wird angemeldet -->
+ <zmr:MeldungAnlage>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <zmr:Zustelladresse>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1234567</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ <!-- Offizielle Adresse, es müssen nur die Adresscodes geschickt werden-->
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ </zmr:Wohnsitz>
+ </zmr:MeldungAnlage>
+ </zmr:UMMVorgang2>
+ </zmr:WohnsitzUmmeldenRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenresponse.xml
new file mode 100644
index 00000000..1af5a374
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/wohnsitzummelden/wohnsitzummeldenresponse.xml
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Wohnsitz_ummelden</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Wohnsitz_ummelden</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:WohnsitzUmmeldenResponse>
+ <base:Message>
+ <base:Number>1234</base:Number>
+ <base:Text>Ummeldung erfolgreich durchgeführt</base:Text>
+ </base:Message>
+ <zmr:PersonReferenz>
+ <base:Technisch>
+ <base:EntityID>0000001</base:EntityID>
+ <base:LetzteAenderung>2003-01-01T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ </zmr:PersonReferenz>
+ <zmr:UMMErgebnis1>
+ <!-- Nulldauersatz des abgemelden Hauptwohnsitzes -->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000003</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>HWS_ABM_HWS</base:BeginnCode>
+ <base:BeginnText>Hauptwohnsitz wird abgemeldet, neuer Hauptwohnsitz</base:BeginnText>
+ <base:Bis>2004-01-26T00:00:00.000</base:Bis>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>2</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1111111</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2003-01-01T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>HWS_ABM_HWS</base:PeriodeCode>
+ <base:PeriodeText>Hauptwohnsitz wird abgemeldet, neuer Hauptwohnsitz</base:PeriodeText>
+ <base:GemeldetBis>2004-01-26T00:00:00.000</base:GemeldetBis>
+ </zmr:UMMErgebnis1>
+ <zmr:UMMErgebnis2>
+ <!-- Neu angemelder Hauptwohnsitz -->
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>0000012</base:EntityID>
+ <base:LetzteAenderung>2004-01-26T00:00:00.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2004-01-26T00:00:00.000</base:Von>
+ <base:BeginnCode>HWS_ABM_HWS</base:BeginnCode>
+ <base:BeginnText>Hauptwohnsitz wird abgemeldet, neuer Hauptwohnsitz</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:BehoerdenNr>099999</base:BehoerdenNr>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>1245</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09999</Gemeindekennziffer>
+ <Ortschaft>Testort</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Teststrasse</Strassenname>
+ <Orientierungsnummer>1</Orientierungsnummer>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>1234567</Adresscode>
+ <Subcode>111</Subcode>
+ <Objektnummer>1111111</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>XXX000</base:Adressstatus>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2004-01-26T00:00:00.000</base:GemeldetVon>
+ <base:PeriodeCode>HWS_ABM_HWS</base:PeriodeCode>
+ <base:PeriodeText>Hauptwohnsitz wird abgemeldet, neuer Hauptwohnsitz</base:PeriodeText>
+ </zmr:UMMErgebnis2>
+ </zmr:WohnsitzUmmeldenResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungrequest.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungrequest.xml
new file mode 100644
index 00000000..35dae59d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungrequest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Request>
+ <base:WorkflowInfoClient>
+ <base:ProzessName>GP_Zuzugsbestaetigung_anfordern</base:ProzessName>
+ <base:VorgangName>ZMR_VO_Zuzugsbestaetigung_anfordern</base:VorgangName>
+ </base:WorkflowInfoClient>
+ <base:ClientInfo>
+ <base:Organisation>
+ <base:BehoerdenNr>000000</base:BehoerdenNr>
+ </base:Organisation>
+ <base:Client>Test</base:Client>
+ </base:ClientInfo>
+ <zmr:ZuzugsbestaetigungRequest>
+ <zmr:ZuzugsbestaetigungInfo>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ <zmr:ZuzugsbestaetigungVon>2004-01-01T00:00:00.000</zmr:ZuzugsbestaetigungVon>
+ <zmr:ZuzugsbestaetigungBis>2004-01-05T00:00:00.000</zmr:ZuzugsbestaetigungBis>
+ </zmr:ZuzugsbestaetigungInfo>
+ </zmr:ZuzugsbestaetigungRequest>
+ </base:Request>
+ </soap:Body>
+</soap:Envelope> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungresponse.xml b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungresponse.xml
new file mode 100644
index 00000000..a9ef5a38
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/testxml/zmr/zuzugsbestaetigung/zuzugsbestaetigungresponse.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/ ../../soapenv.xsd http://bmi.gv.at/namespace/zmr-su/base/20040201# ../../../xsd/allgemein/Service.xsd http://bmi.gv.at/namespace/zmr-su/zmr/20040201# ../../../xsd/zmr/ZMRProxy.xsd">
+<soap:Body>
+ <base:Response>
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_Zuzugsbestaetigung_anfordern</base:ProzessName>
+ <base:ProzessInstanzID>1234</base:ProzessInstanzID>
+ <base:ProzessStatus>C</base:ProzessStatus>
+ <base:SequenzID>00034</base:SequenzID>
+ <base:Subprozess>
+ <base:VorgangName>ZMR_VO_Zuzugsbestaetigung_anfordern</base:VorgangName>
+ <base:VorgangStatus>C</base:VorgangStatus>
+ <base:Required>false</base:Required>
+ <base:Visible>true</base:Visible>
+ </base:Subprozess>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR Server</base:GeneriertVon>
+ <base:GeneriertAm>2004-01-26T00:00:00.000</base:GeneriertAm>
+ <base:ServerTransaktionNr>1234567</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:ZuzugsbestaetigungResponse>
+ <zmr:ZuzugsbestaetigungAnfrage>
+ <zmr:ZuzugsbestaetigungInfo>
+ <base:GemeindeNr>09999</base:GemeindeNr>
+ <zmr:ZuzugsbestaetigungVon>2004-01-01T00:00:00.000</zmr:ZuzugsbestaetigungVon>
+ <zmr:ZuzugsbestaetigungBis>2004-01-05T00:00:00.000</zmr:ZuzugsbestaetigungBis>
+ </zmr:ZuzugsbestaetigungInfo>
+ </zmr:ZuzugsbestaetigungAnfrage>
+ <base:Message>
+ <base:Number>0012</base:Number>
+ <base:Text>Die Zuzugsdaten wurden erzeugt</base:Text>
+ </base:Message>
+ <zmr:Zuzugsbestaetigung>
+ <base:GefundeneSaetze>100</base:GefundeneSaetze>
+ <base:AnzahlSaetze>2</base:AnzahlSaetze>
+ <zmr:ZuzugsbestaetigungSatz>
+ <zmr:ZugezogenPerson>
+ <base:ZMRZahl>000111111111</base:ZMRZahl>
+ <Familienname>Mustermann</Familienname>
+ <Vorname>Max</Vorname>
+ <Geburtsdatum>2000-01-01</Geburtsdatum>
+ </zmr:ZugezogenPerson>
+ <zmr:ZugezogenAm>2004-01-01T00:00:00.000</zmr:ZugezogenAm>
+ <zmr:ZugezogenGemeindeNr>09999</zmr:ZugezogenGemeindeNr>
+ <zmr:ZugezogenGemeinde>Testgemeinde</zmr:ZugezogenGemeinde>
+ </zmr:ZuzugsbestaetigungSatz>
+ <zmr:ZuzugsbestaetigungSatz>
+ <zmr:ZugezogenPerson>
+ <base:ZMRZahl>000111111112</base:ZMRZahl>
+ <Familienname>Mustermann</Familienname>
+ <Vorname>Ida</Vorname>
+ <Geburtsdatum>2001-01-01</Geburtsdatum>
+ </zmr:ZugezogenPerson>
+ <zmr:ZugezogenAm>2004-01-02T00:00:00.000</zmr:ZugezogenAm>
+ <zmr:ZugezogenGemeindeNr>09999</zmr:ZugezogenGemeindeNr>
+ <zmr:ZugezogenGemeinde>Testgemeinde</zmr:ZugezogenGemeinde>
+ </zmr:ZuzugsbestaetigungSatz>
+ </zmr:Zuzugsbestaetigung>
+ </zmr:ZuzugsbestaetigungResponse>
+ </base:Response>
+ </soap:Body>
+</soap:Envelope>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Messages.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Messages.xsd
new file mode 100644
index 00000000..112598a4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Messages.xsd
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Messages.xsd
+Zweck: Definiert die Message-Datentypen fuer Services Request und Response (siehe Service.wsdl)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-09-29 teo: Schnittstellen-Liste aktualisiert
+2005-05-24 tsch: BPKPruefung hinzugefuegt
+2005-02-02 tsch: QKZBearbeiten, QKZAuswertung hinzugefuegt
+2005-01-14 tsch: Aviso aktivieren entfernt, Gleichstzungtabelle Warten hinzugefuegt
+2004-11-26 tsch: Adoption, Steuerfahndung, Aviso freischalten/aktivieren hinzugefuegt
+2004-11-22 tsch: Gerichtskommissaerabfrage hinzugefuegt
+2004-09-28 tsch: Wehrfplichtigenanfrage, ablaufende Auskunfssperren-Suche hinzugefuegt
+2004-09-27 tsch: Storno/Korrektur hinzugefuegt
+2004-09-09 tsch: SZR-Vorgaenge sowie Person trennen/zusammenfuehren hinzugefuegt
+2004-07-30 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../xsd/eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../xsd/allgemein/GeschaeftsprozesseAuflisten.xsd"/>
+ <xsd:include schemaLocation="../xsd/allgemein/Benutzereinstellungen.xsd"/>
+ <xsd:include schemaLocation="../xsd/allgemein/Organisationseinstellungen.xsd"/>
+ <xsd:include schemaLocation="../xsd/allgemein/Auswertungen.xsd"/>
+ <xsd:include schemaLocation="../xsd/allgemein/BasTabelleAbfrage.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" schemaLocation="../xsd/zmr/ZMRProxy.xsd"/>
+
+
+ <xsd:complexType name="RequestType">
+ <xsd:sequence>
+ <xsd:element ref="base:WorkflowInfoClient"/>
+ <xsd:element ref="base:ClientInfo"/>
+ <xsd:choice>
+ <xsd:element ref="base:BlaetternRequest"/>
+ <xsd:element ref="base:WorkflowsAuflistenRequest"/>
+ <xsd:element ref="base:BenutzereinstellungenAbfragenRequest"/>
+ <xsd:element ref="base:BenutzereinstellungenAendernRequest"/>
+ <xsd:element ref="base:OrganisationseinstellungenAendernRequest"/>
+ <xsd:element ref="base:AuswertungenAuflistenRequest"/>
+ <xsd:element ref="base:AuswertungAbgeholtRequest"/>
+ <xsd:element ref="base:BasTabelleAbfrageRequest"/>
+ <xsd:element ref="zmr:PersonSuchenRequest"/>
+ <xsd:element ref="zmr:PersonAnlegenRequest"/>
+ <xsd:element ref="zmr:PersonAendernRequest"/>
+ <xsd:element ref="zmr:AdresssucheRequest"/>
+ <xsd:element ref="zmr:WohnsitzAnmeldenRequest"/>
+ <xsd:element ref="zmr:WohnsitzAbmeldenRequest"/>
+ <xsd:element ref="zmr:WohnsitzUmmeldenRequest"/>
+ <xsd:element ref="zmr:MeldebestaetigungRequest"/>
+ <xsd:element ref="zmr:MeldeauskunftRequest"/>
+ <xsd:element ref="zmr:DatenabgleichRequest"/>
+ <xsd:element ref="zmr:AvisosucheRequest"/>
+ <xsd:element ref="zmr:AvisoAnlegenRequest"/>
+ <xsd:element ref="zmr:AvisoAendernRequest"/>
+ <xsd:element ref="zmr:AvisoBeendenRequest"/>
+ <xsd:element ref="zmr:AvisoFreigebenSucheRequest"/>
+ <xsd:element ref="zmr:AvisoFreigebenRequest"/>
+ <xsd:element ref="zmr:BPAbfrageRequest"/>
+ <xsd:element ref="zmr:BPAbfrageErweitertRequest"/>
+ <xsd:element ref="zmr:BusinesspartnerAnfrageRequest"/>
+ <xsd:element ref="zmr:BehoerdenabfrageRequest"/>
+ <xsd:element ref="zmr:BestandsaenderungenRequest"/>
+ <xsd:element ref="zmr:FremdenabfrageRequest"/>
+ <xsd:element ref="zmr:HauseigentuemerAbfrageRequest"/>
+ <xsd:element ref="zmr:HauseigentuemerAbfrageDruckRequest"/>
+ <xsd:element ref="zmr:PersonenAbfrageRequest"/>
+ <xsd:element ref="zmr:PersonenAbfrageDruckRequest"/>
+ <xsd:element ref="zmr:ZuzugsbestaetigungRequest"/>
+ <xsd:element ref="zmr:PersonTrennenSucheRequest"/>
+ <xsd:element ref="zmr:PersonTrennenRequest"/>
+ <xsd:element ref="zmr:PersonZusammenfuehrenSucheRequest"/>
+ <xsd:element ref="zmr:PersonZusammenfuehrenRequest"/>
+ <xsd:element ref="zmr:SZRPersonenbindungRequest"/>
+ <xsd:element ref="zmr:SzrAbfrageRequest"/>
+ <xsd:element ref="zmr:SZRPersonensucheRequest"/>
+ <xsd:element ref="zmr:SZREinzelabfrageRequest"/>
+ <xsd:element ref="zmr:BehoerdenattributeAendernRequest"/>
+ <xsd:element ref="zmr:StornoDarstellenRequest"/>
+ <xsd:element ref="zmr:StornoRequest"/>
+ <xsd:element ref="zmr:PersonKorrigierenRequest"/>
+ <xsd:element ref="zmr:WohnsitzKorrigierenRequest"/>
+ <xsd:element ref="zmr:WehrpflichtigeAbfragenRequest"/>
+ <xsd:element ref="zmr:AblaufendeAuskunftssperrenSucheRequest"/>
+ <xsd:element ref="zmr:GerichtskommissaerabfrageRequest"/>
+ <xsd:element ref="zmr:ObjektsucheSteuerfahndungRequest"/>
+ <xsd:element ref="zmr:ObjektsucheMindestsicherungRequest"/>
+ <xsd:element ref="zmr:AdoptionRequest"/>
+ <xsd:element ref="zmr:GleichsetzungAbfragenRequest"/>
+ <xsd:element ref="zmr:GleichsetzungAnlegenRequest"/>
+ <xsd:element ref="zmr:GleichsetzungLoeschenRequest"/>
+ <xsd:element ref="zmr:QKZBearbeitenRequest"/>
+ <xsd:element ref="zmr:QKZAuswertungRequest"/>
+ <xsd:element ref="zmr:BPKPruefungRequest"/>
+ <xsd:element ref="zmr:MeldungHistKorrigierenRequest"/>
+ <xsd:element ref="zmr:MeldebestaetigungenAnfordernRequest"/>
+ <xsd:element ref="zmr:TechnischeAnsichtRequest"/>
+ <xsd:element ref="zmr:AuskunftssperreAendernRequest"/>
+ <xsd:element ref="zmr:UmmSrvAbfrageRequest"/>
+ <xsd:element ref="zmr:GISSucheRequest"/>
+ <xsd:element ref="zmr:PersonenListenRequest"/>
+ <xsd:element ref="zmr:AnwendungsintegrationRequest"/>
+ <xsd:element ref="zmr:AnwendungsintegrationWiederholungRequest"/>
+ <xsd:element ref="zmr:ORFGISAnforderungRequest"/>
+ <xsd:element ref="zmr:IAPPersonenUeberblickRequest"/>
+ <xsd:element ref="zmr:IAPPersonenDetailRequest"/>
+ <xsd:element ref="zmr:ErnpRequest"/>
+ <xsd:element ref="zmr:BuergerPersonensucheRequest"/>
+ <xsd:element ref="zmr:BuergerMitbewohnersucheRequest"/>
+ <xsd:element ref="zmr:BuergerWohnsitzAnmeldenRequest"/>
+ <xsd:element ref="zmr:BuergerWohnsitzAbmeldenRequest"/>
+ <xsd:element ref="zmr:BuergerWohnsitzUmmeldenRequest"/>
+ <xsd:element ref="zmr:GemeindeeinstellungenRequest"/>
+ <xsd:element ref="zmr:GemeindeeinstellungenAendernRequest"/>
+ <xsd:element ref="zmr:SperrlisteRequest"/>
+ <xsd:element ref="zmr:SperrlisteAnlegenRequest"/>
+ <xsd:element ref="zmr:SperrlisteLoeschenRequest"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ResponseType">
+ <xsd:sequence>
+ <xsd:element ref="base:WorkflowInfoServer"/>
+ <xsd:element ref="base:ServerInfo"/>
+ <xsd:choice>
+ <xsd:element ref="base:WorkflowsAuflistenResponse"/>
+ <xsd:element ref="base:BenutzereinstellungenAbfragenResponse"/>
+ <xsd:element ref="base:BenutzereinstellungenAendernResponse"/>
+ <xsd:element ref="base:OrganisationseinstellungenAendernResponse"/>
+ <xsd:element ref="base:AuswertungenAuflistenResponse"/>
+ <xsd:element ref="base:AuswertungAbgeholtResponse"/>
+ <xsd:element ref="base:BasTabelleAbfrageResponse"/>
+ <xsd:element ref="zmr:PersonSuchenResponse"/>
+ <xsd:element ref="zmr:PersonAnlegenResponse"/>
+ <xsd:element ref="zmr:PersonAendernResponse"/>
+ <xsd:element ref="zmr:AdresssucheResponse"/>
+ <xsd:element ref="zmr:WohnsitzAnmeldenResponse"/>
+ <xsd:element ref="zmr:WohnsitzAbmeldenResponse"/>
+ <xsd:element ref="zmr:WohnsitzUmmeldenResponse"/>
+ <xsd:element ref="zmr:MeldebestaetigungResponse"/>
+ <xsd:element ref="zmr:MeldeauskunftResponse"/>
+ <xsd:element ref="zmr:DatenabgleichResponse"/>
+ <xsd:element ref="zmr:AvisosucheResponse"/>
+ <xsd:element ref="zmr:AvisoAnlegenResponse"/>
+ <xsd:element ref="zmr:AvisoAendernResponse"/>
+ <xsd:element ref="zmr:AvisoBeendenResponse"/>
+ <xsd:element ref="zmr:AvisoFreigebenSucheResponse"/>
+ <xsd:element ref="zmr:AvisoFreigebenResponse"/>
+ <xsd:element ref="zmr:BPAbfrageResponse"/>
+ <xsd:element ref="zmr:BPAbfrageErweitertResponse"/>
+ <xsd:element ref="zmr:BusinesspartnerAnfrageResponse"/>
+ <xsd:element ref="zmr:BehoerdenabfrageResponse"/>
+ <xsd:element ref="zmr:BestandsaenderungenResponse"/>
+ <xsd:element ref="zmr:FremdenabfrageResponse"/>
+ <xsd:element ref="zmr:HauseigentuemerAbfrageResponse"/>
+ <xsd:element ref="zmr:HauseigentuemerAbfrageDruckResponse"/>
+ <xsd:element ref="zmr:PersonenAbfrageResponse"/>
+ <xsd:element ref="zmr:PersonenAbfrageDruckResponse"/>
+ <xsd:element ref="zmr:ZuzugsbestaetigungResponse"/>
+ <xsd:element ref="zmr:PersonTrennenSucheResponse"/>
+ <xsd:element ref="zmr:PersonTrennenResponse"/>
+ <xsd:element ref="zmr:PersonZusammenfuehrenSucheResponse"/>
+ <xsd:element ref="zmr:PersonZusammenfuehrenResponse"/>
+ <xsd:element ref="zmr:SZRPersonenbindungResponse"/>
+ <xsd:element ref="zmr:SzrAbfrageResponse"/>
+ <xsd:element ref="zmr:SZRPersonensucheResponse"/>
+ <xsd:element ref="zmr:BehoerdenattributeAendernResponse"/>
+ <xsd:element ref="zmr:StornoDarstellenResponse"/>
+ <xsd:element ref="zmr:StornoResponse"/>
+ <xsd:element ref="zmr:PersonKorrigierenResponse"/>
+ <xsd:element ref="zmr:WohnsitzKorrigierenResponse"/>
+ <xsd:element ref="zmr:WehrpflichtigeAbfragenResponse"/>
+ <xsd:element ref="zmr:AblaufendeAuskunftssperrenSucheResponse"/>
+ <xsd:element ref="zmr:GerichtskommissaerabfrageResponse"/>
+ <xsd:element ref="zmr:ObjektsucheSteuerfahndungResponse"/>
+ <xsd:element ref="zmr:ObjektsucheMindestsicherungResponse"/>
+ <xsd:element ref="zmr:AdoptionResponse"/>
+ <xsd:element ref="zmr:GleichsetzungAbfragenResponse"/>
+ <xsd:element ref="zmr:GleichsetzungAnlegenResponse"/>
+ <xsd:element ref="zmr:GleichsetzungLoeschenResponse"/>
+ <xsd:element ref="zmr:QKZBearbeitenResponse"/>
+ <xsd:element ref="zmr:QKZAuswertungResponse"/>
+ <xsd:element ref="zmr:BPKPruefungResponse"/>
+ <xsd:element ref="zmr:MeldungHistKorrigierenResponse"/>
+ <xsd:element ref="zmr:MeldebestaetigungenAnfordernResponse"/>
+ <xsd:element ref="zmr:TechnischeAnsichtResponse"/>
+ <xsd:element ref="zmr:AuskunftssperreAendernResponse"/>
+ <xsd:element ref="zmr:UmmSrvAbfrageResponse"/>
+ <xsd:element ref="zmr:GISSucheResponse"/>
+ <xsd:element ref="zmr:PersonenListenResponse"/>
+ <xsd:element ref="zmr:AnwendungsintegrationResponse"/>
+ <xsd:element ref="zmr:AnwendungsintegrationWiederholungResponse"/>
+ <xsd:element ref="zmr:ORFGISAnforderungResponse"/>
+ <xsd:element ref="zmr:IAPPersonenUeberblickResponse"/>
+ <xsd:element ref="zmr:IAPPersonenDetailResponse"/>
+ <xsd:element ref="zmr:ErnpResponse"/>
+ <xsd:element ref="zmr:BuergerPersonensucheResponse"/>
+ <xsd:element ref="zmr:BuergerMitbewohnersucheResponse"/>
+ <xsd:element ref="zmr:BuergerWohnsitzserviceResponse"/>
+ <xsd:element ref="zmr:GemeindeeinstellungenResponse"/>
+ <xsd:element ref="zmr:GemeindeeinstellungenAendernResponse"/>
+ <xsd:element ref="zmr:SperrlisteResponse"/>
+ <xsd:element ref="zmr:SperrlisteUpdateResponse"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Service.wsdl b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Service.wsdl
new file mode 100644
index 00000000..3dbeabc7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/Service.wsdl
@@ -0,0 +1,62 @@
+<definitions xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext"
+ xmlns="http://schemas.xmlsoap.org/wsdl/"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" name="Service">
+ <types>
+ <xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#">
+ <xsd:import namespace="http://schemas.xmlsoap.org/ws/2002/04/secext" schemaLocation="secext.xsd"/>
+ <xsd:include schemaLocation="Messages.xsd"/>
+ <xsd:element name="Request" type="RequestType"/>
+ <xsd:element name="Response" type="ResponseType"/>
+ <xsd:element name="ServiceFault">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ErrorCode"/>
+ <xsd:element ref="ErrorMessage"/>
+ <xsd:element ref="ServerTransaktionNr"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ </types>
+ <message name="ServiceRequest">
+ <part name="in" element="base:Request"/>
+ <part name="WSSEHeader" element="wsse:Security"/>
+ </message>
+ <message name="ServiceResponse">
+ <part name="out" element="base:Response"/>
+ </message>
+ <message name="ServiceFault">
+ <part name="servicefault" element="base:ServiceFault"/>
+ </message>
+ <portType name="ServicePort">
+ <operation name="service">
+ <input message="base:ServiceRequest"/>
+ <output message="base:ServiceResponse"/>
+ <fault name="servicefault" message="base:ServiceFault"/>
+ </operation>
+ </portType>
+ <binding name="ServiceBinding" type="base:ServicePort">
+ <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
+ <operation name="service">
+ <soap:operation style="document"/>
+ <input>
+ <soap:header message="base:ServiceRequest" part="WSSEHeader" use="literal"/>
+ <soap:body use="literal" parts="in"/>
+ </input>
+ <output>
+ <soap:body use="literal"/>
+ </output>
+ <fault name="servicefault">
+ <soap:fault name="servicefault" use="literal"/>
+ </fault>
+ </operation>
+ </binding>
+ <service name="Service">
+ <port name="Service" binding="base:ServiceBinding">
+ <soap:address location="https://pvawp.bmi.gv.at/bmi.gv.at/soap/zmr/soap/ZMRService"/>
+ </port>
+ </service>
+</definitions>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext.xsd
new file mode 100644
index 00000000..1005b12a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext.xsd
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Legal Disclaimer
+
+The presentation, distribution or other dissemination of the information
+contained in this specification is not a license, either expressly or impliedly,
+to any intellectual property owned or controlled by IBM or Microsoft and\or any other
+third party. IBM and Microsoft and\or any other third party may have patents, patent
+applications, trademarks, copyrights, or other intellectual property rights
+covering subject matter in this document. The furnishing of this document
+does not give you any license to IBM's and Microsoft's or any other third party's patents,
+trademarks, copyrights, or other intellectual property.
+
+This specification and the information contained herein is provided on an "AS IS"
+ basis and to the maximum extent permitted by applicable law, IBM and Microsoft provides
+the document AS IS AND WITH ALL FAULTS, and hereby disclaims all other warranties
+and conditions, either express, implied or statutory, including, but not limited
+to, any (if any) implied warranties, duties or conditions of merchantability, of
+fitness for a particular purpose, of accuracy or completeness of responses, of
+results, of workmanlike effort, of lack of viruses, and of lack of negligence,
+all with regard to the document. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR
+NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE DOCUMENT.
+
+IN NO EVENT WILL IBM or MICROSOFT BE LIABLE TO ANY OTHER PARTY FOR THE COST OF PROCURING
+SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS OF USE, LOSS OF DATA, OR ANY
+INCIDENTAL, CONSEQUENTIAL, DIRECT, INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER
+CONTRACT, TORT, WARRANTY, OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY
+OTHER AGREEMENT RELATING TO THIS DOCUMENT, WHETHER OR NOT SUCH PARTY HAD ADVANCE
+NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright Notice
+
+Copyright 2001, 2002 IBM Corporation and Microsoft Corporation. All rights reserved.
+-->
+<xsd:schema targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.2">
+ <xsd:element name="Security">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element defines header block to use for security-relevant data directed at a specific SOAP actor.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ The use of "any" is to allow extensibility and different forms of security data.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UsernameToken">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Username"/>
+ <xsd:element ref="Password" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Username">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Type" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BinarySecurityToken">
+ <xsd:annotation>
+ <xsd:documentation>A security token that is encoded in binary</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:attribute name="ValueType" type="xsd:QName"/>
+ <xsd:attribute name="EncodingType" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SecurityTokenReference">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element is used reference a security token.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="Reference"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other" processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Reference">
+ <xsd:complexType>
+ <xsd:attribute name="URI" type="xsd:anyURI"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="PasswordTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:PasswordText"/>
+ <xsd:enumeration value="wsse:PasswordDigest"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ValueTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:X509v3"/>
+ <xsd:enumeration value="wsse:Kerberosv5TGT"/>
+ <xsd:enumeration value="wsse:Kerberosv5ST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:Base64Binary"/>
+ <xsd:enumeration value="wsse:HexBinary"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="FaultcodeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:UnsupportedSecurityToken"/>
+ <xsd:enumeration value="wsse:UnsupportedAlgorithm"/>
+ <xsd:enumeration value="wsse:InvalidSecurity"/>
+ <xsd:enumeration value="wsse:InvalidSecurityToken"/>
+ <xsd:enumeration value="wsse:FailedAuthentication"/>
+ <xsd:enumeration value="wsse:FailedCheck"/>
+ <xsd:enumeration value="wsse:SecurityTokenUnavailable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext_pvp.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext_pvp.xsd
new file mode 100644
index 00000000..24896b99
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/wsdl/secext_pvp.xsd
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Legal Disclaimer
+
+The presentation, distribution or other dissemination of the information
+contained in this specification is not a license, either expressly or impliedly,
+to any intellectual property owned or controlled by IBM or Microsoft and\or any other
+third party. IBM and Microsoft and\or any other third party may have patents, patent
+applications, trademarks, copyrights, or other intellectual property rights
+covering subject matter in this document. The furnishing of this document
+does not give you any license to IBM's and Microsoft's or any other third party's patents,
+trademarks, copyrights, or other intellectual property.
+
+This specification and the information contained herein is provided on an "AS IS"
+ basis and to the maximum extent permitted by applicable law, IBM and Microsoft provides
+the document AS IS AND WITH ALL FAULTS, and hereby disclaims all other warranties
+and conditions, either express, implied or statutory, including, but not limited
+to, any (if any) implied warranties, duties or conditions of merchantability, of
+fitness for a particular purpose, of accuracy or completeness of responses, of
+results, of workmanlike effort, of lack of viruses, and of lack of negligence,
+all with regard to the document. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR
+NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE DOCUMENT.
+
+IN NO EVENT WILL IBM or MICROSOFT BE LIABLE TO ANY OTHER PARTY FOR THE COST OF PROCURING
+SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS OF USE, LOSS OF DATA, OR ANY
+INCIDENTAL, CONSEQUENTIAL, DIRECT, INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER
+CONTRACT, TORT, WARRANTY, OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY
+OTHER AGREEMENT RELATING TO THIS DOCUMENT, WHETHER OR NOT SUCH PARTY HAD ADVANCE
+NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright Notice
+
+Copyright 2001, 2002 IBM Corporation and Microsoft Corporation. All rights reserved.
+-->
+<xsd:schema targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:pvp="http://egov.gv.at/pvp1.xsd" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.2">
+ <xsd:import namespace="http://egov.gv.at/pvp1.xsd" schemaLocation="../xsd/eingebunden/pvp1.xsd"/>
+ <xsd:element name="Security">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element defines header block to use for security-relevant data directed at a specific SOAP actor.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="pvp:pvpToken" minOccurs="0"/>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ The use of "any" is to allow extensibility and different forms of security data.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UsernameToken">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Username"/>
+ <xsd:element ref="Password" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Username">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Type" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BinarySecurityToken">
+ <xsd:annotation>
+ <xsd:documentation>A security token that is encoded in binary</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:attribute name="ValueType" type="xsd:QName"/>
+ <xsd:attribute name="EncodingType" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SecurityTokenReference">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element is used reference a security token.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="Reference"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other" processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Reference">
+ <xsd:complexType>
+ <xsd:attribute name="URI" type="xsd:anyURI"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="PasswordTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:PasswordText"/>
+ <xsd:enumeration value="wsse:PasswordDigest"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ValueTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:X509v3"/>
+ <xsd:enumeration value="wsse:Kerberosv5TGT"/>
+ <xsd:enumeration value="wsse:Kerberosv5ST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:Base64Binary"/>
+ <xsd:enumeration value="wsse:HexBinary"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="FaultcodeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:UnsupportedSecurityToken"/>
+ <xsd:enumeration value="wsse:UnsupportedAlgorithm"/>
+ <xsd:enumeration value="wsse:InvalidSecurity"/>
+ <xsd:enumeration value="wsse:InvalidSecurityToken"/>
+ <xsd:enumeration value="wsse:FailedAuthentication"/>
+ <xsd:enumeration value="wsse:FailedCheck"/>
+ <xsd:enumeration value="wsse:SecurityTokenUnavailable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Auswertungen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Auswertungen.xsd
new file mode 100644
index 00000000..c5efb2f6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Auswertungen.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Auswertungen.xsd
+Zweck: Definiert Datentypen zum Auflisten und Abholen von Auswertungen aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2007-12-19 teo: +NurAbgeholte in AuswertungenAuflistenRequest (CR442)
+2005-05-17 tsch: AuswertungErzeugt hinzugefuegt
+2005-04-30 tsch: EntityID einer speziellen Auswertung optional zur Organisation
+2005-04-30 tsch: Feld GeneriertBis hinzugefuegt (Schätzung der Bereitstellungszeit, falls Auswertungsgenerierung in Arbeit)
+2005-04-29 tsch: Es können mehrere Auswertungen zugleich gelöscht werden
+2004-11-09 tsch: Auswertung-Langtext hinzugefuegt
+2004-09-27 tsch: Vom ZMR-Namespace nach BASE verschoben
+2004-06-24 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="AuswertungenAuflistenRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Request zum Auflisten der im ZMR für eine Organisation erzeugten Auswertungen
+ Ist InclusiveAbgeholte='true', werden auch die Auswerungen geliefert, die schon abgeholt wurden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="EntityID"/>
+ </xsd:choice>
+ <xsd:element name="InclusiveAbgeholte" type="xsd:boolean"/>
+ <xsd:element name="NurAbgeholte" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungenAuflistenResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ In der Response werden die für die Organisation erzeugten Auswertungen als Liste geliefert.
+ Die Auswertungen sind nach GeneriertAm aufsteigend sortiert
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ <xsd:choice>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="EntityID"/>
+ </xsd:choice>
+ <xsd:element ref="Auswertung" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungAbgeholtRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Wenn alle Teile (Auswertungsdaten) einer Auswertung abgeholt (mittels HTTP-Get) und erfolgreich
+ verarbeitet wurden, muss dieser Request zum 'Abschliessen' der Auswertung geschickt werden.
+ Abgeholte Auswertungen werden nur nuch dann geliefert, wenn InclusiveAbgeholte='true' gesetzt ist.
+ Es muss die EntityID der abgeholten Auswertung geschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityID" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungAbgeholtResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Response mit EntityID der abgeholten Auswertung
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ <xsd:element ref="EntityID" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungErzeugtRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Sobald eine Auswertung erzeugt wurde, kann über diese Schnittstelle der Empfänger aktiv verständigt werden (PUSH-Mechanismus)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="Auswertung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungErzeugtResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bestätigung des Empfängers, die Verstänfigung erhalten zu haben
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Auswertung">
+ <xsd:annotation>
+ <xsd:documentation>
+ Innerhalb einer Auswertung werden die geteilten Files aufsteigend durchnummeriert geliefert.
+ Als erster Schüssel der Sortierung dient der Datentyp, als zweiter die Nummerierung
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Code">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Langtext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="EntityID"/>
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="GeneriertAm"/>
+ <xsd:element ref="AuswertungAbgeholt" minOccurs="0"/>
+ <xsd:element ref="Auswertungsdaten" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:element name="BearbeitungsBeginn" type="TimestampType"/>
+ </xsd:sequence>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Auswertungsdaten">
+ <xsd:annotation>
+ <xsd:documentation>
+ Das File mit dem Auswertungsteil ist über den angegebenen (zur ZMR-Applikationsroot)
+ relativen URL referenziert und kann mittels HTTP-GET abgeholt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Langtext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="URL" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuswertungAbgeholt">
+ <xsd:annotation>
+ <xsd:documentation>
+ Falls die Auswertung schon einmal abgeholt wurde, wird dieser Datenteil mit den
+ Informationen zur Abholung (Organisation, Zeitpunkt) geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="AbgeholtAm" type="TimestampType"/>
+ <xsd:element ref="DurchgefuehrtVon"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/BasTabelleAbfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/BasTabelleAbfrage.xsd
new file mode 100644
index 00000000..ca78a990
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/BasTabelleAbfrage.xsd
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <!--
+Name: BasTabellenAbfrage.xsd
+Zweck: Definiert Abfragerequest und -responses für die BAS-Tabellenabfrage
+Author(s): Fürnweger Andreas, ZMR-SU
+
+Aenderungshistorie:
+2012-08-08 xfu: Erstellt
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd" />
+
+ <xsd:simpleType name="TabelleType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AKADGRAD" />
+ <xsd:enumeration value="STAAT" />
+ <xsd:enumeration value="DOMAINCODE" />
+ <xsd:enumeration value="GEMNRBEHKZ" />
+ <xsd:enumeration value="TGEM" />
+ <xsd:enumeration value="GESCHAEFTSPROLLE" />
+ <xsd:enumeration value="RELIGION" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="BasTabelleAbfrageRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Definiert welche Tabelle mit welchen Suchkriterien aufgelistet werden soll.
+ InclusivHistorie: bestimmt ob nur aktuelle oder auch (fachlich) historische Einträge aufgelistet werden sollen
+ LetzteAenderungNach: Gibt man hier ein Datum an, werden nur Einträge gelistet, deren LetzteAenderung Datum nach diesem ist
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Tabelle" type="base:TabelleType" />
+ <xsd:element ref="base:InclusivHistorie" />
+ <xsd:element name="LetzteAenderungNach" type="base:TimestampType" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BasTabelleAbfrageResponse">
+ <xsd:annotation>
+ <xsd:documentation>Enthält alle gefunden Einträge der entsprechenden BAS-Tabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:element ref="base:BasStaat" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:BasAkadGrad" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:BasDomainCode" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:GemnrBehkz" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:BasTgem" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:Rolle" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="base:ReligionCode" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BasStaat">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein BAS.STAAT Eintrag mit den üblichen technischen und allen fachlichen Informationen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz" />
+ <xsd:element name="ISOCode2" type="xsd:string" minOccurs="0" />
+ <xsd:element name="ISOCode3" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatAnerkannt" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="Staatsbuerger" type="xsd:boolean" minOccurs="0" /> <!-- ZMR-2864 Staatsbuergerschaft -->
+ <xsd:element name="GebStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="UmzugStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="ReisedokStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="ZugehoerigStaat" type="xsd:string" minOccurs="0" />
+ <xsd:element name="EwrStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="EuStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="EuStaatOffiziell" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="StaatName" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatNameEinf" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatNameLang" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatNameNorm" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatNummer" type="xsd:int" minOccurs="0" />
+ <xsd:element name="StaatKFZ" type="xsd:string" minOccurs="0" />
+ <xsd:element name="StaatEnglisch" type="xsd:string" minOccurs="0" />
+ <xsd:element name="UnStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="PostStaat" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="PlzStaat" type="xsd:string" minOccurs="0" />
+ <xsd:element name="Kontinent" type="xsd:string" minOccurs="0" />
+ <xsd:element name="Region" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BasAkadGrad">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein BAS.AKADGRAD Eintrag mit den üblichen technischen und allen fachlichen Informationen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz" />
+ <xsd:element ref="base:AkadGradStellung" minOccurs="0" />
+ <xsd:element ref="base:AkadGradReihung" minOccurs="0" />
+ <xsd:element name="Art" type="xsd:string" minOccurs="0" />
+ <xsd:element ref="base:AkadGradLang" minOccurs="0" />
+ <xsd:element ref="base:AkadGradKurz" minOccurs="0" />
+ <xsd:element name="ISOCode3" type="xsd:string" minOccurs="0" />
+ <xsd:element name="AkadGradNorm" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BasDomainCode">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein BAS.DOMAINCODE Eintrag mit den fürs ZMR3 relevanten Feldern</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Bereich" type="xsd:string" />
+ <xsd:element name="Code" type="xsd:string" />
+ <xsd:element name="CodeText" type="xsd:string" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GemnrBehkz">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein BAS.GEMNRBEHKZ Eintrag mit den fürs ZMR3 relevanten Feldern</xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="gem" type="xsd:int" />
+ <xsd:attribute name="beh" type="xsd:int" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BasTgem">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein GW2.TGEM Eintrag mit den fürs ZMR3 relevanten Feldern</xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="nr" type="xsd:int" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Rolle">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Eine Rolle mit den erlaubten Geschäftsprozessen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Geschaeftsprozess" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="Name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ReligionCode">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein SMI.RELIGIONCODE Eintrag mit den fürs ZMR3 relevanten Feldern</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Bezeichnung" type="xsd:string"/>
+ <xsd:element name="Code" type="xsd:string"/>
+ <xsd:element name="KurzBez" type="xsd:string"/>
+ <xsd:element name="MigGueltig" type="xsd:string"/>
+ <xsd:element name="ReferenzNr" type="xsd:long"/>
+ <xsd:element name="Religionart" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Geschaeftsprozess">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein Geschäftsprozess zu einer Rolle mit optionaler Einschränkung auf bestimmte Vorgänge</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Vorgang" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ <xsd:attribute name="Name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Vorgang">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Ein Geschäftsprozess zu einer Rolle mit optionaler Einschränkung auf bestimmte Vorgänge</xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="Name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Benutzereinstellungen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Benutzereinstellungen.xsd
new file mode 100644
index 00000000..45bb9795
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Benutzereinstellungen.xsd
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Benutzereinstellungen.xsd
+Zweck: Definiert Datentypen für Benutzereinstellungen -Abfragen und Änderungen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2011-04-29 rp: LMR-905: +DefaultGemeindeNrSucheInclLMR
+2011-01-11 teo: LMR-837 Farbgestaltung Menü
+2010-01-27 teo: Suche mit Teilnamen (ZMR-1334)
+2009-12-10 mp: Suche inkl. LMR hinzugefügt (LMR-677)
+2008-04-08 xglettl: DruckOrtschaft und DruckPostort hinzu
+2006-08-24 tsch:
+2006-08-16 tsch: EingeschraenkteHistorie hinzugefügt
+2004-09-28 tsch: BehoerdenNr entfernt
+2004-09-08 tsch: BenutzerName hinzugefügt
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="Organisationseinstellungen.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BenutzereinstellungenAbfragenRequest">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Leerer Request, die Identifikation des Benutzers wird aus den Logindaten gewonnen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BenutzereinstellungenAbfragenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Benutzereinstellungsdaten des abfragenden Benutzers.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Benutzereinstellungen" minOccurs="1"/>
+ <xsd:element ref="Organisationseinstellungen" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BenutzereinstellungenAendernRequest">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>geaenderte Benutzereinstellungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Benutzereinstellungen" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BenutzereinstellungenAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Benutzereinstellungsdaten des abfragenden Benutzers.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Benutzereinstellungen" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Benutzereinstellungen">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Benutzer" minOccurs="0"/>
+ <xsd:element name="BenutzerName" type="BenutzerNameType" minOccurs="0"/>
+ <xsd:element ref="GemeindeNr" minOccurs="0"/>
+ <xsd:element ref="AnzahlSaetze" minOccurs="0"/>
+ <xsd:element name="SucheInclusivHistorie" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="SucheFormalisiert" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="SucheInclusivERnP" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="SucheInclusivZMR" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="SucheInclusivLMR" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="SucheMitTeilnamen" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="ErgebnisInclusivHistorie" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="EingeschraenkteHistorie" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="DruckOrtschaft" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="DruckPostort" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="DruckZusatztext" minOccurs="0" maxOccurs="20"/>
+ <xsd:element ref="cio:ISOCode3" minOccurs="0" maxOccurs="2"/>
+ <xsd:element name="FarbigesMenue" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="DefaultGemeindeNrSucheInclLMR" type="GemeindeNrType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/GeschaeftsprozesseAuflisten.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/GeschaeftsprozesseAuflisten.xsd
new file mode 100644
index 00000000..34f8354c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/GeschaeftsprozesseAuflisten.xsd
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: GeschaeftsprozesseAuflisten.xsd
+Zweck: Definiert Datentypen die Abfrage der im ZMR für den aktuellen User verfügbaren Geschaeftsprozesse
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2015-05-20 xwelzl: ZMR-2194 Application-BuildID online abrufbar
+2008-12-11 teo: NCR-493 Anzeige der Versionen für das Deployment
+2004-09-09 tsch: VorgangRestriction hinzugefügt
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="WorkflowsAuflistenRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Request zum Auflisten der für den aktiven User verfügbaren Geschäftsprozesse.
+ Dieses Feld wird, genauso wie z.B. PersonSuchenRequest, innerhalb eines base:Request geschickt.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WorkflowsAuflistenResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enthält die Liste mit den für den User verfügbaren Geschäftsprozessen, sowie deren Sub-Prozesse (Vorgänge)
+ als Baumstruktur aufgebaut. Ein eintrag in der Liste enspricht einem Geschäftsprozess.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Workflow" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ProzessName" />
+ <xsd:element ref="ProzessAnzeigeName" minOccurs="0" />
+ <xsd:element ref="ProzessStatus" />
+ <xsd:element ref="VorgangRestriction" minOccurs="0" maxOccurs="unbounded" />
+ <xsd:element ref="Subprozess" minOccurs="1" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="WorkflowCreated" type="TimestampType" minOccurs="0" />
+ <xsd:element name="WorkflowLastUpdate" type="TimestampType" minOccurs="0" />
+ <xsd:element name="ApplicationBuildID" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Messages.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Messages.xsd
new file mode 100644
index 00000000..47dcda53
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Messages.xsd
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Messages.xsd
+Zweck: Definiert die Message-Datentypen fuer Services Request und Response (siehe Service.wsdl)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-08-09 xfu: +BasTabelleAbfrage.xsd
+2004-02-18 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../eingebunden/InfoTechnisch.xsd"/>
+ <xsd:include schemaLocation="../eingebunden/Workflow.xsd"/>
+ <xsd:include schemaLocation="Benutzereinstellungen.xsd"/>
+ <xsd:include schemaLocation="Organisationseinstellungen.xsd"/>
+ <xsd:include schemaLocation="GeschaeftsprozesseAuflisten.xsd"/>
+ <xsd:include schemaLocation="Auswertungen.xsd"/>
+ <xsd:include schemaLocation="BasTabelleAbfrage.xsd"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Organisationseinstellungen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Organisationseinstellungen.xsd
new file mode 100644
index 00000000..b5058e1b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Organisationseinstellungen.xsd
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Organisationseinstellungen.xsd
+Zweck: Definiert Datentypen für Organisationseinstellungen -Abfragen und Änderungen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-06-18 teo: Einstellungen für Messenger hinzugefügt
+2005-02-10 tsch: Feld ParameterCode hinzugefügt
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="OrganisationseinstellungenAendernRequest">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>geaenderte Benutzereinstellungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Organisationseinstellungen" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="OrganisationseinstellungenAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Benutzereinstellungsdaten des abfragenden Benutzers.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Organisationseinstellungen" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Organisationseinstellungen">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BehoerdenNr" minOccurs="0"/>
+ <xsd:element name="KontaktOrganisation" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="KontaktPerson" minOccurs="0"/>
+ <xsd:element ref="KontaktEmail" minOccurs="0"/>
+ <xsd:element ref="KontaktTelefon" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="KontaktTechnisch" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="KontaktPerson" minOccurs="0"/>
+ <xsd:element ref="KontaktEmail" minOccurs="0"/>
+ <xsd:element ref="KontaktTelefon" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Softwarepartner" minOccurs="0">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="DruckZusatztext" minOccurs="0" maxOccurs="20"/>
+ <xsd:element name="AbgleichZMR" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="AbgleichZMR2" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="Batchvorgaben" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="MessengerEinstellungen" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ZugriffUeberAuswertungen" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="Empfaenger" type="BenutzerType" minOccurs="0" maxOccurs="3"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="Batchvorgaben" type="BatchvorgabenType"/>
+ <xsd:complexType name="BatchvorgabenType">
+ <xsd:sequence>
+ <xsd:element name="Batchname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Filegroesse" type="IntegerType" minOccurs="0"/>
+ <xsd:element name="FileformatXML" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="FileformatCSV" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="FileformatPDF" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="FileformatXLS" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="BatchParameter" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BatchParameter" type="BatchParameterType"/>
+ <xsd:complexType name="BatchParameterType">
+ <xsd:sequence>
+ <xsd:element name="ParameterTyp" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="ParameterCode" type="xsd:string"/>
+ <xsd:element name="ParameterName" type="xsd:string"/>
+ <xsd:element name="ParameterWert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="KontaktPerson">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="KontaktEmail">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="KontaktTelefon">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="18"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Service.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Service.xsd
new file mode 100644
index 00000000..81cd3e80
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/allgemein/Service.xsd
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: Service.xsd
+Zweck: Definiert die Serviceroot - Elemente base:Request und base:Response global
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2008-07-25 teo: +PDFResponse (optional! ZMR setzt dieses Feld bisher nicht!)
+2004-08-19 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="Messages.xsd"/>
+ <xsd:include schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="Request">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WorkflowInfoClient"/>
+ <xsd:element ref="ClientInfo"/>
+ <xsd:any processContents="lax"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Response">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WorkflowInfoServer"/>
+ <xsd:element name="PDFResponse" type="xsd:base64Binary" minOccurs="0"/>
+ <xsd:element ref="ServerInfo"/>
+ <xsd:any processContents="lax"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AbfrageMuster.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AbfrageMuster.xsd
new file mode 100644
index 00000000..c7163abe
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AbfrageMuster.xsd
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AbfrageParameter.xsd
+Zweck: Definiert Datentypen für generische Suchabfragen mit simplen Operatoren
+Author(s): Tschurtschenthaler Thomas (basierend auf suchmuster.xsd von DI Heinz Töfferl - Comm-Unity Software Development GmbH & Co KG)
+Aenderungshistorie:
+2005-03-30 tsch: Erstellung
+-->
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:element name="AbfrageMuster">
+ <xsd:annotation>
+ <xsd:documentation>Daten zu einem Suchmuster (Ausdruck)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="FeldAbfrage"/>
+ <xsd:element ref="SubFeldAbfrage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Dient zur Klammerung von Suchmuster-Ausdrücken.
+ Muss erst dann unterstützt werden, wenn eine Klammerung nötig wird.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="AbfrageMuster"/>
+ <xsd:element ref="SubAbfrageMuster" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:choice>
+ <xsd:attribute name="AbfrageName" type="xsd:string" use="optional"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="FeldAbfrage">
+ <xsd:annotation>
+ <xsd:documentation>Eine Sucheinschränkung (= Einschränkung für ein Feld)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Feld" type="xsd:string"/>
+ <xsd:element ref="Relation"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Operation" block="restriction" default="UND">
+ <xsd:annotation>
+ <xsd:documentation>Verknüpfung mit der nächsten Zeile (Default: AND)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:NMTOKEN">
+ <xsd:enumeration value="UND"/>
+ <xsd:enumeration value="ODER"/>
+ <xsd:enumeration value="ODER_SELF"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Relation">
+ <xsd:annotation>
+ <xsd:documentation>Mögliche Vergleichsoperatoren.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="IST"/>
+ <xsd:enumeration value="IST NICHT"/>
+ <xsd:enumeration value="BEGINNT MIT"/>
+ <xsd:enumeration value="BEGINNT NICHT MIT"/>
+ <xsd:enumeration value="ENDET MIT"/>
+ <xsd:enumeration value="ENDET NICHT MIT"/>
+ <xsd:enumeration value="GRÖSSER ALS"/>
+ <xsd:enumeration value="GRÖSSER GLEICH"/>
+ <xsd:enumeration value="KLEINER ALS"/>
+ <xsd:enumeration value="KLEINER GLEICH"/>
+ <xsd:enumeration value="ENTHÄLT"/>
+ <xsd:enumeration value="ENTHÄLT NICHT"/>
+ <xsd:enumeration value="IST LEER"/>
+ <xsd:enumeration value="IST NICHT LEER"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AbfrageSortierung">
+ <xsd:annotation>
+ <xsd:documentation>Daten zur Sortierung einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SortSchluessel" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SortSchluessel">
+ <xsd:annotation>
+ <xsd:documentation>Sortierungsschluessel einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Feld" type="xsd:string"/>
+ <xsd:element name="Absteigend" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SubFeldAbfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Operation"/>
+ <xsd:element ref="FeldAbfrage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SubAbfrageMuster">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Operation"/>
+ <xsd:element ref="AbfrageMuster"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AbfrageParameter">
+ <xsd:annotation>
+ <xsd:documentation>Daten zur Parametrisierung einer Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Parameter" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Parameter">
+ <xsd:annotation>
+ <xsd:documentation>Ein einzelner Abfrageparameter</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Name" type="xsd:string"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AkademischerGradFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AkademischerGradFelder.xsd
new file mode 100644
index 00000000..da73c389
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/AkademischerGradFelder.xsd
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AkademischerGradFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für akademische Grade
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-12-15 tsch: AkadGradReihung - Wertebereich erweitert
+2004-06-20 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="AkadGradStellung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="VOR"/>
+ <xsd:enumeration value="NACH"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradReihung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="0"/>
+ <xsd:enumeration value="1"/>
+ <xsd:enumeration value="2"/>
+ <xsd:enumeration value="2/3"/>
+ <xsd:enumeration value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradLang">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AkadGradKurz">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="30"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AkadGradKey" type="IDType"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Blaettern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Blaettern.xsd
new file mode 100644
index 00000000..943439b8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Blaettern.xsd
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Blaettern.xsd
+Zweck: Definiert Request-Typen für das allgemeine Blättern; Die Response hängt vom Workflow-Vorgang ab (Personensuchergebnis, Avisosuchergebnis, ...)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-04-19 toef: Richtungswerte 'Anfang' und 'Ende' hinzugefügt
+2005-09-20 tsch: Richtungswert 'Aktualisieren' hinzugefügt
+2004-06-14 tsch: Organisation nach ClientInfo verschoben
+2004-04-07 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="BlaetternRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Für Suchvorgänge, in deren Ergebnisliste geblättert werden kann, stellt dieser Request
+ eine generische Schnittstelle zum Blättern dar. Er wird mit demselben Vorgang-Namen in der
+ Workflowschnittstelle geschickt, wie der ursprüngliche Suche-Request. Als Ergebnis wird
+ das Suchergebnis des ensprechenden Suchvorgangs analog zur rsprünglichen Suche-Response geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BlaetternInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BlaetternInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ErgebnislisteName" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Richtung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Vor"/>
+ <xsd:enumeration value="Zurueck"/>
+ <xsd:enumeration value="Aktualisieren"/>
+ <xsd:enumeration value="Anfang"/>
+ <xsd:enumeration value="Ende"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/DokumentFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/DokumentFelder.xsd
new file mode 100644
index 00000000..0c38ec09
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/DokumentFelder.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: DokumentFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Dokumente/Reisedokumente
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-09-26 tsch: DokumentName hinzugefügt
+2004-09-29 tsch: Felder für Standard-Dokumente hinzugefügt
+2004-06-24 tsch: AusstellDatum: Timestamp wird xsd:date
+2004-01-22 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="DokumentArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="55"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="DokumentNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="256"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EintragungsNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="DokumentName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AusstellDatum" type="xsd:date"/>
+ <xsd:element name="AblaufDatum" type="xsd:date"/>
+ <xsd:element name="SterbeDatum" type="xsd:date"/>
+ <xsd:element name="SterbeUhrzeit" type="xsd:time"/>
+ <xsd:element name="AusstellBehoerde">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Ausstellungsstaat" type="StaatenNameType"/>
+ <xsd:element name="DokumentGiltBis" type="TimestampType"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/EingebundenProxy.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/EingebundenProxy.xsd
new file mode 100644
index 00000000..de80a94f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/EingebundenProxy.xsd
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: EingebundenProxy.xsd
+Zweck: Fasst XSD-Files zusammen, die oft eingebunden werden
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-07-07 teo: +PersonExport
+2003-12-10 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+ <xsd:include schemaLocation="InfoTechnisch.xsd"/>
+ <xsd:include schemaLocation="MeldungFelder.xsd"/>
+ <xsd:include schemaLocation="PersonFelder.xsd"/>
+ <xsd:include schemaLocation="DokumentFelder.xsd"/>
+ <xsd:include schemaLocation="Workflow.xsd"/>
+ <xsd:include schemaLocation="Blaettern.xsd"/>
+ <xsd:include schemaLocation="AkademischerGradFelder.xsd"/>
+ <xsd:include schemaLocation="AbfrageMuster.xsd"/>
+ <xsd:include schemaLocation="PersonExport.xsd"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Entity.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Entity.xsd
new file mode 100644
index 00000000..a5fbac59
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Entity.xsd
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Entity.xsd
+Zweck: Definiert allgemeine Datentypen für Entities (Person, Meldung, ...) der Register
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-08-09 xfu: Beginncode und -text ist optional
+2004-10-27 tsch: Behoerdenschluessel hinzugefügt
+2004-09-28 tsch: OrgBezeichnung hinzugefügt
+2004-06-21 tsch: EntityReferenz ohne LetzteAenderung
+2004-06-18 tsch: BeginnText hinzugefügt
+2004-01-22 tsch: EntityErgebnisReferenz statt Entity abstract
+2003-11-16 tsch: Erstellung
+-->
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:element name="EntityErgebnisReferenz" type="EntityErgebnisReferenzType"/>
+ <xsd:complexType name="EntityErgebnisReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Referenziert eine Entity in der Datenbank für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:sequence>
+ <xsd:element ref="Technisch"/>
+ <xsd:group ref="ErgebnisFachlichGroup"/>
+ </xsd:sequence>
+ </xsd:sequence>
+
+ </xsd:complexType>
+
+ <xsd:element name="EntityReferenz" type="EntityReferenzType"/>
+ <xsd:complexType name="EntityReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Referenziert eine Entity in der Datenbank für Aenderungen (immer die aktuellste, das heisst jüngstes 'Von')</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EntityID"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Technisch">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityID"/>
+ <xsd:element ref="LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:group name="ErgebnisFachlichGroup">
+ <xsd:sequence>
+ <xsd:element ref="Von"/>
+ <xsd:element ref="BeginnCode" minOccurs="0"/> <!-- Einträge in BAS.STAAT und BAS.AKADGRAD haben keinen Beginncode (werden aber in BasTabelleAbfrage.xsd abgerufen) -->
+ <xsd:element ref="BeginnText" minOccurs="0"/>
+ <xsd:element ref="BeginnFreitext" minOccurs="0"/>
+ <xsd:element ref="Bis" minOccurs="0"/>
+ <xsd:element ref="DurchgefuehrtVon"/>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="Von" type="TimestampType"/>
+ <xsd:element name="Bis" type="TimestampType"/>
+ <xsd:element name="BeginnCode" type="GrundCodeType"/>
+ <xsd:element name="BeginnText" type="GrundTextType"/>
+ <xsd:element name="BeginnFreitext" type="GrundFreitextType"/>
+ <xsd:element name="EntityID" type="ENTITYIDType"/>
+ <xsd:element name="LetzteAenderung" type="TimestampType"/>
+ <xsd:element name="DurchgefuehrtVon" type="DurchgefuehrtVonType"/>
+ <xsd:complexType name="DurchgefuehrtVonType">
+ <xsd:sequence>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="Benutzer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Organisation">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>
+ Die derzeit bekannten Organisationen sind strikt definiert (BehoerdenNr, GemeindeNr, KundenNr);
+ neue, noch nicht definierte Organiationen, können mittels eines (Orgtyp, OrgCode)-Paares übermittelt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:choice>
+ <xsd:element ref="BehoerdenNr"/>
+ <xsd:element ref="GemeindeNr"/>
+ <xsd:element ref="KundenNr"/>
+ <xsd:element ref="Behoerdenschluessel"/>
+ </xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="OrgTyp"/>
+ <xsd:element ref="OrgCode"/>
+ </xsd:sequence>
+ </xsd:choice>
+ <xsd:element ref="OrgBezeichnung" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BehoerdenNr" type="BehoerdenNrType"/>
+ <xsd:element name="Behoerdenschluessel" type="BehoerdenschluesselType"/>
+ <xsd:element name="GemeindeNr" type="GemeindeNrType"/>
+ <xsd:element name="KundenNr" type="KundenNrType"/>
+ <xsd:element name="OrgTyp" type="OrgTypType"/>
+ <xsd:element name="OrgCode" type="OrgCodeType"/>
+ <xsd:element name="Benutzer" type="BenutzerType"/>
+ <xsd:element name="OrgBezeichnung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="80"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="BehoerdenBezeichnung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="80"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoFachlich.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoFachlich.xsd
new file mode 100644
index 00000000..20212cc2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoFachlich.xsd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: InfoFachlich.xsd
+Zweck: Definiert Typen für allgemeine fachliche Informationen der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-08-08 tsch: Feld EingeschraenkteHistorie hinzugefügt
+2004-09-09 tsch: Register hinzugefügt
+2004-07-07 tsch: InfoFachlichType.Von optional, InfoFachlichType.GrundCode Mussfeld
+2004-06-22 tsch: SaetzeVon, SaetzeBis hinzugefügt
+2004-06-18 tsch: ErgebnissatzInfo, Beendigung hinzugefügt
+2004-04-17 tsch: Organisation entfernt
+2004-04-13 tsch: InfoFachlichType - GrundCode optional
+2003-11-16 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+ <xsd:include schemaLocation="Entity.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="PersonDataZMR.xsd"/>
+
+ <xsd:element name="ErgebnissatzInfo" type ="ErgebnissatzInfoType"/>
+ <xsd:complexType name="ErgebnissatzInfoType">
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Letze-Änderung-Timestamp des Gesamt-Satzes (Jüngster Timestamp aller Entities im Satz),
+ Muss bei einem Änderungsvorgang als Letzte-Änderung-Timestamp geschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Message">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Number"/>
+ <xsd:element ref="Text"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Number" type="IntegerType"/>
+ <xsd:element name="Text">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="250"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:complexType name="InfoFachlichType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine fachliche Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="Von" minOccurs="0"/>
+ <xsd:element name="GrundCode" type="GrundCodeType"/>
+ <xsd:element ref="GrundFreitext" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BPKPersonInfo" type="BPKPersonInfoType"/>
+ <xsd:complexType name="BPKPersonInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Bereichspezifische Bürgerkarten-Information einer Person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="Bereichskennung"/>
+ <xsd:element ref="BPK"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Beendigung" type="xsd:boolean"/>
+ <xsd:element name="Bezugsfeld" type="BezugsfeldType"/>
+
+ <xsd:element name="Stichtag" type="TimestampType"/>
+ <xsd:element name="InclusivHistorie" type="xsd:boolean"/>
+ <xsd:element name="EingeschraenkteHistorie" type="xsd:boolean"/>
+ <xsd:element name="Formalisiert" type="xsd:boolean"/>
+ <xsd:element name="ErstellePDF" type="xsd:boolean"/>
+ <xsd:element name="InclusivAusgeblendeteSaetze" type="xsd:boolean"/>
+ <xsd:element name="InclusivNameVorErsterEhe" type="xsd:boolean"/>
+ <xsd:element name="GefundeneSaetze" type="IntegerType"/>
+ <xsd:element name="AnzahlSaetze" type="IntegerType"/>
+ <xsd:element name="SaetzeVon" type="IntegerType"/>
+ <xsd:element name="SaetzeBis" type="IntegerType"/>
+ <xsd:element name="GrundFreitext" type="GrundFreitextType"/>
+ <xsd:element name="Bereichskennung" type="xsd:string"/>
+ <xsd:element name="BPK" type="xsd:string"/>
+ <xsd:element name="Register" type="RegisterType"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoTechnisch.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoTechnisch.xsd
new file mode 100644
index 00000000..e23ff4fe
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/InfoTechnisch.xsd
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: InfoTechnisch.xsd
+Zweck: Definiert Typen für allgemeine technische Informationen der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-09 tsch: ErrorCode, ErrorMessage hinzugefügt
+2004-06-24 tsch: UserInfo als Message definiert
+2004-05-17 tsch: Organisation, Client dazugefügt; Softwarehaus, ClientVersion entfernt
+2003-11-16 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="ClientInfo" type="ClientInfoType"/>
+
+ <xsd:complexType name="ClientInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Technische Client-Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="Organisation"/>
+ <xsd:element ref="Client">
+ <xsd:annotation>
+ <xsd:documentation>Herstellername der Client-Software inklusive Version (Bsp.: ZMRHTMLClient V3.0)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Client">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="18"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+
+ <xsd:element name="ServerInfo" type="ServerInfoType"/>
+
+ <xsd:complexType name="ServerInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Technische Server-Informationen</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="GeneriertVon">
+ <xsd:annotation>
+ <xsd:documentation>Applikationsname und -version</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="GeneriertAm">
+ <xsd:annotation>
+ <xsd:documentation>Generierung Timestamp</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="ServerTransaktionNr">
+ <xsd:annotation>
+ <xsd:documentation>Transaktionsnummer des Servers</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="UserInfo" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Enthält neue User-Information (wie z.B. Information über Wartungarbeiten am ZMR)
+ Diese Info kann dem User am Bildschirm angezeigt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="GeneriertVon">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="GeneriertAm" type="TimestampType"/>
+ <xsd:element name="ErrorCode" type="xsd:string"/>
+ <xsd:element name="ErrorMessage" type="xsd:string"/>
+ <xsd:element name="ServerTransaktionNr" type="IDType"/>
+ <xsd:element name="UserInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/MeldungFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/MeldungFelder.xsd
new file mode 100644
index 00000000..2179baaf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/MeldungFelder.xsd
@@ -0,0 +1,283 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: MeldungFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Meldedaten
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-11-24 mp: +Infotext (ZMR-1513)
+2009-11-20 mp: Gebäudeeigenschaft und Nutzungsart hinzugefügt
+2006-06-26 tsch: OrientierungsnummerBis hinzugefügt
+2005-12-06 tsch: Detailfelder für GWR-Tueren hinzugefügt
+2004-12-09 tsch: OKZ und SKZ alphanumerisch
+2004-08-16 tsch: Bezirkskennung, DruckZusatztext hinzugefügt
+2004-08-02 tsch: PeriodeCode, PeriodeText, PeriodeFreitext hinzugefügt
+2004-07-30 tsch: HauptIdentadresse->HauptIdent; AdressZusatz enfernt; +OKZ; +SKZ; +Adressschluessel; +InfoMeldewesen
+2004-06-24 tsch: GBRRefkey, Postleitzahlgebiet hinzugefügt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+
+ <xsd:element name="GemeldetVon" type="TimestampType"/>
+ <xsd:element name="GemeldetBis" type="TimestampType"/>
+
+ <xsd:element name="PeriodeCode" type="GrundCodeType"/>
+ <xsd:element name="PeriodeText" type="GrundTextType"/>
+ <xsd:element name="PeriodeFreitext" type="GrundFreitextType"/>
+
+ <xsd:element name="Unterkunftgeber">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="250"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ADRRefkey">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="12"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="GBRRefkey">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="12"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="HauptIdent">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="H"/>
+ <xsd:enumeration value="I"/>
+ <xsd:enumeration value="B"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="OKZ">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="SKZ">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adressstatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="9"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Hofname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StrasseZweisprachig">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Gebaeudeunterscheidung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="60"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Postleitzahlgebiet">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="InfoMeldewesen">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="GBDUntteil" type="xsd:boolean"/>
+
+ <xsd:element name="NameZuteil" type="xsd:boolean"/>
+
+ <xsd:element name="Adressschluessel">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="OKZ" minOccurs="0"/>
+ <xsd:element ref="SKZ" minOccurs="0"/>
+ <xsd:element ref="ADRRefkey" minOccurs="0"/>
+ <xsd:element ref="GBRRefkey" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Bezirkskennung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="DruckZusatztext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="230"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Infotext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="230"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="TuerNr">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="TopNr">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Lagebeschreibung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzLage">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzStock">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzAdrart">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="1"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="OrientierungsnummerBis">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="32"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="GbdEigenschaft">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="NtzArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonDataZMR.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonDataZMR.xsd
new file mode 100644
index 00000000..d5d2df47
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonDataZMR.xsd
@@ -0,0 +1,741 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonDataZMR.xsd
+Zweck: Striktere Redefinition des Generischen Schemas zum Speichern und Austauschen von Personendaten des Chief Information Office Austria, Stabsstelle IKT-Strategie des Bundes, BMÖLS
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2012-04-12 ee : element "Adresse" entfernt, substitutionGroups darauf entfernt
+ -> mit wsdl2java wieder kompilierbar, sonst "Adresse is referenced but not defined." error
+2010-07-09 rp : LMR-783: +GueltigVon, GueltigBis bei Staatsangehoerigkeit
+2009-11-25 teo : ZMR-1296 Anpassungen aufgrund Bundesgesetz über die eingetragene Partnerschaft (EPG)
+2006-04-18 woeg: Familienstand
+2005-09-26 tsch: Internetadresse, Telefonadresse übernommen, Postleitzahl alphanumerisch
+2004-01-31 tsch: maximale Feldlänge für Geburtsbundesland auf 72 erhöht, minimale auf 0.
+2004-12-09 tsch: Adresscode und Objektnummer alphanumerisch, Postleitzahl mit führender Null
+2004-11-02 tsch: Elemenent Affix in PersonenNameTyp Unbounded
+2004-08-24 tsch: Element PersonenDaten übernommen
+2004-07-30 tsch: Anpassungen von Personrecord-Feldern: +Adresszeile; Gebaeudeteil->Gebaeude; Nutzungseinheitnummer->Nutzungseinheit; NTZLNR->Nutzungseinheitlaufnummer; +Postfach; AdressRegEintrag->AdressRegisterEintrag;Gemeindekennzahl->Gemeindekennziffer
+2004-07-20 tsch: Staatsangehörigkeit-Felder optional
+2004-07-08 tsch: Region (Postleitzahlgebiet) hinzugefügt
+2004-06-24 tsch: StaatsCode, StaatsName in Postadresse übernommen
+2004-01-28 tsch: Adaptionen an neuen CIO-PersonDataDE Record
+2004-01-27 tsch: ZMRAdresse wird PostAdresse
+2004-01-15 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="W3C-XMLDSig.xsd"/>
+ <xsd:annotation>
+ <xsd:documentation>This version of person deploys only global elements. All types derived from abstract types have been replaced by substitution groups</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:element name="Identification" type="IdentificationType">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:complexType name="IdentificationType">
+ <xsd:annotation>
+ <xsd:documentation>unique identifier</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Value" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>actual value of the identifier.</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Type" type="xsd:anyURI">
+ <xsd:annotation>
+ <xsd:documentation>type of value (eg 'ZMR', 'SV-Nummer', 'Martrikelnummer', database identification, ...)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>zusätzliche felder</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="PersonenDaten" type="PersonenDatenTyp">
+ <xsd:annotation>
+ <xsd:documentation>Personendatenstruktur</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="PersonenDatenTyp">
+ <xsd:sequence>
+ <xsd:element ref="NatuerlichePerson"/>
+ <xsd:element ref="PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonTyp" substitutionGroup="Person">
+ <xsd:annotation>
+ <xsd:documentation>element of physical person type</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Person" type="AbstractPersonType">
+ <xsd:annotation>
+ <xsd:documentation>element of person type</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="AbstractPersonType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>main structure of person data</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="Identification" type="IdentificationType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID" use="optional"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonTyp">
+ <xsd:annotation>
+ <xsd:documentation>physical person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractPersonType">
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonenName" minOccurs="0"/>
+ <xsd:element ref="AlternativName" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="Familienstand" minOccurs="0"/>
+ <xsd:element ref="Geschlecht" minOccurs="0"/>
+ <xsd:element ref="Geburtsdatum" minOccurs="0"/>
+ <xsd:element ref="Geburtsort" minOccurs="0"/>
+ <xsd:element ref="Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="Geburtsstaat" minOccurs="0"/>
+ <xsd:element ref="Sterbedatum" minOccurs="0"/>
+ <xsd:element ref="Staatsangehoerigkeit" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:element name="AlternativName">
+ <xsd:annotation>
+ <xsd:documentation>Former name, Artist name, changes of Given name ... type of name is given as attribute - choose from list or define new type</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Familienname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Type" type="DefinierterAlternativNamensTypTyp" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="DefinierterAlternativNamensTypTyp">
+ <xsd:annotation>
+ <xsd:documentation>known types of alternative names</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Kuenstlername"/>
+ <xsd:enumeration value="Spitzname"/>
+ <xsd:enumeration value="FruehererName"/>
+ <xsd:enumeration value="Alias"/>
+ <xsd:enumeration value="NameVorErsterEhe"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="PersonenName" type="PersonenNameTyp"/>
+
+ <xsd:complexType name="PersonenNameTyp">
+ <xsd:sequence>
+ <xsd:element ref="Vorname" minOccurs="0"/>
+ <xsd:element ref="Familienname" minOccurs="0"/>
+ <xsd:element ref="Affix" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="Familienname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Vorname" nillable="true">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="108"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Affix">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="typ" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="akademischerGrad"/>
+ <xsd:enumeration value="Adelstitel"/>
+ <xsd:enumeration value="FamiliennamenSuffix"/>
+ <xsd:enumeration value="Anrede"/>
+ <xsd:enumeration value="Generation"/>
+ <xsd:enumeration value="Qualifikation"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ <xsd:attribute name="position" use="required">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="prefix"/>
+ <xsd:enumeration value="suffix"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:attribute>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Sterbedatum">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Geburtsdatum">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Familienstand">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for marital status of a person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="ledig"/>
+ <xsd:enumeration value="verheiratet"/>
+ <xsd:enumeration value="in eingetragener Partnerschaft lebend"/>
+ <xsd:enumeration value="geschieden"/>
+ <xsd:enumeration value="eingetragene Partnerschaft aufgelöst oder für nichtig erklärt"/>
+<!-- <xsd:enumeration value="aufgelöste eingetragene Partnerschaft"/> -->
+ <xsd:enumeration value="verwitwet"/>
+ <xsd:enumeration value="hinterbliebener eingetragener Partner"/>
+ <xsd:enumeration value="Ehe aufgehoben oder für nichtig erklärt"/>
+ <xsd:enumeration value="unbekannt"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geschlecht">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for sex (gender) of person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geburtsort">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Geburtsstaat">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Geburtsbundesland">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="72"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Staatsangehoerigkeit">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ISOCode3" minOccurs="0"/>
+ <xsd:element ref="StaatsnameDE" minOccurs="0"/>
+ <xsd:element ref="StaatsnameEN" minOccurs="0"/>
+ <xsd:element ref="StaatsnameFR" minOccurs="0"/>
+ <xsd:element name="GueltigVon" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="GueltigBis" type="xsd:date" minOccurs="0"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameDE">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameEN">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatsnameFR">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="PostAdresse" type="PostAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Post oder ZMR Adresse, entspricht PostalAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:complexType name="AbstractAddressType" abstract="true">
+ <xsd:annotation>
+ <xsd:documentation>main structure of address data</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="Identification" type="IdentificationType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>unique identification entities</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID" use="optional"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ <xsd:complexType name="PostAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>postal address</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element ref="Staatscode" minOccurs="0"/>
+ <xsd:element ref="Staatsname" minOccurs="0"/>
+
+ <xsd:element ref="Postleitzahl" minOccurs="0"/>
+ <xsd:element ref="Region" minOccurs="0"/>
+ <xsd:element ref="Bundesland" minOccurs="0"/>
+ <xsd:element ref="Gemeinde" minOccurs="0"/>
+ <xsd:element ref="Gemeindekennziffer" minOccurs="0"/>
+ <xsd:element ref="Ortschaft" minOccurs="0"/>
+ <xsd:element ref="OrtschaftZweisprachig" minOccurs="0"/>
+ <xsd:element name="Zustelladresse" type="ZustelladresseTyp" minOccurs="0"/>
+
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="ZustelladresseTyp">
+ <xsd:sequence>
+ <xsd:element ref="Adresszeile" minOccurs="0"/>
+ <xsd:element ref="Strassenname" minOccurs="0"/>
+ <xsd:element ref="Orientierungsnummer" minOccurs="0"/>
+ <xsd:element ref="Gebaeude" minOccurs="0"/>
+ <xsd:element ref="Nutzungseinheit" minOccurs="0"/>
+ <xsd:element ref="Postfach" minOccurs="0"/>
+ <xsd:element ref="Wohnsitzqualitaet" minOccurs="0"/>
+ <xsd:element ref="Abgabestelle" minOccurs="0"/>
+ <xsd:element ref="Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element name="AdressRegisterEintrag" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Adresscode" minOccurs="0"/>
+ <xsd:element ref="Subcode" minOccurs="0"/>
+ <xsd:element ref="Objektnummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="InternetAdresse" type="InternetAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Entspricht InternetAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="TelefonAdresse" type="TelefonAdresseTyp" >
+ <xsd:annotation>
+ <xsd:documentation>Container für Telefonnummern, entspricht TelephoneAddress</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="InternetAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>internet based communication</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="dsig:KeyInfo" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>certificate for secure communication</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Adresse">
+ <xsd:annotation>
+ <xsd:documentation>eURI: mail-Adresse, Web, FTP, LDAP, ..., entspricht Address</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:anyURI">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="60"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TelefonAdresseTyp">
+ <xsd:annotation>
+ <xsd:documentation>phone numbers</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element name="Typ">
+ <xsd:annotation>
+ <xsd:documentation>type of phononumber - category (eg 'Festnetz', 'Mobile', 'fax', ...)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Festnetz"/>
+ <xsd:enumeration value="Mobil"/>
+ <xsd:enumeration value="Fax"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Nummer" type="TelekomNummerTyp">
+ <xsd:annotation>
+ <xsd:documentation>phonenumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>any additional properties</xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="TelekomNummerTyp">
+ <xsd:choice>
+ <xsd:element ref="FormatierteNummer"/>
+ <xsd:group ref="TelekomNummernGruppe"/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:group name="TelekomNummernGruppe">
+ <xsd:sequence>
+ <xsd:element ref="InternationalerLaendercode" minOccurs="0"/>
+ <xsd:element ref="NationalNummer" minOccurs="0"/>
+ <xsd:element ref="Vorwahl" minOccurs="0"/>
+ <xsd:element ref="Anschlussnummer"/>
+ <xsd:element ref="Klappe" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="InternationalerLaendercode" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht InternationalCountryCode</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="NationalNummer" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht NationalNumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Vorwahl" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht AreaCityCode</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="Anschlussnummer" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht SubscriberNumber</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="FormatierteNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="25"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Klappe" type="xsd:string">
+ <xsd:annotation>
+ <xsd:documentation>entspricht Extension</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+
+ <xsd:element name="Abgabestelle" type="xsd:boolean"/>
+
+ <xsd:element name="Wohnsitzqualitaet">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="H"/>
+ <xsd:enumeration value="N"/>
+ <xsd:enumeration value="O"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="ISOCode3">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Staatscode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Staatsname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Postleitzahl">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="10"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Region">
+ <xsd:annotation>
+ <xsd:documentation>entspricht Region</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Bundesland">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Wien"/>
+ <xsd:enumeration value="Niederösterreich"/>
+ <xsd:enumeration value="Burgenland"/>
+ <xsd:enumeration value="Oberösterreich"/>
+ <xsd:enumeration value="Steiermark"/>
+ <xsd:enumeration value="Salzburg"/>
+ <xsd:enumeration value="Kärnten"/>
+ <xsd:enumeration value="Tirol"/>
+ <xsd:enumeration value="Vorarlberg"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Gemeinde">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Gemeindekennziffer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Ortschaft">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="OrtschaftZweisprachig">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adresscode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Subcode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Nutzungseinheitlaufnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{4}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Objektnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Strassenname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Orientierungsnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="32"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Gebaeude">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="75"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Nutzungseinheit">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="40"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adresszeile">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Postfach">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonExport.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonExport.xsd
new file mode 100644
index 00000000..5987d099
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonExport.xsd
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Name: PersonExport.xsd
+ Zweck: Definiert allgemein nutzbare Export-Schnittstelle um eine Liste von Personen abzubilden.
+ Author(s): Ehrenmüller Oliver, ZMR-SU
+
+ Aenderungshistorie:
+ 2009-07-20 teo: Überarbeitung PersonExportElementType
+ 2009-07-08 teo: erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:annotation>
+ <xsd:documentation>Definiert allgemein nutzbare Export-Schnittstelle um eine Liste von Personen abzubilden.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:include schemaLocation="InfoFachlich.xsd"/>
+
+ <xsd:element name="PersonExport" type="PersonExportType">
+ <xsd:annotation>
+ <xsd:documentation>Root-Element des Personenexports.</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="PersonExportType">
+ <xsd:annotation>
+ <xsd:documentation>Root-Element des Personenexports.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Message"/>
+ <xsd:element ref="Stichtag"/>
+ <xsd:element name="Database">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Person" type="PersonExportElementType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Gruppiert nach Personen werden alle Elemente in dieser
+ Liste abgebildet.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportElementType">
+ <xsd:annotation>
+ <xsd:documentation>Dieser Type beinhaltet alle Elemente die zu einer Person gehören.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="ID" type="ENTITYIDType"/>
+ <xsd:element name="Typ" type="xsd:string"/>
+ <xsd:element name="Satz" type="PersonExportSatzType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Diese Liste beinhaltet alle Sätze die zu einer
+ Person gehören. Unabhängig von der Tabelle oder
+ Strang-Historie.
+ Fehlt die Liste, ist die Entity zu löschen.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportSatzType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Dieser Type beinhaltet alle Elemente die sich auf einen Eintrag
+ in einer beliebigen Tabelle beziehen.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Tabelle">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="EntityID"/>
+ <xsd:element name="RecID" type="ENTITYIDType"/>
+ <xsd:element name="Created" type="TimestampType"/>
+ <xsd:element name="Feld" type="PersonExportFeldType" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonExportFeldType">
+ <xsd:annotation>
+ <xsd:documentation>Generiersche Name/Wert-Paare für Export</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Name" type="xsd:string"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonFelder.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonFelder.xsd
new file mode 100644
index 00000000..600e01c3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/PersonFelder.xsd
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonFelder.xsd
+Zweck: Definiert allgemein nutzbare Felder für Personendaten
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-06-26 tsch: GeburtsdatumBis hinzugefügt
+2005-08-30 tsch: OrdnungsZahlType hinzugefügt
+2004-01-15 tsch: SVNummer hinzugefügt
+2004-06-24 tsch: OrdnungsZahl, Titel hinzugefügt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+ <xsd:annotation>
+ <xsd:documentation>Personendaten-Felder</xsd:documentation>
+ </xsd:annotation>
+ <xsd:element name="ZMRZahl" type="ZMRZahlType"/>
+
+ <xsd:simpleType name="ZMRZahlType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{12}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="OrdnungsZahl" type="OrdnungsZahlType"/>
+
+ <xsd:simpleType name="OrdnungsZahlType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{12}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="SVNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{10}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Titel">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="StaatZugezogen" type="StaatenNameType"/>
+ <xsd:element name="StaatVerzogen" type="StaatenNameType"/>
+
+ <xsd:element name="GeburtsdatumBis">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Protokollierung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Protokollierung.xsd
new file mode 100644
index 00000000..c9bc3b1a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Protokollierung.xsd
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/Protokoll"
+ xmlns:prot="http://bmi.gv.at/namespace/zmr-su/protokoll/20091125#" elementFormDefault="qualified"
+ attributeFormDefault="qualified">
+
+ <element name="sprotokoll" type="prot:SProtokollType" />
+ <complexType name="SProtokollType">
+ <sequence>
+ <element ref="prot:header" />
+ <element ref="prot:user" />
+ <element ref="prot:application" />
+ </sequence>
+ </complexType>
+
+ <element name="dienststelle" type="prot:DienststelleType" />
+ <complexType name="DienststelleType">
+ <annotation>
+ <documentation>Das Element Dienststelle identifiziert die Dienststelle mit den verschiedenen definierten
+ Codes und Kennzeichen.</documentation>
+ </annotation>
+ <sequence>
+ <element name="dstcode" minOccurs="0">
+ <annotation>
+ <documentation>3-Stelliger Dienststellencode. Wird im neuen Portal wegfallen???
+ </documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <length value="3" />
+ </restriction>
+ </simpleType>
+ </element>
+
+ <element name="dstname" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Klartextname der durchfuehrenden Dienststelle. PVP.ou</documentation>
+ </annotation>
+ </element>
+
+ <element name="mail" minOccurs="0">
+ <annotation>
+ <documentation>Emailadresse der Organisationseinheit/Dienststelle</documentation>
+ </annotation>
+ <complexType>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="art">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="organisationseinheit" />
+ </restriction>
+ </simpleType>
+ </attribute>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ <element name="participant_id" type="string">
+ <annotation>
+ <documentation>Verwaltungskennzeichen (VKZ) der durchfuehrenden Dienststelle
+ (PVP-Header). Kunde fuer Verrechnung</documentation>
+ </annotation>
+ </element>
+ <element name="gvouid" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Bundesweite eindeutige ID der Dienststelle (vom Portal) fuer Verrechnung.
+ PVP.gvOuId - bleibt das?</documentation>
+ </annotation>
+ </element>
+ <element name="kostcenter_id" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Verwaltungskennzeichen (VKZ) der Kostenstelle des Users aus
+ PVP-Header normalerweise der Kunde (BMI Kundennummer) fuer Verrechnung. PVP.CostCenterId</documentation>
+ </annotation>
+ </element>
+ <element name="invoice_receipt_id" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Verwaltungskennzeichen (VKZ) des Rechnungsempfaengers aus PVP-Header
+ Provider fuer Verrechnung. PVP.invoiceReceiptId</documentation>
+ </annotation>
+ </element>
+ <element name="charge_code" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Liste von Codes aus PVP-Header fuer Verrechnung. PVP.ChargeCode</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </complexType>
+
+ <element name="header" type="prot:HeaderType" />
+ <complexType name="HeaderType">
+ <sequence>
+ <element name="protdatum" type="prot:DatumRedType"></element>
+ <element name="protzeit" type="prot:TimeRedType"></element>
+ <element name="application" type="string">
+ <annotation>
+ <documentation>Applikationskurzzeichen, Beispiel: "X02"</documentation>
+ </annotation>
+ </element>
+ <element name="applicationVersion" type="string">
+ <annotation>
+ <documentation>Versionsnummer wie sie auch im GUI angezeigt wird</documentation>
+ </annotation>
+ </element>
+
+ <element name="verarbeitungsart" type="string">
+ <annotation>
+ <documentation>Applikationskurzzeichen-Verarbeitungsbezeichnung
+ </documentation>
+ </annotation>
+ </element>
+
+ <element name="kzanfrage">
+ <annotation>
+ <documentation>If (Anfrage oder Auskunft)="1" Else="0" </documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <pattern value="[01]" />
+ </restriction>
+ </simpleType>
+ </element>
+
+ <element name="kzupdate" minOccurs="0">
+ <annotation>
+ <documentation>If Update="1" Else "0"</documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <pattern value="[01]" />
+ </restriction>
+ </simpleType>
+ </element>
+
+ <element name="fundstellen" type="integer" minOccurs="0">
+ <annotation>
+ <documentation>Summe der Anzahl der Treffer</documentation>
+ </annotation>
+ </element>
+
+ <element name="ergebnis" minOccurs="0">
+ <annotation>
+ <documentation>If Treffer="P", If Kein Treffer="N", If Treffer mit abweichenden Personendaten="I"
+ </documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <pattern value="[INP]" />
+ </restriction>
+ </simpleType>
+ </element>
+
+ <element name="trancode" minOccurs="0">
+ <annotation>
+ <documentation>z.B.: "X02A" "X02B" analog zu den Hosttransaktionen</documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <pattern value="[0-9A-Z _\-]{4}" />
+ </restriction>
+ </simpleType>
+ </element>
+
+ <element name="trannr" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Transaktionsnummer</documentation>
+ </annotation>
+ </element>
+
+ <element name="behoerde" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Behoerdenschluessel der durchfuehrenden Behoerde. Wenn in Applikation
+ geprueft, dann MUSS es vorhanden sein, sonst 000000</documentation>
+ </annotation>
+ </element>
+
+ <element name="systemid" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Entiwcklungsumgebung=WEBS, Testumgebung=WEBT,
+ Produktionsumgebung=WEBP</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </complexType>
+
+ <element name="user" type="prot:UserType" />
+ <complexType name="UserType">
+ <annotation>
+ <documentation>Das Element User identifiziert den User, der den Request ausgelöst hat und die
+ Dienststelle, welcher der Request zuzuordnen ist.</documentation>
+ </annotation>
+ <sequence>
+ <element name="globalid" type="string" minOccurs="0">
+ <annotation>
+ <documentation>gvgid im Sinne des Portalverbundes, Wert der "OPK". PVP.gvGid</documentation>
+ </annotation>
+ </element>
+ <element name="commname" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Familienname und Vorname. PVP.cn</documentation>
+ </annotation>
+ </element>
+ <element name="userid" type="string">
+ <annotation>
+ <documentation>Anmeldename des durchführenden Benutzers. PVP.userId</documentation>
+ </annotation>
+ </element>
+ <element name="mail" minOccurs="0">
+ <annotation>
+ <documentation>Emailadresse des Users aus PVP-Header. PVP.mail</documentation>
+ </annotation>
+ <complexType>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="art">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="user"></enumeration>
+ </restriction>
+ </simpleType>
+ </attribute>
+ </extension>
+ </simpleContent>
+ </complexType>
+ </element>
+ <element ref="prot:dienststelle">
+ <annotation>
+ <documentation>Dienststelle</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="ReferenzType">
+ <annotation>
+ <documentation>Vordefinierte Werte für Referenzarten:
+ * edv_zahl
+ * dastazahl
+ * numerator_nr
+ * geschaeftszahl</documentation>
+ </annotation>
+ <sequence>
+ <element name="transactionid" type="string">
+ <annotation>
+ <documentation>Transaktionsnummer</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </complexType>
+
+ <element name="application" type="prot:ApplicationType" />
+ <complexType name="ApplicationType">
+ <sequence>
+
+ <element name="bezug" type="string">
+ <annotation>
+ <documentation>String-Begruendung der Anfrage fuer den User "hilfreich" bei
+ DS-Rueckfrage. Manuelle Eingabe oder Vorgangsbeschreibung.</documentation>
+ </annotation>
+ </element>
+
+ <element ref="prot:person" minOccurs="0" />
+
+ <element name="referenzen" type="prot:ReferenzType" minOccurs="0" maxOccurs="unbounded">
+ <annotation>
+ <documentation>Protokoll:Referenz</documentation>
+ </annotation>
+ </element>
+
+ <element name="request" type="string" minOccurs="0">
+ <annotation>
+ <documentation>SOAP Request im Fall von Abfragen, Suchen. Parameter wenn es sich um eine
+ Batchanforderung handelt, sonst leer.
+ Weitere applikationsspezifische Daten, allenfalls notwendige Tags
+ sind mit IV/2 abzustimmen.
+ Datumselemente: Art ist mit IV/2 abzustimmen.</documentation>
+ </annotation>
+ </element>
+
+ </sequence>
+ </complexType>
+
+ <element name="person" type="prot:PersonType" />
+ <complexType name="PersonType">
+ <annotation>
+ <documentation>Zurueckgelieferte Person.</documentation>
+ </annotation>
+ <sequence>
+ <element name="rolle" type="prot:RolleType">
+ <annotation>
+ <documentation>im ZMR: "ZMR-Meldung", "Meldepflichtiger". ERnP??? Definition???
+ Attribute
+ art="personenrolle"</documentation>
+ </annotation>
+ </element>
+ <element name="familienname" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Familienname der Person. ZPR.famname</documentation>
+ </annotation>
+ </element>
+ <element name="vorname" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Vorname der Person. ZPR.vorname</documentation>
+ </annotation>
+ </element>
+ <element name="geburtsort" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Geburtsort</documentation>
+ </annotation>
+ </element>
+ <element ref="prot:geburtsdaten" minOccurs="0" />
+ <element name="akademischer_grad" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Zu klären:
+ * was vom Akademischen Grad
+ * welche Grade
+ * Reihenfolge
+ * Kurzform, nur
+ vorangestellte?</documentation>
+ </annotation>
+ </element>
+ <element name="geschlecht" type="prot:GeschlechtType" minOccurs="0">
+ <annotation>
+ <documentation>Kennzeichen Geschlecht.</documentation>
+ </annotation>
+ </element>
+ <element name="geburtsstaat" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Geburtsstaat. Normierung?</documentation>
+ </annotation>
+ </element>
+ <element name="speicherdatum" type="string" minOccurs="0">
+ <annotation>
+ <documentation>JJJJMMTT created: Letztes Aenderungsdatum der Person.</documentation>
+ </annotation>
+ </element>
+ <element name="zmrzahl" minOccurs="0">
+ <annotation>
+ <documentation>zmrzahl</documentation>
+ </annotation>
+ <simpleType>
+ <restriction base="string">
+ <length value="12"></length>
+ </restriction>
+ </simpleType>
+ </element>
+ <element ref="prot:adressen" minOccurs="0" />
+ </sequence>
+ </complexType>
+
+ <element name="adressen" type="prot:AdressenType" />
+ <complexType name="AdressenType">
+ <annotation>
+ <documentation>Liste von Adressen. Es wird nur eine Adresse ausgegeben (bisherige Logik)
+ </documentation>
+ </annotation>
+ <sequence>
+ <element ref="prot:adresse" maxOccurs="unbounded" />
+ </sequence>
+ </complexType>
+
+ <element name="adresse" type="prot:AdresseType"/>
+ <complexType name="AdresseType">
+ <sequence>
+ <element name="plz" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Postleitzahl. Meldung.plz</documentation>
+ </annotation>
+ </element>
+ <element name="ortname" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Ortname (vereinfacht?). Meldung.ortname</documentation>
+ </annotation>
+ </element>
+ <element name="strasse" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Strassenname. Meldung.strname</documentation>
+ </annotation>
+ </element>
+ <element name="hausnummer" type="string" minOccurs="0">
+ <annotation>
+ <documentation>Hausnummer. Meldung.hausnummer</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </complexType>
+
+ <complexType name="GeburtsdatenType">
+ <choice>
+ <element name="geburtsdatum" type="prot:DatumRedType">
+ <annotation>
+ <documentation>JJJJMMTT: Gebdatum</documentation>
+ </annotation>
+ </element>
+ <sequence>
+ <element name="geburtsdatum_von" type="string" minOccurs="0">
+ <annotation>
+ <documentation>JJJJMMTT: Suche mit unvollständigem Datum (Jahr)</documentation>
+ </annotation>
+ </element>
+ <element name="geburtsdatum_bis" type="string" minOccurs="0">
+ <annotation>
+ <documentation>JJJJMMTT: Suche mit unvollständigem Datum (Jahr)</documentation>
+ </annotation>
+ </element>
+ </sequence>
+ </choice>
+ </complexType>
+
+ <element name="geburtsdaten" type="prot:GeburtsdatenType">
+ <annotation>
+ <documentation>Geburstsdatum oder Suchintervall</documentation>
+ </annotation>
+ </element>
+
+
+ <simpleType name="DatumRedType">
+ <annotation>
+ <documentation>
+ DatumRedType: Format JJJJMMTT richtet sich nach
+ xsd:date, '00' bei Monat und Tag erlaubt.
+ Keine
+ Trennzeichen
+ </documentation>
+ </annotation>
+ <restriction base="string">
+ <pattern value="[2-9][0-9]{3}[01][0-9][0-3][0-9]" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="TimeRedType">
+ <annotation>
+ <documentation>
+ TimeRedType: Format (mindestens HHMMSS) richtet sich
+ nach xsd:dateTime, ohne Datumsanteil und
+ ohne
+ Trennzeichen. 0 bis 3 Nachkommastellen sind zulaessig
+ </documentation>
+ </annotation>
+ <restriction base="string">
+ <pattern value="[0-2][0-9][0-6][0-9][0-6][0-9][0-9]{0,3}" />
+ </restriction>
+ </simpleType>
+
+ <simpleType name="GeschlechtType">
+ <annotation>
+ <documentation>Maennlich="1", Weiblich="2", Unbekannt="3", Juristische Person="4".
+ "Juristische Person" ist nur in enstprechenden Anwendungen/Anwendungsfaellen zulaessig.</documentation>
+ </annotation>
+ <restriction base="string">
+ <enumeration value="1">
+ <annotation>
+ <documentation>maennlich</documentation>
+ </annotation>
+ </enumeration>
+ <enumeration value="2">
+ <annotation>
+ <documentation>weiblich</documentation>
+ </annotation>
+ </enumeration>
+ <enumeration value="3">
+ <annotation>
+ <documentation>unbekannt</documentation>
+ </annotation>
+ </enumeration>
+ <enumeration value="4">
+ <annotation>
+ <documentation>juristische Person</documentation>
+ </annotation>
+ </enumeration>
+ </restriction>
+ </simpleType>
+
+ <complexType name="RolleType">
+ <annotation>
+ <documentation>im ZMR: "ZMR-Meldung", "Meldepflichtiger". ERnP???
+ Definition??? Attribute
+ art="personenrolle"</documentation>
+ </annotation>
+ <simpleContent>
+ <extension base="string">
+ <attribute name="art" type="string"></attribute>
+ </extension>
+ </simpleContent>
+ </complexType>
+
+ <attribute name="mailAttribute">
+ <simpleType>
+ <restriction base="string">
+ <enumeration value="user"></enumeration>
+ <enumeration value="organisationseinheit"></enumeration>
+ </restriction>
+ </simpleType>
+ </attribute>
+
+</schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/SimpleTypes.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/SimpleTypes.xsd
new file mode 100644
index 00000000..77b3e59e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/SimpleTypes.xsd
@@ -0,0 +1,173 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SimpleTypes.xsd
+Zweck: Definiert allgemein nutzbare simple Datentypen
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+2010-08-25 teo: ZMR-339: ID 343 - USERID DB-Feld erweitern
+2006-05-03 tsch: KGNummerType hinzugefügt
+2004-10-27 tsch: BehoerdenschluesselType hinzugefügt
+2004-09-09 tsch: RegisterType hinzugefügt
+2004-09-08 tsch: BenutzerNameType hinzugefügt
+2004-08-17 tsch: GemeindeNrType hinzugefügt
+2004-06-18 tsch: GrundTextType hinzugefügt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:simpleType name="IntegerType">
+ <xsd:annotation>
+ <xsd:documentation>IntegerType: nicht negativer Integer mit Maximalwert 2^31-1 (Beschränkung durch Datenbank)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:nonNegativeInteger">
+ <xsd:maxExclusive value="2147483648"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="DatumType">
+ <xsd:annotation>
+ <xsd:documentation>DatumType: Format richtet sich nach xsd:date, '00' bei Monat und Tag erlaubt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{4}[\-][0-9]{2}[\-][0-9]{2}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+
+ <xsd:simpleType name="TimestampType">
+ <xsd:annotation>
+ <xsd:documentation>TimestampType: Format richtet sich nach xsd:dateTime, Angabe der Millisekunden ist Pflicht, Zeitzone nicht erlaubt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:dateTime">
+ <xsd:pattern value="[0-9]{4}[\-][0-9]{2}[\-][0-9]{2}[T][0-9]{2}[:][0-9]{2}[:][0-9]{2}[.][0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="IDType">
+ <xsd:annotation>
+ <xsd:documentation>IDs</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:unsignedLong">
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ENTITYIDType">
+ <xsd:annotation>
+ <xsd:documentation>Entity-IDs (können auch alphanumerisch sein, z.B. alte edvzahlen)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="64"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="StaatenNameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="GrundCodeType">
+ <xsd:restriction base="xsd:string" >
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GrundTextType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GrundFreitextType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="228"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="BehoerdenNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BehoerdenschluesselType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{6}|C[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GemeindeNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="KGNummerType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="5"/>
+ <xsd:maxLength value="5"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="GemeindenameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="KundenNrType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5,6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="OrgTypType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="OrgCodeType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BezugsfeldType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BenutzerType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="100"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="BenutzerNameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="RegisterType">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ZMR"/>
+ <xsd:enumeration value="EGR"/>
+ <xsd:enumeration value="LMR"/>
+ <xsd:enumeration value="ZPR"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/W3C-XMLDSig.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/W3C-XMLDSig.xsd
new file mode 100644
index 00000000..63440043
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/W3C-XMLDSig.xsd
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
+ -->
+<!--<!DOCTYPE schema
+ [
+ <!ATTLIST schema
+ xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#"
+>
+ <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'>
+ <!ENTITY % p ''>
+ <!ENTITY % s ''>
+]> -->
+<!-- Schema for XML Signatures
+ http://www.w3.org/2000/09/xmldsig#
+ $Revision: 1.1 $ on $Date: 2002/11/11 16:24:27 $ by $Author: Linauer $
+
+ Copyright 2001 The Internet Society and W3C (Massachusetts Institute
+ of Technology, Institut National de Recherche en Informatique et en
+ Automatique, Keio University). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/
+
+ This document is governed by the W3C Software License [1] as described
+ in the FAQ [2].
+
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+<schema targetNamespace="http://www.w3.org/2000/09/xmldsig#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" version="0.1">
+ <!-- Basic Types Defined for Signatures -->
+ <!-- modified to ensure that whiteSpace is preserved
+<simpleType name="CryptoBinary">
+ <restriction base="base64Binary">
+ </restriction>
+</simpleType>
+ -->
+ <simpleType name="CryptoBinary">
+ <restriction base="string">
+ <whiteSpace value="preserve"/>
+ <pattern value="[A-Za-z0-9\+/=\n\r\t ]*"/>
+ </restriction>
+ </simpleType>
+ <!-- Start Signature -->
+ <element name="Signature" type="ds:SignatureType"/>
+ <complexType name="SignatureType">
+ <sequence>
+ <element ref="ds:SignedInfo"/>
+ <element ref="ds:SignatureValue"/>
+ <element ref="ds:KeyInfo" minOccurs="0"/>
+ <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureValue" type="ds:SignatureValueType"/>
+ <complexType name="SignatureValueType">
+ <simpleContent>
+ <extension base="ds:CryptoBinary">
+ <attribute name="Id" type="ID" use="optional"/>
+ </extension>
+ </simpleContent>
+ </complexType>
+ <!-- Start SignedInfo -->
+ <element name="SignedInfo" type="ds:SignedInfoType"/>
+ <complexType name="SignedInfoType">
+ <sequence>
+ <element ref="ds:CanonicalizationMethod"/>
+ <element ref="ds:SignatureMethod"/>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="CanonicalizationMethod" type="ds:CanonicalizationMethodType"/>
+ <complexType name="CanonicalizationMethodType" mixed="true">
+ <sequence>
+ <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <element name="SignatureMethod" type="ds:SignatureMethodType"/>
+ <complexType name="SignatureMethodType" mixed="true">
+ <sequence>
+ <element name="HMACOutputLength" type="ds:HMACOutputLengthType" minOccurs="0"/>
+ <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+ <!-- (0,unbounded) elements from (1,1) external namespace -->
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <!-- Start Reference -->
+ <element name="Reference" type="ds:ReferenceType"/>
+ <complexType name="ReferenceType">
+ <sequence>
+ <element ref="ds:Transforms" minOccurs="0"/>
+ <element ref="ds:DigestMethod"/>
+ <element ref="ds:DigestValue"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="URI" type="anyURI" use="optional"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+ </complexType>
+ <element name="Transforms" type="ds:TransformsType"/>
+ <complexType name="TransformsType">
+ <sequence>
+ <element ref="ds:Transform" maxOccurs="unbounded"/>
+ </sequence>
+ </complexType>
+ <element name="Transform" type="ds:TransformType"/>
+ <complexType name="TransformType" mixed="true">
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <element name="XPath" type="string"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ </choice>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <!-- End Reference -->
+ <element name="DigestMethod" type="ds:DigestMethodType"/>
+ <complexType name="DigestMethodType" mixed="true">
+ <sequence>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Algorithm" type="anyURI" use="required"/>
+ </complexType>
+ <element name="DigestValue" type="ds:DigestValueType"/>
+ <simpleType name="DigestValueType">
+ <restriction base="ds:CryptoBinary"/>
+ </simpleType>
+ <!-- End SignedInfo -->
+ <!-- Start KeyInfo -->
+ <element name="KeyInfo" type="ds:KeyInfoType"/>
+ <complexType name="KeyInfoType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <element ref="ds:KeyName"/>
+ <element ref="ds:KeyValue"/>
+ <element ref="ds:RetrievalMethod"/>
+ <element ref="ds:X509Data"/>
+ <element ref="ds:PGPData"/>
+ <element ref="ds:SPKIData"/>
+ <element ref="ds:MgmtData"/>
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (0,unbounded) namespaces -->
+ </choice>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="KeyName" type="string"/>
+ <element name="MgmtData" type="string"/>
+ <element name="KeyValue" type="ds:KeyValueType"/>
+ <complexType name="KeyValueType" mixed="true">
+ <choice>
+ <element ref="ds:DSAKeyValue"/>
+ <element ref="ds:RSAKeyValue"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </complexType>
+ <element name="RetrievalMethod" type="ds:RetrievalMethodType"/>
+ <complexType name="RetrievalMethodType">
+ <sequence>
+ <element name="Transforms" type="ds:TransformsType" minOccurs="0"/>
+ </sequence>
+ <attribute name="URI" type="anyURI"/>
+ <attribute name="Type" type="anyURI" use="optional"/>
+ </complexType>
+ <!-- Start X509Data -->
+ <element name="X509Data" type="ds:X509DataType"/>
+ <complexType name="X509DataType">
+ <sequence maxOccurs="unbounded">
+ <choice>
+ <element name="X509IssuerSerial" type="ds:X509IssuerSerialType"/>
+ <element name="X509SKI" type="ds:CryptoBinary"/>
+ <element name="X509SubjectName" type="string"/>
+ <element name="X509Certificate" type="ds:CryptoBinary"/>
+ <element name="X509CRL" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax"/>
+ </choice>
+ </sequence>
+ </complexType>
+ <complexType name="X509IssuerSerialType">
+ <sequence>
+ <element name="X509IssuerName" type="string"/>
+ <element name="X509SerialNumber" type="integer"/>
+ </sequence>
+ </complexType>
+ <!-- End X509Data -->
+ <!-- Begin PGPData -->
+ <element name="PGPData" type="ds:PGPDataType"/>
+ <complexType name="PGPDataType">
+ <choice>
+ <sequence>
+ <element name="PGPKeyID" type="ds:CryptoBinary"/>
+ <element name="PGPKeyPacket" type="ds:CryptoBinary" minOccurs="0"/>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ <sequence>
+ <element name="PGPKeyPacket" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </sequence>
+ </choice>
+ </complexType>
+ <!-- End PGPData -->
+ <!-- Begin SPKIData -->
+ <element name="SPKIData" type="ds:SPKIDataType"/>
+ <complexType name="SPKIDataType">
+ <sequence maxOccurs="unbounded">
+ <element name="SPKISexp" type="ds:CryptoBinary"/>
+ <any namespace="##other" processContents="lax" minOccurs="0"/>
+ </sequence>
+ </complexType>
+ <!-- End SPKIData -->
+ <!-- End KeyInfo -->
+ <!-- Start Object (Manifest, SignatureProperty) -->
+ <element name="Object" type="ds:ObjectType"/>
+ <complexType name="ObjectType" mixed="true">
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <any namespace="##any" processContents="lax"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ <attribute name="MimeType" type="string" use="optional"/>
+ <attribute name="Encoding" type="anyURI" use="optional"/>
+ <!-- add a grep facet -->
+ </complexType>
+ <element name="Manifest" type="ds:ManifestType"/>
+ <complexType name="ManifestType">
+ <sequence>
+ <element ref="ds:Reference" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureProperties" type="ds:SignaturePropertiesType"/>
+ <complexType name="SignaturePropertiesType">
+ <sequence>
+ <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <element name="SignatureProperty" type="ds:SignaturePropertyType"/>
+ <complexType name="SignaturePropertyType" mixed="true">
+ <choice maxOccurs="unbounded">
+ <any namespace="##other" processContents="lax"/>
+ <!-- (1,1) elements from (1,unbounded) namespaces -->
+ </choice>
+ <attribute name="Target" type="anyURI" use="required"/>
+ <attribute name="Id" type="ID" use="optional"/>
+ </complexType>
+ <!-- End Object (Manifest, SignatureProperty) -->
+ <!-- Start Algorithm Parameters -->
+ <simpleType name="HMACOutputLengthType">
+ <restriction base="integer"/>
+ </simpleType>
+ <!-- Start KeyValue Element-types -->
+ <element name="DSAKeyValue" type="ds:DSAKeyValueType"/>
+ <complexType name="DSAKeyValueType">
+ <sequence>
+ <sequence minOccurs="0">
+ <element name="P" type="ds:CryptoBinary"/>
+ <element name="Q" type="ds:CryptoBinary"/>
+ </sequence>
+ <element name="J" type="ds:CryptoBinary" minOccurs="0"/>
+ <element name="G" type="ds:CryptoBinary" minOccurs="0"/>
+ <element name="Y" type="ds:CryptoBinary"/>
+ <sequence minOccurs="0">
+ <element name="Seed" type="ds:CryptoBinary"/>
+ <element name="PgenCounter" type="ds:CryptoBinary"/>
+ </sequence>
+ </sequence>
+ </complexType>
+ <element name="RSAKeyValue" type="ds:RSAKeyValueType"/>
+ <complexType name="RSAKeyValueType">
+ <sequence>
+ <element name="Modulus" type="ds:CryptoBinary"/>
+ <element name="Exponent" type="ds:CryptoBinary"/>
+ </sequence>
+ </complexType>
+ <!-- End KeyValue Element-types -->
+ <!-- End Signature -->
+</schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Workflow.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Workflow.xsd
new file mode 100644
index 00000000..729b61ee
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/Workflow.xsd
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Workflow.xsd
+Zweck: Definiert Datentypen für die Geschäftsprozesssteuerung der Usecases
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-08-02 tsch: Vorgang WorkflowsAuflisten hinzugefügt
+2004-06-29 tsch: Subprozess Struktur vereinfacht
+2004-06-14 tsch: ProzessAnzeigeenamen hinzugefügt
+2004-06-14 tsch: Optionale VerlassenerProzessInstanzID hinzugefügt
+2004-05-19 tsch: SequenceID hinzugefügt, Umbenennung Process->Prozess
+2004-05-17 tsch: Umbenennungen: Activity nach Vorgang, Workflowitems nach Subprozesse
+2004-05-04 tsch: ProcessID->ProcessName, ActivityID->ActivityName
+2003-12-12 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="SimpleTypes.xsd"/>
+
+
+ <xsd:element name="WorkflowInfoClient">
+ <xsd:annotation>
+ <xsd:documentation>Workflowinformationen des Clients</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ProzessName"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Wenn der Geschäftsprozess aus mehreren Vorgängen besteht,
+ müssen die ProzessinstanzID und SequenzID aus der letzten
+ Server-Response vom Client geschickt werden.
+ Beim ersten Vorgang eines neuen Geschäftsprozesses dürfen die beiden
+ Felder nicht geschickt werden.
+ Bei Beginn einen neuen Geschäftsprozesses SOLLTE die InstanzID des letztzen
+ Prozesses als VerlassenerProzessInstanzID mitgeschickt werden
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="ProzessInstanzID"/>
+ <xsd:element ref="VerlassenerProzessInstanzID" minOccurs="0"/>
+ <xsd:element ref="SequenzID"/>
+ </xsd:sequence>
+ <xsd:element ref="VorgangName"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WorkflowInfoServer">
+ <xsd:annotation>
+ <xsd:documentation>Workflowinformationen des Servers</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Der Prozessname dient zur technischen Identifikation des Prozesses, der ProzessAnzeigeName
+ kann zur Anzeige auf der Benutzeroberfläche verwendet werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="ProzessName"/>
+ <xsd:element ref="ProzessAnzeigeName" minOccurs="0"/>
+ <xsd:element ref="ProzessInstanzID"/>
+ <xsd:element ref="ProzessStatus"/>
+ <xsd:element ref="SequenzID"/>
+ <xsd:element ref="Subprozess" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="SubprozessType">
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>
+ Der VorgangName dient zur technischen Identifikation des Vorgangs, der VorgangAnzeigeName
+ kann zur Anzeige auf der Benutzeroberfläche verwendet werden.
+ Die Elemente VorgangRestriction und VorgangConditions werden in näherer Zukunft nicht implementiert
+ und können ignoriert werden (werden nicht befüllt).
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="VorgangName"/>
+ <xsd:element ref="VorgangAnzeigeName" minOccurs="0"/>
+ <xsd:element ref="VorgangStatus"/>
+ <xsd:element ref="VorgangRestriction" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="VorgangConditions" minOccurs="0"/>
+ <xsd:element name="Required" type="xsd:boolean"/>
+ <xsd:element name="Visible" type="xsd:boolean"/>
+ <xsd:element ref="Subprozess" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Subprozess" type="SubprozessType"/>
+
+ <xsd:element name="ProzessInstanzID" type="IDType"/>
+ <xsd:element name="VerlassenerProzessInstanzID" type="IDType"/>
+ <xsd:element name="SequenzID" type="IDType"/>
+
+ <xsd:element name="ProzessName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ProzessAnzeigeName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ProzessStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="O"/>
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="C"/>
+ <xsd:enumeration value="E"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangAnzeigeName">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="90"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="O"/>
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="C"/>
+ <xsd:enumeration value="E"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="VorgangRestriction">
+ <xsd:annotation>
+ <xsd:documentation>regionale Restriktion, die fuer den Vorgang gilt (z.B. Gemeindenummer, fuer die Personen angemeldet werden duerfen.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="RestrictionType" type="xsd:string"/>
+ <xsd:element name="RestrictionValue" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="VorgangConditions">
+ <xsd:annotation>
+ <xsd:documentation>Liste von Bedingungen, unter denen das Item aktiv wird.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="SelectedItems" minOccurs="1" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>Liste von alternativen Voraussetzungen (ODER) für die Anwählbarkeit der Activity. Ein Eintrag repräsentiert eine Reihe von Objekten, die im Suchergebnis ausgewählt sein müssen (UND).</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="SelectedItem" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema>
+ \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/gis-schnittstelle.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/gis-schnittstelle.xsd
new file mode 100644
index 00000000..4228c88f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/gis-schnittstelle.xsd
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" elementFormDefault="qualified">
+
+ <xsd:element name="GISListe">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISDaten" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISDaten" type="GISDatenType"/>
+ <xsd:complexType name="GISDatenType">
+ <xsd:sequence>
+ <xsd:element ref="Erstellungsdatum" minOccurs="0"/>
+ <xsd:element ref="Stichtagsdatum" minOccurs="0"/>
+ <xsd:element ref="Filter" minOccurs="0"/>
+ <xsd:element ref="Gemeindekennziffer" minOccurs="0"/>
+ <xsd:element ref="Ortkennziffer" minOccurs="0"/>
+ <xsd:element ref="Strassekennziffer" minOccurs="0"/>
+ <xsd:element ref="Adresscode" minOccurs="0"/>
+ <xsd:element ref="Subcode" minOccurs="0"/>
+ <xsd:element ref="AdresscodeSubcode" minOccurs="0"/>
+ <xsd:element ref="Objektnummer" minOccurs="0"/>
+ <xsd:element ref="Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element ref="Grundstuecknummer" minOccurs="0"/>
+ <xsd:element ref="GisMeridian" minOccurs="0"/>
+ <xsd:element name="KoordinatenADRCD" type="KoordinatenType" minOccurs="0"/>
+ <xsd:element name="KoordinatenSUBCD" type="KoordinatenType" minOccurs="0"/>
+ <xsd:element ref="Postleitzahl" minOccurs="0"/>
+ <xsd:element ref="Strassenname" minOccurs="0"/>
+ <xsd:element ref="Hausnummer" minOccurs="0"/>
+ <xsd:element ref="Stiege" minOccurs="0"/>
+ <xsd:element ref="Tuer" minOccurs="0"/>
+ <xsd:element ref="ErweitertesAttribut" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Erstellungsdatum" type="xsd:date"/>
+ <xsd:element name="Stichtagsdatum" type="xsd:date"/>
+ <xsd:element name="Filter" type="xsd:string"/>
+
+ <xsd:element name="Gemeindekennziffer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Ortkennziffer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{5}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Strassekennziffer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{6}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Adresscode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Subcode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AdresscodeSubcode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}[0-9]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Objektnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9;A-Z]{7}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Nutzungseinheitlaufnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{4}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Grundstuecknummer">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Katastralgemnr" type="xsd:string"/>
+ <xsd:element name="Haupt" type="xsd:string"/>
+ <xsd:element name="Sub" type="xsd:string"/>
+ <xsd:element name="Punkt" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="GisMeridian" type="xsd:string"/>
+ <xsd:complexType name="KoordinatenType">
+ <xsd:sequence>
+ <xsd:element name="X" type="xsd:float"/>
+ <xsd:element name="Y" type="xsd:float"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:element name="Postleitzahl">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="10"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Strassenname">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Hausnummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Stiege">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Tuer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="ErweitertesAttribut">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Code" type="xsd:string"/>
+ <xsd:element name="Beschreibung" type="xsd:string"/>
+ <xsd:element name="Wert" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/pvp1.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/pvp1.xsd
new file mode 100644
index 00000000..68a1115d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/pvp1.xsd
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema targetNamespace="http://egov.gv.at/pvp1.xsd" xmlns="http://egov.gv.at/pvp1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
+ <xs:element name="pvpToken">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpTokenType" />
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="pvpTokenType">
+ <xs:sequence>
+ <xs:element name="authenticate">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="participantId" type="xs:string" />
+ <xs:element name="gvOuDomain" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:choice>
+ <xs:element name="userPrincipal">
+ <xs:complexType>
+ <xs:complexContent>
+ <xs:extension base="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="gvGid" type="xs:string" />
+ <xs:element name="mail" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="tel" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="bpk" type="xs:string" minOccurs="0" maxOccurs="1" />
+ <xs:element name="gvFunction" type="xs:string" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:extension>
+ </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="systemPrincipal" type="pvpPrincipalType" />
+ </xs:choice>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authentication properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="authorize" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:sequence minOccurs="0">
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ </xs:sequence>
+ <xs:element name="role" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="param" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="key" type="xs:string" />
+ <xs:element name="value" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="value" type="xs:string" use="required" />
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional authorization properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="accounting" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="invoiceRecptId" type="xs:string" />
+ <xs:element name="CostCenterId" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="default" type="xs:boolean" use="optional" default="false" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="ChargeCode" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="default" type="xs:boolean" use="optional" default="false" />
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional properties</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="pvpChainedToken" type="pvpTokenType" minOccurs="0" />
+ <xs:element name="pvpExtension" block="extension" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="orig-host" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="scheme" type="xs:string" />
+ <xs:element name="hostinfo" type="xs:string" />
+ <xs:element name="uri" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="debug-ticket" minOccurs="0" maxOccurs="1">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="txid" type="xs:string" />
+ <xs:element name="log-level" type="logLevelType" minOccurs="0" maxOccurs="1" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:any namespace="##any" processContents="lax" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="version" type="gvVersionType" use="required" />
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:complexType name="pvpPrincipalType">
+ <xs:sequence>
+ <xs:element name="userId" type="xs:string" />
+ <xs:element name="cn" type="xs:string" />
+ <xs:element name="gvOuId" type="xs:string" />
+ <xs:element name="ou" type="xs:string" />
+ <xs:element name="gvSecClass" type="gvSecClassType" minOccurs="0" />
+ <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xs:annotation>
+ <xs:documentation>additional principal attributes</xs:documentation>
+ </xs:annotation>
+ </xs:any>
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+ <xs:simpleType name="gvSecClassType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="gvVersionType">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="1.0" />
+ <xs:enumeration value="1.1" />
+ <xs:enumeration value="1.2" />
+ <xs:enumeration value="1.8" />
+ <xs:enumeration value="1.9" />
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="logLevelType">
+ <xs:restriction base="xs:integer">
+ <xs:enumeration value="0" />
+ <xs:enumeration value="1" />
+ <xs:enumeration value="2" />
+ <xs:enumeration value="3" />
+ <xs:enumeration value="4" />
+ <xs:enumeration value="5" />
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/secext.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/secext.xsd
new file mode 100644
index 00000000..1005b12a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/secext.xsd
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Legal Disclaimer
+
+The presentation, distribution or other dissemination of the information
+contained in this specification is not a license, either expressly or impliedly,
+to any intellectual property owned or controlled by IBM or Microsoft and\or any other
+third party. IBM and Microsoft and\or any other third party may have patents, patent
+applications, trademarks, copyrights, or other intellectual property rights
+covering subject matter in this document. The furnishing of this document
+does not give you any license to IBM's and Microsoft's or any other third party's patents,
+trademarks, copyrights, or other intellectual property.
+
+This specification and the information contained herein is provided on an "AS IS"
+ basis and to the maximum extent permitted by applicable law, IBM and Microsoft provides
+the document AS IS AND WITH ALL FAULTS, and hereby disclaims all other warranties
+and conditions, either express, implied or statutory, including, but not limited
+to, any (if any) implied warranties, duties or conditions of merchantability, of
+fitness for a particular purpose, of accuracy or completeness of responses, of
+results, of workmanlike effort, of lack of viruses, and of lack of negligence,
+all with regard to the document. ALSO, THERE IS NO WARRANTY OR CONDITION OF
+TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO DESCRIPTION OR
+NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS WITH REGARD TO THE DOCUMENT.
+
+IN NO EVENT WILL IBM or MICROSOFT BE LIABLE TO ANY OTHER PARTY FOR THE COST OF PROCURING
+SUBSTITUTE GOODS OR SERVICES, LOST PROFITS, LOSS OF USE, LOSS OF DATA, OR ANY
+INCIDENTAL, CONSEQUENTIAL, DIRECT, INDIRECT, OR SPECIAL DAMAGES WHETHER UNDER
+CONTRACT, TORT, WARRANTY, OR OTHERWISE, ARISING IN ANY WAY OUT OF THIS OR ANY
+OTHER AGREEMENT RELATING TO THIS DOCUMENT, WHETHER OR NOT SUCH PARTY HAD ADVANCE
+NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.
+
+Copyright Notice
+
+Copyright 2001, 2002 IBM Corporation and Microsoft Corporation. All rights reserved.
+-->
+<xsd:schema targetNamespace="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" elementFormDefault="qualified" attributeFormDefault="unqualified" version="0.2">
+ <xsd:element name="Security">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element defines header block to use for security-relevant data directed at a specific SOAP actor.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ The use of "any" is to allow extensibility and different forms of security data.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:any>
+ </xsd:sequence>
+ <xsd:anyAttribute processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UsernameToken">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Username"/>
+ <xsd:element ref="Password" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Username">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Password">
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Type" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="BinarySecurityToken">
+ <xsd:annotation>
+ <xsd:documentation>A security token that is encoded in binary</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:attribute name="ValueType" type="xsd:QName"/>
+ <xsd:attribute name="EncodingType" type="xsd:QName"/>
+ <xsd:anyAttribute namespace="##other" processContents="strict"/>
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="SecurityTokenReference">
+ <xsd:annotation>
+ <xsd:documentation>
+ This element is used reference a security token.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element ref="Reference"/>
+ <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:attribute name="Id" type="xsd:ID"/>
+ <xsd:anyAttribute namespace="##other" processContents="lax"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="Reference">
+ <xsd:complexType>
+ <xsd:attribute name="URI" type="xsd:anyURI"/>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:simpleType name="PasswordTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:PasswordText"/>
+ <xsd:enumeration value="wsse:PasswordDigest"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="ValueTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:X509v3"/>
+ <xsd:enumeration value="wsse:Kerberosv5TGT"/>
+ <xsd:enumeration value="wsse:Kerberosv5ST"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="EncodingTypeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:Base64Binary"/>
+ <xsd:enumeration value="wsse:HexBinary"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ <xsd:simpleType name="FaultcodeEnum">
+ <xsd:restriction base="xsd:QName">
+ <xsd:enumeration value="wsse:UnsupportedSecurityToken"/>
+ <xsd:enumeration value="wsse:UnsupportedAlgorithm"/>
+ <xsd:enumeration value="wsse:InvalidSecurity"/>
+ <xsd:enumeration value="wsse:InvalidSecurityToken"/>
+ <xsd:enumeration value="wsse:FailedAuthentication"/>
+ <xsd:enumeration value="wsse:FailedCheck"/>
+ <xsd:enumeration value="wsse:SecurityTokenUnavailable"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/soapenv.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/soapenv.xsd
new file mode 100644
index 00000000..a5db77f5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/eingebunden/soapenv.xsd
@@ -0,0 +1,129 @@
+<?xml version='1.0' encoding='UTF-8' ?>
+
+<!-- Schema for the SOAP/1.1 envelope
+
+ This schema has been produced using W3C's SOAP Version 1.2 schema
+ found at:
+
+ http://www.w3.org/2001/06/soap-envelope
+
+ Copyright 2001 Martin Gudgin, Developmentor.
+
+ Changes made are the following:
+ - reverted namespace to http://schemas.xmlsoap.org/soap/envelope/
+ - reverted mustUnderstand to only allow 0 and 1 as lexical values
+ - made encodingStyle a global attribute 20020825
+
+ Further changes:
+
+ - removed default value from mustUnderstand attribute declaration - 20030314
+
+ Original copyright:
+
+ Copyright 2001 W3C (Massachusetts Institute of Technology,
+ Institut National de Recherche en Informatique et en Automatique,
+ Keio University). All Rights Reserved.
+ http://www.w3.org/Consortium/Legal/
+
+ This document is governed by the W3C Software License [1] as
+ described in the FAQ [2].
+
+ [1] http://www.w3.org/Consortium/Legal/copyright-software-19980720
+ [2] http://www.w3.org/Consortium/Legal/IPR-FAQ-20000620.html#DTD
+-->
+
+<!--
+2004-12-13 tsch: Content-Validierung im Body-Element von lax auf strict geändert (Element MUSS bekannt sein)
+-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:tns="http://schemas.xmlsoap.org/soap/envelope/"
+ targetNamespace="http://schemas.xmlsoap.org/soap/envelope/" >
+
+
+ <!-- Envelope, header and body -->
+ <xs:element name="Envelope" type="tns:Envelope" />
+ <xs:complexType name="Envelope" >
+ <xs:sequence>
+ <xs:element ref="tns:Header" minOccurs="0" />
+ <xs:element ref="tns:Body" minOccurs="1" />
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax" />
+ </xs:complexType>
+
+ <xs:element name="Header" type="tns:Header" />
+ <xs:complexType name="Header" >
+ <xs:sequence>
+ <xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##other" processContents="lax" />
+ </xs:complexType>
+
+ <xs:element name="Body" type="tns:Body" />
+ <xs:complexType name="Body" >
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="strict" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" >
+ <xs:annotation>
+ <xs:documentation>
+ Prose in the spec does not specify that attributes are allowed on the Body element
+ </xs:documentation>
+ </xs:annotation>
+ </xs:anyAttribute>
+ </xs:complexType>
+
+
+ <!-- Global Attributes. The following attributes are intended to be usable via qualified attribute names on any complex type referencing them. -->
+ <xs:attribute name="mustUnderstand" >
+ <xs:simpleType>
+ <xs:restriction base='xs:boolean'>
+ <xs:pattern value='0|1' />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="actor" type="xs:anyURI" />
+
+ <xs:simpleType name="encodingStyle" >
+ <xs:annotation>
+ <xs:documentation>
+ 'encodingStyle' indicates any canonicalization conventions followed in the contents of the containing element. For example, the value 'http://schemas.xmlsoap.org/soap/encoding/' indicates the pattern described in SOAP specification
+ </xs:documentation>
+ </xs:annotation>
+ <xs:list itemType="xs:anyURI" />
+ </xs:simpleType>
+
+ <xs:attribute name="encodingStyle" type="tns:encodingStyle" />
+ <xs:attributeGroup name="encodingStyle" >
+ <xs:attribute ref="tns:encodingStyle" />
+ </xs:attributeGroup>
+
+ <xs:element name="Fault" type="tns:Fault" />
+ <xs:complexType name="Fault" final="extension" >
+ <xs:annotation>
+ <xs:documentation>
+ Fault reporting structure
+ </xs:documentation>
+ </xs:annotation>
+ <xs:sequence>
+ <xs:element name="faultcode" type="xs:QName" />
+ <xs:element name="faultstring" type="xs:string" />
+ <xs:element name="faultactor" type="xs:anyURI" minOccurs="0" />
+ <xs:element name="detail" type="tns:detail" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="detail">
+ <xs:sequence>
+ <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax" />
+ </xs:sequence>
+ <xs:anyAttribute namespace="##any" processContents="lax" />
+ </xs:complexType>
+
+</xs:schema>
+
+
+
+
+
+
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AblaufendeAuskunftssperrenSuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AblaufendeAuskunftssperrenSuche.xsd
new file mode 100644
index 00000000..cf5a661e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AblaufendeAuskunftssperrenSuche.xsd
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AblaufendeAuskunftssperrenSuche.xsd
+Zweck: Definiert Datentypen für die Suche nach Personen mit ablaufenden Auskunftssperren im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-02-07 tsch: AnzahlSaetze hinzugefügt
+2004-09-28 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="AblaufendeAuskunftssperrenSucheRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SperreBis"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AblaufendeAuskunftssperrenSucheResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AblaufendeAuskunftssperrenSucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AblaufendeAuskunftssperreErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AblaufendeAuskunftssperrenSucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SperreBis"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AblaufendeAuskunftssperreErgebnis" type="AblaufendeAuskunftssperreErgebnisType"/>
+ <xsd:complexType name="AblaufendeAuskunftssperreErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'PersonensucheMsg'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 1</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PAbfrageErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adoption.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adoption.xsd
new file mode 100644
index 00000000..81a29052
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adoption.xsd
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Adoption.xsd
+Zweck: Definiert Datentypen für Adoption einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-02-07 tsch: AdoptionInfo optional
+2004-11-25 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+
+ <xsd:element name="AdoptionRequest">
+ <xsd:annotation>
+ <xsd:documentation>Es können die Person und deren abhängige Entities (z.B. Staatsangehoerigkeit) unabhängig geändert werden. Felder, die nicht geschickt werden, bleiben unverändert, leer geschickte Felder werden gelöscht.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdoptionInfo" minOccurs="0"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:AlternativName" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdoptionResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Adoption</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der geänderten (adoptierten) Person (mit EntityIDs der Person und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdoptionInfo" type="AdoptionInfoType"/>
+ <xsd:complexType name="AdoptionInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Adoption</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Von" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adresssuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adresssuche.xsd
new file mode 100644
index 00000000..41dab2e2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Adresssuche.xsd
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Adresssuche.xsd
+Zweck: Definiert Datentypen für die Suche nach offiziellen STATA-Adressen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-11-20 mp: +Gebäudeeigenschaft, +Nutzungsart
+2005-06-15 pwag: CQ1370: Suchart ADRESSPRUEFUNG hinzugefügt
+2004-11-15 tsch: Detailgrad Gemeinde hinzugefügt
+2004-07-30 tsch: HauptIdentadresse->HauptIdent; Felder hinzu: Adressstatus, Adressschlüssel, HauptIdent, Hofname, Gebaeudeunterscheidung, GBDUntteil, InfoMeldewesen
+2004-07-08 tsch: Felder Adresszusatz, HauptIdentadresse hinzugefügt
+2004-06-24 tsch: GBRRefkey hinzugefügt
+2004-05-17 tsch: Organisation entfernt
+2004-01-27 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="AdresssucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchdaten für die STATA - Adresssuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheInfo"/>
+ <xsd:element ref="Adressdaten"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten, sowie Suchergebnis oder Text-Meldung (falls nichts gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <!-- gibt an, ob Klaerungsadressen erlaubt sind oder nicht -->
+ <xsd:element name="inclKlaerungsadressen" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="Adresssuchergebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AdresssucheInfo"/>
+ <xsd:element ref="Adressdaten"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AdresssucheInfo" type="AdresssucheInfoType"/>
+ <xsd:complexType name="AdresssucheInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Adresssuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Suchart">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ADRESSSUCHE"/>
+ <xsd:enumeration value="IDENTEADRESSENSUCHE"/>
+ <xsd:enumeration value="ADRESSPRUEFUNG"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Adresssuchergebnis" type="AdresssuchergebnisType"/>
+ <xsd:complexType name="AdresssuchergebnisType">
+ <xsd:sequence>
+ <xsd:element name="Detailgrad">
+ <xsd:annotation>
+ <xsd:documentation>Gibt der Detailgrad der Adressen im Suchergebnis an</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Gemeinde"/>
+ <xsd:enumeration value="Ortschaft"/>
+ <xsd:enumeration value="Strassenname"/>
+ <xsd:enumeration value="Orientierungsnummer"/>
+ <xsd:enumeration value="Gebaeudeteil"/>
+ <xsd:enumeration value="Tuer"/>
+ <xsd:enumeration value="Gesamtadresse"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der gefundenen Sätze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="Adressdaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Adressdaten">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="base:Adressstatus" minOccurs="0"/>
+ <xsd:element ref="base:Adressschluessel" minOccurs="0"/>
+ <xsd:element ref="base:HauptIdent" minOccurs="0"/>
+ <xsd:element ref="base:NameZuteil" minOccurs="0"/>
+ <xsd:element ref="base:Hofname" minOccurs="0"/>
+ <xsd:element ref="base:Gebaeudeunterscheidung" minOccurs="0"/>
+ <xsd:element ref="base:GBDUntteil" minOccurs="0"/>
+ <xsd:element ref="base:InfoMeldewesen" minOccurs="0"/>
+ <xsd:element ref="base:GbdEigenschaft" minOccurs="0"/>
+ <xsd:element ref="base:NtzArt" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Anwendungsintegration.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Anwendungsintegration.xsd
new file mode 100644
index 00000000..4bdd43c5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Anwendungsintegration.xsd
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Anwendungsintegration.xsd
+Zweck: Definiert Datentypen für den Usecase "ZMR Anwendungsintegration" im ZMR
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2007-09-04 teo: erstellt.
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+ <xsd:include schemaLocation="Behoerdenabfrage.xsd"/>
+
+ <xsd:element name="AnwendungsintegrationRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Anwendungsintegration im ZMR/ERnP (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AnwendungsintegrationUeberblick" minOccurs="0"/>
+ <xsd:element ref="AnwendungsintegrationDetail" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationInfo">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Anwendungsintegration</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="BezugsfeldDokumente">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="BUERGERZUSTIMMUNG"/>
+ <xsd:enumeration value="BUNDESGESETZ"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Geburtsurkunde" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="Heiratsurkunde" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element name="Staatsbuergerschaftsnachweis" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ <xsd:element ref="PersonUeberblick" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationDetail" type="PersonErgebnisSatzType"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AnwendungsintegrationWiederholung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AnwendungsintegrationWiederholung.xsd
new file mode 100644
index 00000000..6bbd038d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AnwendungsintegrationWiederholung.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AnwendungsintegrationWiederholung.xsd
+Zweck: Definiert Datentypen für den Usecase "ZMR Anwendungsintegration Wiederholungsanfrage" im ZMR
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2007-11-28 teo: erstellt.
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Anwendungsintegration.xsd"/>
+
+ <xsd:element name="AnwendungsintegrationWiederholungRequest">
+ <xsd:annotation>
+ <xsd:documentation>Sammel-Token für die AnwendungsintegrationWiederholung im ZMR/ERnP (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationWiederholungInfo"/>
+ <xsd:element ref="AnwendungsintegrationWiederholungAbfrage" maxOccurs="10"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationWiederholungInfo">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur AnwendungsintegrationWiederholung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="Ergebnisoption">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="PERSONENDATEN"/>
+ <xsd:enumeration value="PERSONENDATENBPK"/>
+ <xsd:enumeration value="BPK"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Verfahrensbereich" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>Verfahrensbereich inkl. Prefix für den die bPK errechnet werden soll (zb. urn:publicid:gv.at:cdid+PV)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="26"/>
+ <xsd:maxLength value="29"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Fremdbereich" minOccurs="0" maxOccurs="10">
+ <xsd:annotation>
+ <xsd:documentation>Fremd-bPKs die miterzeugt werden sollen. (zb. urn:publicid:gv.at:ecdid+BMI+ZP)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="28"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationWiederholungAbfrage">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Anwendungsintegration/Wiederholungsabfrage im ZMR/ERnP (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="AnwendungsintegrationWiederholungResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationWiederholungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AnwendungsintegrationWiederholungDetail" minOccurs="0" maxOccurs="10"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationWiederholungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AnwendungsintegrationWiederholungInfo"/>
+ <xsd:element ref="AnwendungsintegrationWiederholungAbfrage" maxOccurs="10"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnwendungsintegrationWiederholungDetail" type="PersonErgebnisSatzType"/>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AuskunftssperreAendern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AuskunftssperreAendern.xsd
new file mode 100644
index 00000000..9e29f2f2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AuskunftssperreAendern.xsd
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AuskunftssperreAendern.xsd
+Zweck: Definiert Datentypen für den Usecase "Wohnsitz Auskunftssperre Ändern" im ZMR
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2009-08-06 teo: Erstellt
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Auskunftssperre.xsd"/>
+
+ <xsd:element name="AuskunftssperreAendernRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AuskunftssperreAendernResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Änderung von Auskunftssperren auf Meldungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der korrigierten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAendern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAendern.xsd
new file mode 100644
index 00000000..37a3ac98
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAendern.xsd
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AvisoAendern.xsd
+Zweck: Definiert Datentypen für die Änderung von Avisi
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-11-26 tsch: Avisotreffer, AvisoBeenden hinzugefügt
+2004-04-13 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Aviso.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="AvisoAendernRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisoAendernInfo"/>
+ <xsd:element ref="AvisoReferenz"/>
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="AvisoAenderung"/>
+ <xsd:element ref="AvisoTrefferAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:element ref="AvisoTrefferAenderung" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Avisonänderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AvisoErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz des geänderten Aviso</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoBeendenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisoReferenz" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoBeendenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Avisobeendugung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AvisoErgebnis" minOccurs="1" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensätze der beendeten Avisi</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoAendernInfo" type="AvisoAendernInfoType"/>
+ <xsd:complexType name="AvisoAendernInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Avisoaenderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAnlegen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAnlegen.xsd
new file mode 100644
index 00000000..92c37432
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoAnlegen.xsd
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AvisoAnlegen.xsd
+Zweck: Definiert Datentypen für die Anlage von Avisi
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-04-13 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Aviso.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="AvisoAnlegenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisoAnlegenInfo"/>
+ <xsd:element ref="AvisoAnlage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoAnlegenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Avisonanlage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AvisoErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz des im ZMR angelegten Aviso</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoAnlegenInfo" type="AvisoAnlegenInfoType"/>
+ <xsd:complexType name="AvisoAnlegenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Avisoanlage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoFreigeben.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoFreigeben.xsd
new file mode 100644
index 00000000..6291dd58
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/AvisoFreigeben.xsd
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AvisoFreigeben.xsd
+Zweck: Definiert Datentypen für die Freigabe von Avisi durch die Meldebehörde
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-01-14 tsch: Freigabe Suche erweitert
+2004-11-26 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/Avisosuche.xsd"/>
+
+ <xsd:element name="AvisoFreigebenSucheRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ <xsd:element ref="AvisoSuche" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoFreigebenSucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort mit den zu aktivierenden Avisi</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Avisosuchergebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoFreigebenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Freigegeben" type="xsd:boolean"/>
+ <xsd:element ref="AvisoReferenz" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoFreigebenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Aviso-Aktivierung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="AvisoErgebnis" minOccurs="1" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensätze der freigegebenen/abgelehnten Avisi</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Avisosuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Avisosuche.xsd
new file mode 100644
index 00000000..82e48c49
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Avisosuche.xsd
@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Avisosuche.xsd
+Zweck: Definiert Datentypen für die Avisosuche
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-01-14 tsch: Feld NurHistorische hinzugefügt
+2004-11-26 tsch: Erweiterung um Avisotreffer
+2004-06-22 tsch: SaetzeVon und SaetzeBis im Ergebnis
+2004-05-17 tsch: Organisation entfernt
+2004-04-06 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Aviso.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="AvisosucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchedaten fuer die Suche nach existierenden Avisi, sowie nach Personen im ZPR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisosucheInfo"/>
+ <xsd:element ref="AvisoSuche" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisosucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten, sowie Suchergebnis oder Text-Meldung (falls nichts gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisosucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Avisosuchergebnis" minOccurs="0"/>
+ <xsd:element ref="PersonenAbfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisosucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="AvisosucheInfo"/>
+ <xsd:element ref="AvisoSuche" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisosucheInfo" type="AvisosucheInfoType"/>
+ <xsd:complexType name="AvisosucheInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Avisosuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element name="InclusivSucheZMR" type="xsd:boolean"/>
+ <xsd:element name="NurAvisoTreffer" type="xsd:boolean"/>
+ <xsd:element name="UnbearbeiteteAnzeigen" type="xsd:boolean"/>
+ <xsd:element name="NurHistorische" type="xsd:boolean"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoSuche" type="AvisoSucheType"/>
+ <xsd:complexType name="AvisoSucheType">
+ <xsd:annotation>
+ <xsd:documentation>Aviso-Struktur für die Suche nach Avisi bzw. Personen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="AvisoAktenzahl" minOccurs="0"/>
+ <xsd:element ref="base:BehoerdenNr" minOccurs="0"/>
+ <xsd:element ref="AvisoZahl" minOccurs="0"/>
+ <xsd:element ref="AvisoSuchdaten" minOccurs="0"/>
+ <xsd:element ref="AvisoStatus" minOccurs="0"/>
+ <xsd:element name="AblaufZeitraum" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Von" type="base:TimestampType"/>
+ <xsd:element name="Bis" type="base:TimestampType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Avisosuchergebnis" type="AvisosuchergebnisType"/>
+ <xsd:complexType name="AvisosuchergebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Aviso-Struktur für Neuanlagen von Avisi im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Avisi</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 1</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="AvisoErgebnis" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BKMeldeauskunft.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BKMeldeauskunft.xsd
new file mode 100644
index 00000000..b82fae63
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BKMeldeauskunft.xsd
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: BKMeldeauskunft.xsd
+Zweck: Definiert Datentypen für die Meldeauskunft mit Bür aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-10-27 tsch: Meldeauskunft aus Mussfeld im Ergebnis
+2004-05-17 tsch: ZMR-Zahl hinzugefügt
+2004-04-01 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Meldeauskunft.xsd"/>
+
+ <xsd:element name="BKMeldeauskunftRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BKMeldeauskunftInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BKMeldeauskunftResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BKMeldeauskunftAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Meldeauskunft" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BKMeldeauskunftAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BKMeldeauskunftInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BKMeldeauskunftInfo" type="BKMeldeauskunftInfoType"/>
+ <xsd:complexType name="BKMeldeauskunftInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Meldeauskunft</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element ref="base:BPKPersonInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BPKPruefung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BPKPruefung.xsd
new file mode 100644
index 00000000..eb9b3798
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BPKPruefung.xsd
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: BPKPruefung.xsd
+Zweck: Definiert Datentypen für die BPK-Prüfung im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-05-24 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+
+ <xsd:element name="BPKPruefungRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPKPruefungInfo"/>
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPKPruefungResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPKPruefungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="BPKPruefungErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPKPruefungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPKPruefungInfo"/>
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPKPruefungInfo" type="BPKPruefungInfoType"/>
+ <xsd:complexType name="BPKPruefungInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die BPK-Pruefung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="BPKPruefungErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AktMeldesatz" type="xsd:boolean"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Behoerdenabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Behoerdenabfrage.xsd
new file mode 100644
index 00000000..6e764562
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Behoerdenabfrage.xsd
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Behoerdenabfrage.xsd
+Zweck: Definiert Datentypen für die Behoerdenabfrage des ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-01-04 tsch: Feld Personendaten in BehoerdenabfrageDetail optional für Negativdruckauskunft
+2004-12-13 tsch: StandarddokumenteLiefern hinzugefügt
+2004-08-02 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+
+ <xsd:element name="BehoerdenabfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BehoerdenabfrageInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenabfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BehoerdenabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:choice minOccurs="0">
+ <xsd:element ref="BehoerdenabfrageUeberblick"/>
+ <xsd:element ref="BehoerdenabfrageDetail"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenabfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BehoerdenabfrageInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenabfrageInfo" type="BehoerdenabfrageInfoType"/>
+ <xsd:complexType name="BehoerdenabfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Behördenabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld" minOccurs="0"/>
+ <xsd:element name="BehoerdenabfrageAction">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="BUNDGESETZ"/>
+ <xsd:enumeration value="SONSTIGES"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="StandarddokumenteLiefern" minOccurs="0">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="BUERGER"/>
+ <xsd:enumeration value="GESETZ"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element ref="base:ErstellePDF" minOccurs="0"/>
+ <xsd:element name="berechneBpk" type="xsd:boolean" default="false" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BehoerdenabfrageUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ <xsd:element ref="PersonUeberblick" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonKey" />
+ <xsd:element ref="cio:Geburtsdatum" />
+ <xsd:element ref="cio:Geburtsort" minOccurs="0" />
+ <xsd:element ref="cio:Postleitzahl" minOccurs="0" />
+ <xsd:element ref="cio:Ortschaft" minOccurs="0" />
+ <xsd:element ref="cio:Gemeinde" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenabfrageDetail">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Personendaten" minOccurs="0"/>
+ <xsd:element ref="Meldedaten" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonKey" type="base:IDType"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BehoerdenattributeAendern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BehoerdenattributeAendern.xsd
new file mode 100644
index 00000000..aa4b2bbf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BehoerdenattributeAendern.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: BehoerdenattributeAendern.xsd
+Zweck: Definiert Datentypen für Änderungen an den Behördenattribute der Meldungen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-27 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+
+ <xsd:element name="BehoerdenattributeAendernRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Referenz-Daten der betroffenen Person und der Meldung, sowie die geänderten Behördenattribute.
+ Nicht übermittelte Felder bleiben unverändert, Felder, die als Leer-Tags geschickt werden, werden gelöscht.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BehoerdenattributeAendernInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenattributeAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zum Änderungsvorgang</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der geänderten Meldung (geänderte Behördenattribute)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BehoerdenattributeAendernInfo" type="BehoerdenattributeAendernInfoType"/>
+ <xsd:complexType name="BehoerdenattributeAendernInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Änderung der Behördenattribute</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Bestandsaenderungen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Bestandsaenderungen.xsd
new file mode 100644
index 00000000..8abbbedf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Bestandsaenderungen.xsd
@@ -0,0 +1,140 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Zuzugsbestaetigung.xsd
+Zweck: Definiert Datentypen für die Zuzugsbetätigungen aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-01-11 tsch: Feld InclusiveAdressen hinzugefügt
+2004-08-23 tsch: Kapselung der Bestandsänderungssätze im Element Bestandsaenderung
+2004-08-20 tsch: GeburtsdatumVon, GeburtsdatumBis, Geschlecht in Anforderung optional
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BestandsaenderungenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten der Bestandsaenderungen-Anforderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BestandsaenderungenInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BestandsaenderungenResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request und das Abgleichergebnis geliefert.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BestandsaenderungenAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Bestandsaenderungen" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BestandsaenderungenInfo" type="BestandsaenderungenInfoType"/>
+
+ <xsd:complexType name="BestandsaenderungenInfoType">
+ <xsd:sequence>
+ <xsd:element name="AenderungenVon" type="base:TimestampType"/>
+ <xsd:element name="AenderungenBis" type="base:TimestampType"/>
+ <xsd:element name="InclusiveAdressen" type="xsd:boolean"/>
+ <xsd:element name="GeburtsdatumVon" type="base:DatumType" minOccurs="0"/>
+ <xsd:element name="GeburtsdatumBis" type="base:DatumType" minOccurs="0"/>
+ <xsd:element ref="cio:Geschlecht" minOccurs="0"/>
+ <xsd:element ref="Veraenderung" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BestandsaenderungenAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BestandsaenderungenInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Bestandsaenderungen" type="BestandsaenderungenType"/>
+
+ <xsd:complexType name="BestandsaenderungenType">
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der Bestandsaenderung-Saetze für diese Anfrage</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:AnzahlSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Anzahl der im File gelieferten Bestandsaenderung-Saetze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="BestandsaenderungSatz" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="BestandsaenderungSatz" type="BestandsaenderungSatzType"/>
+ <xsd:complexType name="BestandsaenderungSatzType">
+ <xsd:sequence>
+ <xsd:element name="Aenderungszeitpunkt" type="base:TimestampType"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="cio:Identification" minOccurs="0" maxOccurs="3"/>
+ <xsd:element ref="KitQuelleBpk" minOccurs="0"/>
+ <xsd:element ref="KitZielBpk" minOccurs="0"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ <xsd:element ref="Bestandsaenderung" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="KitQuelleBpk">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Identification" minOccurs="0" maxOccurs="3"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="KitZielBpk">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Identification" minOccurs="0" maxOccurs="3"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Veraenderung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+
+ <xsd:element name="Bestandsaenderung">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Veraenderung"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerAnfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerAnfrage.xsd
new file mode 100644
index 00000000..249aa0c0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerAnfrage.xsd
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: BusinesspartnerAnfrage.xsd
+Zweck: Definiert Datentypen fuer alle BusinesspartnerAbfragen im ZMR
+ soll Businesspartnerabfrage.xsd und BusinesspartnerabfrageErweitert.xsd ersetzen
+Author(s): Richard Mayrhofer
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Businesspartnerabfrage.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BusinesspartnerAnfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence minOccurs="1">
+ <xsd:element ref="BusinesspartnerAnfrage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BusinesspartnerAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="AnfrageGrund" type="xsd:string" />
+ <xsd:element ref="AnfrageOptionen" minOccurs="1"/>
+ <xsd:element ref="AnfrageArgumente" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnfrageArgumente">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnfrageOptionen">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="mitPDF" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="AnfrageRegister"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnfrageRegister">
+ <xsd:complexType>
+ <xsd:sequence minOccurs="1" maxOccurs="2">
+ <xsd:element name="Register" type="RegisterValues"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="RegisterValues">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ZMR"/>
+ <xsd:enumeration value="ZPS"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="BusinesspartnerAnfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BusinesspartnerAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="BusinesspartnerAnfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BusinesspartnerAnfrageErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Person"/>
+ <xsd:element ref="Meldung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="PDFDokument" type="xsd:base64Binary" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Meldung">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse"/>
+ <xsd:element ref="base:GemeldetVon" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element name="istAktuell" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Person">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element name="istAktuell" type="xsd:boolean"/>
+ <xsd:element ref="SterbeInfo" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SterbeInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="SterbeDatum" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="SterbeZeit" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="SterbeGemeinde" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="SterbeGemeindekennzahl" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="SterbeStaatsname" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="SterbeStaatscode" type="xsd:string" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Businesspartnerabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Businesspartnerabfrage.xsd
new file mode 100644
index 00000000..2831a33d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Businesspartnerabfrage.xsd
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Businesspartnerabfrage.xsd
+Zweck: Definiert Datentypen fuer die Abfrage für Businesspartner im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-12-15 tsch: NatuerlichePerson optional im Ergebnis (bei Negativauskunft)
+2004-08-02 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BPAbfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPAbfrageInfo"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPAbfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="BPAbfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPAbfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPAbfrageInfo"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPAbfrageInfo" type="BPAbfrageInfoType"/>
+ <xsd:complexType name="BPAbfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die BP-Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="BPAbfrageAction">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="BEFREIT"/>
+ <xsd:enumeration value="SONSTIGES"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="base:ErstellePDF" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="BPAbfrageErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AktMeldesatz" type="xsd:boolean"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerabfrageErweitert.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerabfrageErweitert.xsd
new file mode 100644
index 00000000..75daf516
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/BusinesspartnerabfrageErweitert.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: BusinesspartnerabfrageErweitert.xsd
+Zweck: Definiert Datentypen für die erweiterte Abfrage für Businesspartner im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-08-31 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Businesspartnerabfrage.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BPAbfrageErweitertRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPAbfrageInfo"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPAbfrageErweitertResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="BPAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="BPAbfrageErweitertErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BPAbfrageErweitertErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element name="Meldung" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse"/>
+ <xsd:element ref="base:GemeldetVon"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="AktMeldesatz" type="xsd:boolean"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Datenabgleich.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Datenabgleich.xsd
new file mode 100644
index 00000000..b953f052
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Datenabgleich.xsd
@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Datenabgleich.xsd
+Zweck: Definiert Datentypen für den ZMR-Datenabgleich
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-02-16 tsch: ERnP-Personendaten hinzugefügt
+2005-03-24 tsch: Standarddokumente hinzugefügt
+2004-08-17 tsch: Grundsätzliche Änderung der Datenanlieferung: nicht mehr Gesamtdatensätze, sondern nur geänderte Sätze bei VON-BIS Anforderungen liefern
+2004-06-07 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/ERnPPerson.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="DatenabgleichRequest">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten des Datenabgleichs (täglich, von-bis oder aktuell)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="DatenabgleichInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="DatenabgleichResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request und das Abgleichergebnis geliefert.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="DatenabgleichAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:choice minOccurs="0">
+ <xsd:element ref="Datenabgleich"/>
+ <xsd:element ref="Wohnsitzverzeichnis"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="DatenabgleichInfo" type="DatenabgleichInfoType"/>
+
+ <xsd:complexType name="DatenabgleichInfoType">
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element ref="DatenabgleichAction"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="AbgleichVon" type="base:TimestampType"/>
+ <xsd:element name="AbgleichBis" type="base:TimestampType"/>
+ </xsd:sequence>
+ <xsd:element ref="base:Stichtag" minOccurs="0"/>
+ <xsd:element ref="base:InclusivHistorie" minOccurs="0"/>
+ <xsd:element name="InclusivNWS" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="DatenabgleichAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="DatenabgleichInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="DatenabgleichAction">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AENDERUNGEN"/>
+ <xsd:enumeration value="WOHNSITZVERZEICHNIS"/>
+ <xsd:enumeration value="GEMEINDEABZUG"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="Datenabgleich" type="DatenabgleichType"/>
+
+ <xsd:complexType name="DatenabgleichType">
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der Abgleichsätze für diese Anfrage</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:AnzahlSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Anzahl der im File gelieferten Abgleichsätze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="DatenabgleichSatz" type="DatenabgleichSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="DatenabgleichSatzType">
+ <xsd:sequence>
+ <xsd:element name="Aenderungszeitpunkt" type="base:TimestampType"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="PersonAbgleich" minOccurs="0"/>
+ <xsd:element ref="MeldungAbgleich" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="ERnPPersonAbgleich" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="PersonAbgleich">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="DatenAktiv" type="PersonAbgleichdaten" minOccurs="0"/>
+ <xsd:element name="DatenGeloescht" type="PersonAbgleichdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="PersonAbgleichdaten">
+ <xsd:sequence>
+ <xsd:element name="Person" type="PersonAbgleichErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Staatsangehoerigkeit" type="StaatsangehoerigkeitErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Reisedokument" type="ReisedokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeErgebnisType" minOccurs="0"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AkademischerGrad" type="AkademischerGradErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Standarddokument" type="StandarddokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="MeldungAbgleich">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="DatenAktiv" type="MeldungAbgleichdaten" minOccurs="0"/>
+ <xsd:element name="DatenGeloescht" type="MeldungAbgleichdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="MeldungAbgleichdaten">
+ <xsd:sequence>
+ <xsd:element name="Meldung" type="MeldungAbgleichErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Wohnsitzverzeichnis" type="WohnsitzverzeichnisType"/>
+
+ <xsd:complexType name="WohnsitzverzeichnisType">
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der Abgleichsätze für diese Anfrage</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:AnzahlSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Anzahl der im File gelieferten Abgleichsätze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="SummeHWS"/>
+ <xsd:element ref="SummeNWS"/>
+ <xsd:element name="WohnsitzSatz" type="WohnsitzSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="WohnsitzSatzType">
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="SummeHWS"/>
+ <xsd:element ref="SummeNWS"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:element name="SummeHWS" type="base:IntegerType"/>
+ <xsd:element name="SummeNWS" type="base:IntegerType"/>
+
+
+ <xsd:complexType name="PersonAbgleichErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Datenabgleich-Ergebnisse aus dem ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonAbgleichErgebnisType"/>
+ <xsd:element ref="base:Titel" minOccurs="0"/>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ <xsd:element name="ReferenziertePersonen" type="ReferenziertePersonenErgebnisType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonAbgleichErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Natuerliche Person (Suchergebnis)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractPersonType">
+ <xsd:sequence>
+ <xsd:element name="PersonenName">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Familienname"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="cio:AlternativName" minOccurs="0"/>
+ <xsd:element ref="cio:Familienstand" minOccurs="0"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Geburtsort"/>
+ <xsd:element ref="cio:Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsstaat"/>
+ <xsd:element ref="cio:Sterbedatum" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="MeldungAbgleichErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Meldung-Struktur für Suchergebnisse aus dem ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element name="Wohnsitz" type="WohnsitzErgebnisType"/>
+ <xsd:element ref="base:GemeldetVon"/>
+ <xsd:element ref="base:PeriodeCode"/>
+ <xsd:element ref="base:PeriodeText"/>
+ <xsd:element ref="base:PeriodeFreitext" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ERnPPersonAbgleich">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="DatenAktiv" type="ERnPPersonAbgleichdaten" minOccurs="0"/>
+ <xsd:element name="DatenGeloescht" type="ERnPPersonAbgleichdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="ERnPPersonAbgleichdaten">
+ <xsd:sequence>
+ <xsd:element name="Person" type="ERnPPersonAbgleichErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Staatsangehoerigkeit" type="StaatsangehoerigkeitErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Reisedokument" type="ERnPReisedokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Dokument" type="ERnPDokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Anschrift" type="ERnPAnschriftErgebnisType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ERnPPersonAbgleichErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Datenabgleich-Ergebnisse aus dem ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:OrdnungsZahl"/>
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonAbgleichErgebnisType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ErnpAbfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ErnpAbfrage.xsd
new file mode 100644
index 00000000..12ecd771
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ErnpAbfrage.xsd
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ErnpAbfrage.xsd
+Zweck: ersetzt Szr_Einzel und Kombi-Abfrage, wird aus Ernp3 aufgerufen
+Author(s): Richard Mayrhofer xmayrh2
+-->
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd" />
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd" />
+
+ <xsd:include schemaLocation="Personenabfrage.xsd" />
+
+ <xsd:element name="ErnpRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ErnpAbfrageInfo"/>
+ <xsd:element name="ErnpSuchPerson" minOccurs="1" maxOccurs="100">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0" />
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0" />
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" />
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0" />
+ <xsd:element ref="Pre" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Pre">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Vn" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Fn" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Nve" type="xsd:string" minOccurs="0"/>
+ <xsd:element ref="Gd" minOccurs="0"/>
+ <xsd:element name="Go" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Ges" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Str" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Plz" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Ort" type="xsd:string" minOccurs="0" nillable="true"/>
+ <xsd:element name="Eid" type="xsd:long"/>
+ <xsd:element name="Bz" type="base:OrdnungsZahlType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Gd">
+ <xsd:simpleType>
+ <xsd:annotation>
+ <xsd:documentation>Geburtsdatum, simple type for dates (union), which may omit day and/or month</xsd:documentation>
+ </xsd:annotation>
+ <xsd:union memberTypes="xsd:date xsd:gYearMonth xsd:gYear"/>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ErnpAbfrageInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="ErnpRequestId" type="xsd:string" minOccurs="0" />
+ <xsd:element name="TrefferLimit" type="xsd:int"/>
+ <xsd:element ref="base:Bezugsfeld" />
+ <xsd:element name="Suchkriterien" type="SuchkriterienType"/>
+ <xsd:element name="Suchwizard" type="xsd:boolean" minOccurs="0"/>
+ <xsd:element ref="ErgebnisKriterienPerson"/>
+ <xsd:element ref="ErgebnisKriterienMeldung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ErgebnisKriterienPerson" >
+ <xsd:complexType>
+ <xsd:sequence>
+ <!-- OhneHistorie: default=true -->
+ <xsd:element name="InklusiveHistorische" type="xsd:boolean"/>
+ <!-- ohneSperren: wenn true, werden Auskunftssperren gefiltert -->
+ <xsd:element name="InklusiveAuskunftsgesperrte" type="xsd:boolean"/>
+ <!-- Kitverfolgung: sollen gekittete Personen bis zur aktuellsten Person verfolgt werden, default: true -->
+ <xsd:element name="Kitverfolgung" type="xsd:boolean"/>
+ <!-- Liste von auszufilternden BeginnCodes -->
+ <xsd:element name="ExklusiveBeginnCodes" type="BeginnCode"/>
+ <!-- Liste der zu liefernden Sub-Entitaeten einer Person -->
+ <xsd:element name="AbhaengigeEntitaeten" type="EntitaetenPerson"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ErgebnisKriterienMeldung">
+ <xsd:complexType>
+ <xsd:sequence>
+ <!-- OhneHistorie: default=true -->
+ <xsd:element name="InklusiveHistorische" type="xsd:boolean"/>
+ <!-- ohneSperren: wenn true, werden Auskunftssperren gefiltert -->
+ <xsd:element name="InklusiveAuskunftsgesperrte" type="xsd:boolean"/>
+ <!-- wie werden die Wohnsitze gereiht (geliefert wird nur der erste) -->
+ <xsd:element name="WohnsitzPrioritaet" type="WohnsitzPrioritaet"/>
+ <!-- Liste der zu liefernden Sub-Entitaeten einer Meldung -->
+ <xsd:element name="AbhaengigeEntitaeten" type="EntitaetenMeldung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="WohnsitzPrioritaet">
+ <xsd:restriction base="xsd:string">
+ <!-- nur aktuellster Hauptwohnsitz -->
+ <xsd:enumeration value="juengsterHWS" />
+ <!-- aktuellster Wohnsitz, Reihenfolge Haupt- oder Nebenwohnsitz oder Obdachlos -->
+ <xsd:enumeration value="juengsterHNO" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:simpleType name="BeginnCode">
+ <xsd:list itemType="xsd:string" />
+ </xsd:simpleType>
+
+ <!-- Liste der gewählten Sub-Entities einer Person -->
+ <xsd:simpleType name="EntitaetenMeldung">
+ <xsd:list itemType="EntitaetMeldung"/>
+ </xsd:simpleType>
+
+ <!-- Liste der moeglichen Sub-Entities einer Meldung -->
+ <xsd:simpleType name="EntitaetMeldung">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ORGFELD"/>
+ <xsd:enumeration value="AUSKUNFTSSPERRE"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- Liste der gewählten Sub-Entities einer Person -->
+ <xsd:simpleType name="EntitaetenPerson">
+ <xsd:list itemType="EntitaetPerson"/>
+ </xsd:simpleType>
+
+ <!-- Liste der moeglichen Sub-Entities einer Person -->
+ <xsd:simpleType name="EntitaetPerson">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AKADGRAD" />
+ <xsd:enumeration value="QUALIFIKATIONSKENNZEICHEN" />
+ <xsd:enumeration value="REISEDOKUMENT" />
+ <xsd:enumeration value="STDDOKUMENT" />
+ <xsd:enumeration value="STAATSANGEHOERIGKEIT" />
+ <xsd:enumeration value="AUSKUNFTSSPERRE"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="ErnpResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="base:ServerTransaktionNr"/>
+ <xsd:element ref="ErnpPersonResult" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ErnpPersonResult">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:choice>
+ <xsd:element ref="Ergebnissatz" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="ZMRZahlen" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Ergebnissatz">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="StarRating" type="xsd:float" minOccurs="0"/>
+ <xsd:element name="Register" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="PersonErgebnis" type="PersonErgebnisType" minOccurs="0"/>
+ <xsd:element name="AuskunftssperrePerson" type="xsd:boolean" default="false" minOccurs="0"/>
+ <xsd:element name="Meldedaten" type="MeldedatenType" minOccurs="0"/>
+ <xsd:element name="AuskunftssperreMeldung" type="xsd:boolean" default="false" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Fremdenabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Fremdenabfrage.xsd
new file mode 100644
index 00000000..e4a610ae
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Fremdenabfrage.xsd
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Fremdenabfrage.xsd
+Zweck: Definiert Datentypen für die Fremdenabfrage im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-08-16 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="FremdenabfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="FremdenabfrageInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetVon" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="FremdenabfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="FremdenabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="FremdenabfrageErgebnis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="FremdenabfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="FremdenabfrageInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetVon" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="FremdenabfrageInfo" type="FremdenabfrageInfoType"/>
+ <xsd:complexType name="FremdenabfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Fremdenabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element ref="FremdenabfrageAction"/>
+ <xsd:element ref="base:Bezirkskennung"/>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element name="AlsDruck" type="xsd:boolean"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="FremdenabfrageAction">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="NICHT_OESTERREICH"/>
+ <xsd:enumeration value="EU_OHNE_OESTERREICH"/>
+ <xsd:enumeration value="NICHT_EU"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="FremdenabfrageErgebnis" type="FremdenabfrageErgebnisType"/>
+ <xsd:complexType name="FremdenabfrageErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'base:Message'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 0</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PAbfrageErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISAdressabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISAdressabfrage.xsd
new file mode 100644
index 00000000..3f5bbe7f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISAdressabfrage.xsd
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: GISAdressabfrage.xsd
+Zweck: Definiert Datentypen für die GIS-Adressabfrage aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-08-24 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="GISAdressabfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISAdressabfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISAdressabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="base:GefundeneSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISAdressabfrageDetailRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Bestaetigt" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISAdressabfrageDetailResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISAdressabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="GISAdressabfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISAdressabfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse" minOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISAdressabfrageErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="cio:PersonenDaten" minOccurs="1" maxOccurs="unbounded"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISSuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISSuche.xsd
new file mode 100644
index 00000000..4989b13c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GISSuche.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: GISSuche.xsd
+Zweck: Schnittstelle für die Suche von Personen mittels GIS-Daten
+Author(s): Ehrenmüller Oliver
+
+Aenderungshistorie:
+2009-02-06 teo: +GISSucheInfo
+2009-01-21 teo: erstellt.
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:gis="http://bmi.gv.at/namespace/zmr-su/gis/20070725#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" schemaLocation="../eingebunden/gis-schnittstelle.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+
+ <xsd:element name="GISSucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Request zum Suchen von Personen mittels GIS-Daten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISSucheInfo"/>
+ <xsd:element ref="GISSuche"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISSuche">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="gis:GISListe"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISSucheInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISSucheAnfrage">
+ <xsd:annotation>
+ <xsd:documentation>Request zum Suchen von Personen mittels GIS-Daten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISSucheInfo"/>
+ <xsd:element ref="GISSuche"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GISSucheResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GISSucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Personensuchergebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gemeindeeinstellungen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gemeindeeinstellungen.xsd
new file mode 100644
index 00000000..5096e120
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gemeindeeinstellungen.xsd
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Gemeindeeinstellungen
+Zweck: Definiert Requests/Responses und Datentypen für die Gemeindeeinstellungen und Adress-Sperrlisten.
+Author(s): Richie Mayrhofer, ZMR
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzUmmelden.xsd"/>
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="GemeindeeinstellungenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Lesen der Gemeindeeinstellungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GemeindeeinstellungenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Lesen der Gemeindeeinstellungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ <xsd:element name="inclKlaerung" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GemeindeeinstellungenAendernRequest">
+ <xsd:annotation>
+ <xsd:documentation>Aendern der Gemeindeeinstellungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ <xsd:element name="inclKlaerung" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GemeindeeinstellungenAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Aendern der Gemeindeeinstellungen Ergebnismeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gerichtskommissaerabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gerichtskommissaerabfrage.xsd
new file mode 100644
index 00000000..6eacf127
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Gerichtskommissaerabfrage.xsd
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Gerichtskommissaerabfrage.xsd
+Zweck: Definiert Datentypen für die Gerichtskommissaerabfrage des ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-11-22 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Behoerdenabfrage.xsd"/>
+
+ <xsd:element name="GerichtskommissaerabfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GerichtskommissaerabfrageInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GerichtskommissaerabfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GerichtskommissaerabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:choice minOccurs="0">
+ <xsd:element ref="GerichtskommissaerabfrageUeberblick"/>
+ <xsd:element ref="GerichtskommissaerabfrageDetail"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GerichtskommissaerabfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GerichtskommissaerabfrageInfo"/>
+ <xsd:element ref="PersonKey" minOccurs="0"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GerichtskommissaerabfrageInfo" type="GerichtskommissaerabfrageInfoType"/>
+ <xsd:complexType name="GerichtskommissaerabfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Behördenabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld" minOccurs="0"/>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="GerichtskommissaerabfrageUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ <xsd:element ref="PersonUeberblick" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="GerichtskommissaerabfrageDetail">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Personendaten" minOccurs="0"/>
+ <xsd:element ref="Meldedaten" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GleichsetzungstabelleWarten.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GleichsetzungstabelleWarten.xsd
new file mode 100644
index 00000000..f5cd55cd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/GleichsetzungstabelleWarten.xsd
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: GleichsetzungstabelleWarten.xsd
+Zweck: Definiert Datentypen für die Wartung der Gleichstzungstabelle im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-01-14 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="GleichsetzungAbfragenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchedaten fuer die Suche nach Einträgen in der Gleichsetzungstabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GleichsetzungAbfragenInfo"/>
+ <xsd:choice>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="base:SVNummer"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAbfragenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten, sowie Suchergebnis oder Text-Meldung (falls nichts gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GleichsetzungAbfragenAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Gleichsetzungabfrageergebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAnlegenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchedaten fuer die Suche nach Einträgen in der Gleichsetzungstabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GleichsetzungAnlegenInfo"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="base:SVNummer"/>
+ <xsd:element ref="Zuordnungsqualitaet" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAnlegenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Daten der angelegeten Gleichsetzung, sowie Erfolgsmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="GleichsetzungErgebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungLoeschenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchedaten fuer die Suche nach Einträgen in der Gleichsetzungstabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GleichsetzungLoeschenInfo"/>
+ <xsd:element ref="base:EntityReferenz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungLoeschenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Daten der angelegeten Gleichsetzung, sowie Erfolgsmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="GleichsetzungErgebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAbfragenAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="GleichsetzungAbfragenInfo"/>
+ <xsd:choice>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="base:SVNummer"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAbfragenInfo" type="GleichsetzungAbfragenInfoType"/>
+ <xsd:complexType name="GleichsetzungAbfragenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Gleichsetzungstabelle - Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:InclusivHistorie"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Gleichsetzungabfrageergebnis" type="GleichsetzungabfrageergebnisType"/>
+ <xsd:complexType name="GleichsetzungabfrageergebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Gleichsetzungstabelle - Suchereggebnis</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Einträge</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="GleichsetzungErgebnis" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="GleichsetzungErgebnis" type="GleichsetzungErgebnisType"/>
+ <xsd:complexType name="GleichsetzungErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Gleichsetzungstabelleneintrag</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="base:SVNummer"/>
+ <xsd:element ref="Zuordnungsqualitaet" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Zuordnungsqualitaet">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="45"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="GleichsetzungAnlegenInfo" type="GleichsetzungAnlegenInfoType"/>
+ <xsd:complexType name="GleichsetzungAnlegenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen einer Anlage in der Gleichsetzungstabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+
+ </xsd:complexType>
+
+ <xsd:element name="GleichsetzungLoeschenInfo" type="GleichsetzungLoeschenInfoType"/>
+ <xsd:complexType name="GleichsetzungLoeschenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen für das Löschen eines Eintrages der Gleichsetzungstabelle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Hauseigentuemerabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Hauseigentuemerabfrage.xsd
new file mode 100644
index 00000000..b72bea37
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Hauseigentuemerabfrage.xsd
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Hauseigentuemerabfrage.xsd
+Zweck: Definiert Datentypen für die Hauseigentuemerabfrage im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-09-27 tsch: AlleDrucken hinzugefügt
+2004-08-18 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="HauseigentuemerAbfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="HauseigentuemerAbfrageInfo"/>
+ <xsd:element ref="cio:PostAdresse"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="HauseigentuemerAbfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="HauseigentuemerAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="HauseigentuemerAbfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="HauseigentuemerAbfrageDruckRequest">
+ <xsd:annotation>
+ <xsd:documentation>Hauseigentuemerabfrage-Druckrequest (muss nach einer Hauseigentuemerabfrage mit derselben ProzessInstanzID aufgerufen werden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>Liste der EntityIDs der zu druckenden Meldungen (aus der vorangegangenen Hauseigentuemerabfrage)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:element name="AlleDrucken" type="xsd:boolean"/>
+ <xsd:element ref="base:EntityID" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="HauseigentuemerAbfrageDruckResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="HauseigentuemerAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="HauseigentuemerAbfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="HauseigentuemerAbfrageInfo"/>
+ <xsd:element ref="cio:PostAdresse"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="HauseigentuemerAbfrageInfo" type="HauseigentuemerAbfrageInfoType"/>
+ <xsd:complexType name="HauseigentuemerAbfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Hauseigentuemerabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld" minOccurs="0"/>
+ <xsd:element name="InclusiveAuskunftsgesperrt" type="xsd:boolean"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="HauseigentuemerAbfrageErgebnis" type="HauseigentuemerAbfrageErgebnisType"/>
+ <xsd:complexType name="HauseigentuemerAbfrageErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'base:Message'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 1</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PAbfrageErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/IAPPersonenabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/IAPPersonenabfrage.xsd
new file mode 100644
index 00000000..26165d66
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/IAPPersonenabfrage.xsd
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: IAPPersonenabfrage.xsd
+Zweck: Erweitert die Datentypen für den Usecase "Personenabfrage" im ZMR
+Author(s): Richard Mayrhofer xmayrh2
+-->
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd" />
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd" />
+
+ <xsd:include schemaLocation="Personenabfrage.xsd" />
+ <xsd:include schemaLocation="Behoerdenabfrage.xsd" />
+
+ <xsd:element name="IAPPersonenUeberblickRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageInfo" />
+ <xsd:element ref="base:ZMRZahl" minOccurs="0" />
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0" />
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" />
+ <xsd:element ref="IAPRequestExtension" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPRequestExtension">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="IAPTyp">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="KURZAUSKUNFT" />
+ <xsd:enumeration value="VOLLAUSKUNFT" />
+ <xsd:enumeration value="NEGATIVAUSKUNFT" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="IAPFormat" minOccurs="0">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="HTML" />
+ <xsd:enumeration value="PDF" />
+ <xsd:enumeration value="XML" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPPersonenUeberblickResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="IAPRequestExtension" />
+ <xsd:element ref="base:Message" />
+ <xsd:element ref="IAPPersonAbfrageUeberblick" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPPersonAbfrageUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:AnzahlSaetze" />
+ <xsd:element ref="IAPPersonUeberblick" minOccurs="1" maxOccurs="1000"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPPersonUeberblick">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonKey" />
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPPersonenDetailRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonKey" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="IAPRequestExtension" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPPersonenDetailResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="IAPRequestExtension" />
+ <xsd:element ref="base:Message" />
+ <xsd:element ref="IAPXmlResponse" minOccurs="0" />
+ <xsd:element ref="IAPHtmlResponse" minOccurs="0" />
+ <xsd:element ref="PDFDaten" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPXmlResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageResponse" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="IAPHtmlResponse" type="xsd:string" />
+ <xsd:element name="PDFDaten" type="xsd:base64Binary" />
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldeauskunft.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldeauskunft.xsd
new file mode 100644
index 00000000..df262baf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldeauskunft.xsd
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Meldeauskunft.xsd
+Zweck: Definiert Datentypen für die Meldeauskunft aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-11-24 mp: ZMR-1513 Aufdruck einer zusätzlichen Zeile auf Meldebestätigung und Meldeauskunft
+2010-04-02 teo: ZMR-1373 CLM-1505 Meldedruck Erweiterungstext
+2004-10-27 tsch: Meldeauskunft aus Mussfeld im Ergebnis, cio:NatuerlichePerson optional
+2004-08-17 tsch: Druckzusatztext aus Base-Namespace referenziert
+2004-05-17 tsch: Organisation entfernt, ZMR-Zahl hinzugefügt
+2004-04-13 tsch: AktHistMeldesatz, GemeldetBis hinzugefügt
+2004-04-01 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+
+ <xsd:element name="MeldeauskunftRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldeauskunftInfo"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldeauskunftResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldeauskunftAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Meldeauskunft"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldeauskunftAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldeauskunftInfo"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="base:Bereichskennung"/>
+ <xsd:element ref="base:BPK"/>
+ </xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldeauskunftInfo" type="MeldeauskunftInfoType"/>
+ <xsd:complexType name="MeldeauskunftInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Meldeauskunft</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element ref="Ergebnisdaten"/>
+ <xsd:element ref="base:DruckZusatztext" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="base:Infotext" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Ergebnisdaten">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="AlleAktuellenWohnsitze" type="xsd:boolean"/>
+ <xsd:element name="OhneGeburtsdatum" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Meldeauskunft">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AktMeldesatz" type="xsd:boolean"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldebestaetigung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldebestaetigung.xsd
new file mode 100644
index 00000000..4f8b6f93
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Meldebestaetigung.xsd
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Meldebestaetigung.xsd
+Zweck: Definiert Datentypen für Meldebestaetigungen aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Achtung: Es sollte bedacht werden, dass diese Datei fast 1:1 nach LMR/MeldebestaetigungFamilie.xsd kopiert wurde
+ und Anpassungen in dieser Datei evtl. dort nachgezogen werden müssen! Dies ist vor allem der Fall, wenn
+ es sich um oberflächenrelevante Änderungen handelt.
+
+Aenderungshistorie:
+2010-11-24 mp: ZMR-1513 Aufdruck einer zusätzlichen Zeile auf Meldebestätigung und Meldeauskunft
+2010-04-20 teo: ZMR-1374 CLM-1900 Meldebestätigung für Rechtsanwälte
+2010-04-02 teo: ZMR-1373 CLM-1505 Meldedruck Erweiterungstext
+2009-04-28 teo: +MeldebestaetigungUmmeldeservice
+2008-03-19 teo: CQ#3013: +Druckoption für Ortanzeige
+2004-11-02 tsch: GemeindeNr entfernt
+2004-08-17 tsch: Druckzusatztext aus Base-Namespace referenziert
+2004-05-17 tsch: Organisation entfernt
+2004-04-15 tsch: Erstellung
+-->
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:element name="MeldebestaetigungRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldebestaetigungInfo"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MeldebestaetigungResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldebestaetigungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Meldebestaetigung" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MeldebestaetigungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldebestaetigungInfo"/>
+ <xsd:element ref="base:ZMRZahl"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MeldebestaetigungInfo" type="MeldebestaetigungInfoType"/>
+ <xsd:complexType name="MeldebestaetigungInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Meldebestaetigung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld" minOccurs="0"/>
+ <xsd:element ref="MeldebestaetigungArt"/>
+ <xsd:element ref="base:DruckZusatztext" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="base:Infotext" minOccurs="0"/>
+ <xsd:element ref="MeldebestaetigungDruckoptionOrt" minOccurs="0"/>
+ <xsd:element ref="MeldebestaetigungUmmeldeservice" minOccurs="0"/>
+ <xsd:element name="ZeitraumVon" type="base:TimestampType" minOccurs="0"/>
+ <xsd:element name="ZeitraumBis" type="base:TimestampType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ <xsd:element name="MeldebestaetigungArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="AKTLETZT"/>
+ <xsd:enumeration value="GEM_AKT"/>
+ <xsd:enumeration value="GEM_AKTHIST"/>
+ <xsd:enumeration value="GEM_ZEITRAUM"/>
+ <xsd:enumeration value="GES_AKT"/>
+ <xsd:enumeration value="GES_BETR"/>
+ <xsd:enumeration value="GES_AKTHIST"/>
+ <xsd:enumeration value="GES_AKTHIST_Z"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="MeldebestaetigungUmmeldeservice">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Meldebestaetigung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="ServiceCode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="20"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element ref="base:ServerTransaktionNr"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="MeldebestaetigungDruckoptionOrt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ORTSNAME"/>
+ <xsd:enumeration value="POSTORT"/>
+ <xsd:enumeration value="ALLE"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="Meldebestaetigung">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element name="Meldung" type="MeldungMeldebestaetigungType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AktMeldesatz" type="xsd:boolean"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:complexType name="MeldungMeldebestaetigungType">
+ <xsd:sequence>
+ <xsd:element ref="cio:PostAdresse"/>
+ <xsd:element ref="base:GemeldetVon"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldebestaetigungenAnfordern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldebestaetigungenAnfordern.xsd
new file mode 100644
index 00000000..0e08efd2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldebestaetigungenAnfordern.xsd
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: MeldebestaetigungenAnfordern.xsd
+Zweck: Definiert Datentypen für das Anfordern von Massen-Meldebestätigungen innerhalb einer Gemeinde
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2010-02-01 Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="MeldebestaetigungenAnfordernRequest">
+ <xsd:annotation>
+ <xsd:documentation>Meldebestätigungen für alle Personen in der angegebenen Gemeinde.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element name="StichtagVon" type="base:TimestampType" minOccurs="0"/>
+ <xsd:element name="StichtagBis" type="base:TimestampType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldebestaetigungenAnfordernAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element name="StichtagVon" type="base:TimestampType" minOccurs="0"/>
+ <xsd:element name="StichtagBis" type="base:TimestampType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldebestaetigungenAnfordernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Anforderung von Massen-Meldebestätigungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldebestaetigungenAnfordernAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldungHistKorrigieren.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldungHistKorrigieren.xsd
new file mode 100644
index 00000000..b322b1b0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/MeldungHistKorrigieren.xsd
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: MeldungHistKorrigieren.xsd.xsd
+Zweck: Definiert Datentypen für den Usecase "Historische Meldung korrigieren" im ZMR
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2011-03-23 mp: ZMR-1568: Zuzugs-/Verzugsstaat vorerst auskommentiert
+2011-01-24 mp: Meldungreferenz optional (für hist. Wohnsitzanmeldung)
+2011-01-17 mp: Angepasst für hist. Wohnsitzanlage
+2010-03-10 mp: Meldung im Response nun optional (notw. für Strang löschen)
+2010-03-09 mp: Personreferenz im Response auf Personergebnis geändert
+2010-03-09 mp: Umbenannt auf MeldungHistKorrigieren, um Verwechslungen zu vermeiden
+2010-03-08 teo: erstellt
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Behoerdenattribute.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Auskunftssperre.xsd"/>
+
+ <xsd:element name="MeldungHistKorrigierenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldungHistKorrigierenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz" minOccurs="0"/>
+ <xsd:element name="Wohnsitz" type="WohnsitzAnlageType" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetVon" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldungHistKorrigierenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Meldungkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="MeldungHistKorrigierenAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonErgebnis"/>
+ <xsd:element ref="MeldungErgebnis" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der korrigierten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldungHistKorrigierenAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldungHistKorrigierenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz" minOccurs="0"/>
+ <xsd:element name="Wohnsitz" type="WohnsitzAnlageType" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetVon" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldungHistKorrigierenInfo" type="MeldungHistKorrigierenInfoType"/>
+ <xsd:complexType name="MeldungHistKorrigierenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Meta-Informationen zur Meldungkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+ <xsd:sequence>
+ <xsd:element name="MeldungHistKorrigierenBezug" type="MeldungHistKorrigierenBezugType"/>
+ <!-- ZMR-1568
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ -->
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:simpleType name="MeldungHistKorrigierenBezugType">
+ <xsd:annotation>
+ <xsd:documentation>mögliche Korrekturen für eine historische Meldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="GemeldetPeriode"/>
+ <xsd:enumeration value="Unterkunftgeber"/>
+ <xsd:enumeration value="Adressaenderung"/>
+ <xsd:enumeration value="StrangLoeschen"/>
+ <xsd:enumeration value="SatzLoeschen"/>
+ <xsd:enumeration value="HistWohnsitzanlage"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ORFGISAnforderung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ORFGISAnforderung.xsd
new file mode 100644
index 00000000..90e6d34a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ORFGISAnforderung.xsd
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ORFGISAnforderung.xsd
+Zweck: Definiert Datentypen für den ZMR-ORFGISAnforderung
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-11-06 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="ORFGISAnforderungRequest">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten der ORFGISAnforderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ORFGISAnforderungInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ORFGISAnforderungResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request und die Meldung geliefert, dass die Daten bereit gestellt werden.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ORFGISAnforderungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ORFGISAnforderungInfo" type="ORFGISAnforderungInfoType"/>
+
+ <xsd:complexType name="ORFGISAnforderungInfoType">
+ <xsd:sequence>
+ <xsd:element name="Gemeindenummern" type="xsd:string" />
+ <xsd:element name="DurchfuehrungsZeitpunkt"
+ type="base:TimestampType" minOccurs="0" />
+ <xsd:element name="AnmeldungenAb" type="base:TimestampType"
+ minOccurs="0" />
+ <xsd:element name="Ortskennzeichen" type="xsd:boolean"></xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ORFGISAnforderungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ORFGISAnforderungInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheMindestsicherung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheMindestsicherung.xsd
new file mode 100644
index 00000000..2e91cacf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheMindestsicherung.xsd
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ObjektsucheMindestsicherung.xsd
+Zweck: Definiert Datentypen für die Mindestsicherung - Objektsuche im ZMR
+Author(s): Polster Martin, ZMR-SU
+
+Aenderungshistorie:
+2011-02-09 mp: ObjektsucheMindestsicherungInfo optional
+2010-07-29 mp: Erweitert um Adressstatus
+2010-07-27 mp: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+
+ <xsd:element name="ObjektsucheMindestsicherungRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheMindestsicherungInfo" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse"/>
+ <xsd:element ref="base:Adressstatus"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheMindestsicherungResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheMindestsicherungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="ObjektsucheMindestsicherungErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheMindestsicherungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheMindestsicherungInfo" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse"/>
+ <xsd:element ref="base:Adressstatus"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheMindestsicherungInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Stichtag" minOccurs="0"/>
+ <xsd:element ref="base:AnzahlSaetze" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheMindestsicherungErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 0</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PersonErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheSteuerfahndung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheSteuerfahndung.xsd
new file mode 100644
index 00000000..0e0e5355
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ObjektsucheSteuerfahndung.xsd
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ObjektsucheSteuerfahndung.xsd
+Zweck: Definiert Datentypen für die Steuerfahndungs - Objektsuche im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-11-25 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="ObjektsucheSteuerfahndungRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheSteuerfahndungInfo"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheSteuerfahndungResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Es wir entweder das Feld PDFDaten (Anforderung als Druck) mit allen gefundenen Datensätzen,
+ oder ObjektsucheSteuerfahndungErgebnis mit der aktuell geblätterten Seite geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheSteuerfahndungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="ObjektsucheSteuerfahndungErgebnis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheSteuerfahndungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ObjektsucheSteuerfahndungInfo"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheSteuerfahndungInfo">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element name="AlsDruck" type="xsd:boolean"/>
+ <xsd:element ref="base:AnzahlSaetze" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ObjektsucheSteuerfahndungErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 0</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="cio:PersonenDaten" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAendern.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAendern.xsd
new file mode 100644
index 00000000..c29e8e06
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAendern.xsd
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonAendern.xsd
+Zweck: Definiert Datentypen für Personendaten-Änderungen im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-29 tsch: Standarddokumente hinzugefügt
+2004-06-24 tsch: akademische Grade hinzugefügt, PersonAendernMsg entfernt
+2004-06-14 tsch: Behördenattribute hinzugefügt
+2004-01-28 tsch: Gesamtdatensatz der geaenderten Person in der Response-Message
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+
+ <xsd:element name="PersonAendernRequest">
+ <xsd:annotation>
+ <xsd:documentation>Es können die Person und deren abhängige Entities (z.B. Staatsangehoerigkeit) unabhängig geändert werden. Felder, die nicht geschickt werden, bleiben unverändert, leer geschickte Felder werden gelöscht.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonAendernInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="PersonAenderung" minOccurs="0"/>
+ <xsd:element ref="StaatsangehoerigkeitAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StaatsangehoerigkeitAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="ReisedokumentAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="ReisedokumentAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AkademischerGradAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AkademischerGradAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StandarddokumentAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StandarddokumentAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="EidasIdentitaetAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="EidasIdentitaetAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonAendernResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Personenänderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der geänderten Person (mit EntityIDs der Person und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonAendernInfo" type="PersonAendernInfoType"/>
+ <xsd:complexType name="PersonAendernInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Personenänderung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAnlegen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAnlegen.xsd
new file mode 100644
index 00000000..e3131165
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonAnlegen.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonAnlegen.xsd
+Zweck: Definiert Datentypen für den Usecase "Person anlegen" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-06-24 tsch: PersonAnlegenMsg entfernt
+2004-01-28 tsch: Gesamtdatensatz der neuen Person in der Response-Message
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="WohnsitzAnmelden.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="PersonAnlegenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonAnlegenInfo"/>
+ <xsd:element ref="PersonAnlage"/>
+ <xsd:element ref="MeldungAnlage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonAnlegenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Personenanlage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der im ZMR angelegten Person (mit EntityIDs der Person und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der angelegten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonAnlegenInfo" type="PersonAnlegenInfoType"/>
+ <xsd:complexType name="PersonAnlegenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Personenanlage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonExport.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonExport.xsd
new file mode 100644
index 00000000..a91e9f5a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonExport.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonExport.xsd
+Zweck: Definiert Datentypen für den Usecase "Person export" im LMR
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:element name="PersonExportRequest">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Request für PersonExport</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityID"/>
+ <xsd:element ref="ExportOption"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonExportResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Response für PersonExport</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="ExportOption"/>
+ <xsd:element ref="base:PersonExport"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ExportOption">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ExportErgebnisOption"/>
+ <xsd:element ref="ExportMeldungOption"/>
+ <xsd:element ref="base:LetzteAenderung" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ExportMeldungOption">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ALLE" />
+ <xsd:enumeration value="GEMEINDE" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="ExportErgebnisOption">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="ALLE" />
+ <xsd:enumeration value="AKTUELL" />
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonKorrigieren.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonKorrigieren.xsd
new file mode 100644
index 00000000..3f163231
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonKorrigieren.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonKorrigieren.xsd
+Zweck: Definiert Datentypen für Korrekturen von Personendaten im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-29 tsch: Standarddokumente hinzugefügt
+2004-09-27 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+
+ <xsd:element name="PersonKorrigierenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Es können die Person und deren abhängige Entities (z.B. Staatsangehoerigkeit) unabhängig geändert werden. Felder, die nicht geschickt werden, bleiben unverändert, leer geschickte Felder werden gelöscht.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonKorrigierenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="PersonAenderung" minOccurs="0"/>
+ <xsd:element ref="StaatsangehoerigkeitAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StaatsangehoerigkeitAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="ReisedokumentAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="ReisedokumentAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AkademischerGradAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AkademischerGradAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StandarddokumentAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="StandarddokumentAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonKorrigierenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Personenkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der korrigierten Person (mit EntityIDs der Person und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonKorrigierenInfo" type="PersonKorrigierenInfoType"/>
+ <xsd:complexType name="PersonKorrigierenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Personenkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonTrennen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonTrennen.xsd
new file mode 100644
index 00000000..ceba2041
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonTrennen.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonTrennen.xsd
+Zweck: Definiert Datentypen für den Usecase "Person_Trennen (SPLIT)" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-09 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="PersonTrennenSucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>ZMR-Zahl der Person, die gesplittet werden soll</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonTrennenSucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Medledaten des SPLIT-Kandidaten (es werden nur die zuletzt fachlich gültigen Sätze - sowohl der Person, als auch der Meldungen geliefert)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PersonTrennenSuchergebnis" type="PAbfrageErgebnisSatzType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="PersonTrennenRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Zweiter Schritt der Personentrennung nach der Suche/Anzeige der zu trennenden Person (Trennung durchführen)
+ Enthält die Person-Referenz und die Liste der auf die neue Person zu übertragenden Meldungen
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonTrennenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten der getrennten Personen, es wird die gesamte fachl. Historie geliefert</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PersonTrennenErgebnis" type="PAbfrageErgebnisSatzType" minOccurs="2" maxOccurs="2"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonZusammenfuehren.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonZusammenfuehren.xsd
new file mode 100644
index 00000000..b44943d7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonZusammenfuehren.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonZusammenfuehren.xsd
+Zweck: Definiert Datentypen für den Usecase "Person_Zusammenfuehren (KIT)" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-09 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="PersonZusammenfuehrenSucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>ZMR-Zahl der Person, die gesplittet werden soll</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="QuellpersonZMRZahl" type="base:ZMRZahlType"/>
+ <xsd:element name="ZielpersonZMRZahl" type="base:ZMRZahlType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonZusammenfuehrenSucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Medledaten der KIT-Kandidaten (es werden nur die zuletzt fachlich gültigen Sätze - sowohl der Person, als auch der Meldungen geliefert)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="PersonZusammenfuehrenSuchergebnis" type="PAbfrageErgebnisSatzType" minOccurs="2" maxOccurs="2"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="PersonZusammenfuehrenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Zweiter Schritt der Personenzusammenführung nach der Suche/Anzeige der zusammenzuführenden Personen (Zusammenführung durchführen)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="QuellpersonReferenz" type="PersonReferenzType"/>
+ <xsd:element name="ZielpersonReferenz" type="PersonReferenzType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonZusammenfuehrenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten zusammengeführten Person, es wird die gesamte fachl. Historie geliefert</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PersonZusammenfuehrenErgebnis" type="PAbfrageErgebnisSatzType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonenIndex.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonenIndex.xsd
new file mode 100644
index 00000000..72b3d3f2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/PersonenIndex.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: PersonenIndex.xsd
+Zweck: Definiert Datentypen für den Personenindex mit verschl. bPKs
+Author(s): Oliver Ehrenmüller, ZMR-SU
+
+Aenderungshistorie:
+2011-09-05 teo Änderungsdienst ZWR (PN126)
+2011-08-05 teo Request/Response vertauscht, +Register-Info
+2011-08-02 teo erstellt.
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="PersonenIndexRequest">
+ <xsd:annotation>
+ <xsd:documentation>
+ Im Request werden Meta-Informationen zum Batch und die verschlüsselten BPKs geliefert
+ ECDID steht für "encrypted context dependend id" aus.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonenIndexInfo"/>
+ <xsd:element name="ECDID" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenIndexResponse">
+ <xsd:annotation>
+ <xsd:documentation>Es werden keine Responsedaten erwartet.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenIndexInfo" type="PersonenIndexInfoType"/>
+
+ <xsd:complexType name="PersonenIndexInfoType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Meta-Informationen zum ausgelieferten Index:
+ BatchCode/Name, Organisation, Bereich, Zeitraum, etc...
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="BatchCode" type="xsd:string"/>
+ <xsd:element name="BatchName" type="xsd:string"/>
+ <xsd:element ref="base:Organisation"/>
+ <xsd:element name="Register" type="xsd:string"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element name="AbgleichVon" type="base:TimestampType"/>
+ <xsd:element name="AbgleichBis" type="base:TimestampType"/>
+ </xsd:sequence>
+ <xsd:element name="Bereich" type="xsd:string"/>
+ <xsd:element name="PackageID" type="base:ENTITYIDType"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenabfrage.xsd
new file mode 100644
index 00000000..c1b579ce
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenabfrage.xsd
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Personenabfrage.xsd
+Zweck: Definiert Datentypen für den Usecase "Personenabfrage" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-12-09 tsch: Liste der EntityIDs bei Druck optional (für Negativauskunft)
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+
+ <xsd:element name="PersonenAbfrageRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Personensuche im ZMR(Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenAbfrageResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonenAbfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenAbfrageDruckRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Personensuche im ZMR (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:annotation>
+ <xsd:documentation>Liste der EntityIDs der zu druckenden Personen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="base:EntityID" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenAbfrageDruckResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenAbfrageInfo" type="PersonenAbfrageInfoType"/>
+ <xsd:element name="PersonenAbfrageErgebnis" type="PersonenAbfrageErgebnisType"/>
+
+ <xsd:element name="PersonenAbfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenAbfrageInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:complexType name="PersonenAbfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Personensuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="Suchkriterien" type="SuchkriterienType"/>
+ <xsd:element name="Ergebniskriterien" type="ErgebniskriterienType"/>
+ <xsd:element name="berechneBpk" type="xsd:boolean" default="false" minOccurs="0"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonenAbfrageErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'PersonensucheMsg'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 1</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PAbfrageErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PAbfrageErgebnisSatzType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält die Ergebnisdaten zu einer gefundenen Person.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Personendaten"/>
+ <xsd:element ref="Meldedaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenlisten.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenlisten.xsd
new file mode 100644
index 00000000..e7f18752
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personenlisten.xsd
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Personenlisten.xsd
+Zweck: Definiert Datentypen für den Usecase "Personenlisten" im ZMR. Soll ein generischer Ansatz für
+Suche nach aktuellen Personendaten mit v-bPKs sein. Erstnutzer der Schnittstelle ist der VVO (mit VVOAbfrage)
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2009-11-16 teo: +Flag für Suchwizard
+2008-02-26 teo: erstellt.
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Personensuche.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="PersonenListenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für den PersonenListen-Request im ZMR (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenListenInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenListenResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das
+ Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenListenAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonenListenErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonenListenInfo" type="PersonenListenInfoType"/>
+ <xsd:element name="PersonenListenErgebnis" type="PersonenListenErgebnisType"/>
+
+ <xsd:element name="PersonenListenAnfrage">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten, entsprechen den Suchdaten des Requests</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonenListenInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="PersonenListenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur PersonenListen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="Suchkriterien" type="PersonenListenSuchkriterienType"/>
+ <xsd:element name="Ergebniskriterien" type="PersonenListenErgebniskriterienType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonenListenSuchkriterienType">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element name="Suchwizard" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonenListenErgebniskriterienType">
+ <xsd:annotation>
+ <xsd:documentation>Ergebniskriterien</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="vbPKAnfrage" minOccurs="0" maxOccurs="10">
+ <xsd:annotation>
+ <xsd:documentation>v-bPKs die miterzeugt werden sollen. (zb. urn:publicid:gv.at:ecdid+BMI+ZP)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="28"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonenListenErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>PersonenListenErgebnisType beinhaltet die Liste der gefundenen Personen.
+ Derzeit wird die Liste auf 50 Sätze begrenzt.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="PersonenListenSatz" type="PersonenListenSatzType" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonenListenSatzType">
+ <xsd:annotation>
+ <xsd:documentation>Beinhaltet als einen Ergebnissatz eine Personen und ihre aktuellen Meldungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:group ref="ZMRPersonErgebnissatzGroup"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personensuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personensuche.xsd
new file mode 100644
index 00000000..a501ba1f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Personensuche.xsd
@@ -0,0 +1,255 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Personensuche.xsd
+Zweck: Definiert Datentypen für den Usecase "Person suchen Meldevorgang" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-10-15 mp: ZMR-1473: Personensuche erweitert um Dokumentsuche
+2010-04-02 teo: ZMR-1356: ZMR-Suchergebnis: die Aufteilung in ZMR- und ERnP-Treffer fehlt
+2010-01-26 teo: ZMR-1334: Umbau der Suche mit Namensteilen auf eigene Suchoption
+2009-12-15 teo: LMR-712 Übernahme LMR Auslandsösterreicher ins ERnP
+2009-07-02 rp: LMR-660: +Sortierung
+2008-03-20 teo: CQ#2960 rückgängig gemacht.
+2008-02-25 teo: CQ#2960: +Dummy-Attribut für .Net-Umgebungen
+2006-08-08 tsch: Feld EingeschraenkteHistorie hinzugefügt
+2005-10-06 tsch: Suchkriterium InclusivERnP hinzugefügt, Umbenennung EGR->ERnP
+2004-06-22 tsch: Akademische Grade hinzugefügt; SaetzeVon und SaetzeBis im Ergebnis
+2004-06-18 tsch: Stichtag hinzugefügt
+2004-06-08 tsch: Message immer im Ergebnis
+2004-05-17 tsch: Organisation entfernt
+2004-05-04 tsch: InclusivAusgeblendeteSaetze entfernt
+2004-04-15 tsch: ZMR-Zahl bei Suchanfrage dazu (ZMR-Zahl-Suche nicht über NatuerlichePerson.Identification)
+2004-01-27 tsch: Personen- und Kontaktadressdaten aus dem Ergänzungsregister im Suchergebnis definiert
+2004-01-26 tsch: Integration der CIO-Personendaten Struktur (http://reference.e-government.gv.at/namespace/persondata/de/20040201#)
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/ERnPPerson.xsd"/>
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="PersonSuchenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Personensuche im ZMR/ERnP (Personendaten + Adressdaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonensucheInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ <xsd:element ref="EidasSuchdaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonSuchenResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request, und das Suchergebnis bzw. eine Text-Meldung geliefert (Falls keine Person gefunden)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonensucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Personensuchergebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonensucheInfo" type="PersonensucheInfoType"/>
+ <xsd:element name="Personensuchergebnis" type="PersonensuchergebnisType"/>
+
+ <xsd:element name="PersonensucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonensucheInfo"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:complexType name="PersonensucheInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Personensuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element name="Suchkriterien" type="SuchkriterienType"/>
+ <xsd:element name="Ergebniskriterien" type="ErgebniskriterienType"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="SuchkriterienType">
+ <xsd:annotation>
+ <xsd:documentation>Datenbank-Suchkriterien für Personen- und Meldedaten der Personensuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Stichtag" minOccurs="0"/>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element name="ErweitereSuchoptionen" minOccurs="0">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Teilnamen"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="InclusivERnP" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ErgebniskriterienType">
+ <xsd:annotation>
+ <xsd:documentation>Anzeigekriterien für Personen- und Meldedaten im Personensuchergebnis</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element ref="base:InclusivHistorie"/>
+ <xsd:element ref="base:EingeschraenkteHistorie"/>
+ </xsd:choice>
+ <xsd:element ref="Sortierung" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Sortierung">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="Person">
+ <xsd:annotation>
+ <xsd:documentation>Sortierung nach Familienname, Vorname, Geburtsdatum (Default)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:enumeration>
+ <xsd:enumeration value="Adresse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Sortierung nach PLZ, Straße, Hausnummer, Stiege, Tür, Familienname, Vorname,
+ Geburtsdatum.
+ Die Sortierung wirkt auf die Adresse, nach der gesucht wurde, d.h. es sollte
+ auf eine eingeschränkt werden (z.B. Suche in Objekt).
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:enumeration>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:complexType name="PersonensuchergebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'PersonensucheMsg'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="GefundeneSaetzeERnP" type="base:IntegerType" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der ERnP-Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 1</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PersonErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PersonErgebnisSatzType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält die Ergebnisdaten zu einer gefundenen Person.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:choice>
+ <xsd:group ref="ZMRPersonErgebnissatzGroup"/>
+ <xsd:group ref="ERnPPersonErgebnissatzGroup"/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:group name="ZMRPersonErgebnissatzGroup">
+ <xsd:annotation>
+ <xsd:documentation>Fasst die gefundenen Daten einer Person aus dem Melderegister (aktuelle und historische Personendaten, sowie aktuelle und historische Meldedaten)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Personendaten"/>
+ <xsd:element ref="Meldedaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:group>
+
+ <xsd:element name="Personendaten">
+ <xsd:annotation>
+ <xsd:documentation>Historienliste der Personendaten (Erklärung Historienliste siehe Dokument ZMR2Schnittstellen-Richtlinien.doc</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonErgebnis" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Meldedaten" type="MeldedatenType">
+ <xsd:annotation>
+ <xsd:documentation>gelieferte Meldungen der Person (ein Strang = ein Element 'Meldedaten')</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:complexType name="MeldedatenType">
+ <xsd:annotation>
+ <xsd:documentation>Historienliste der Meldedaten einer Meldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="MeldungErgebnis" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:group name="ERnPPersonErgebnissatzGroup">
+ <xsd:annotation>
+ <xsd:documentation>Fasst die gefundenen Daten einer Person aus dem Ergänzungsregister (ERnP) (aktuelle und historische Personendaten, sowie aktuelle und historische Kontaktadressen)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="ERnPPersonendaten">
+ <xsd:annotation>
+ <xsd:documentation>Historienliste der Personendaten (Erklärung Historienliste siehe Dokument ZMR2Schnittstellen-Richtlinien.doc</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ERnPPersonErgebnis" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="ERnPHistLMRMeldungen" type="MeldedatenType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ LMR-Histmeldungen für ERnP-Personen werden bei der LMR-Suche benötigt.
+ Sonst nicht verwenden, ausbauen, wenn Schnittstelle an externe Partner
+ geliefert wird!!!
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:group>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZAuswertung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZAuswertung.xsd
new file mode 100644
index 00000000..e6dafecd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZAuswertung.xsd
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: QKZAuswertung.xsd
+Zweck: Definiert Datentypen für das Anfordern einer QKZ-Auswertung innerhalb einer Gemeinde (Die Auswertung steht in PDF-Form in den Auswertungen bereit)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-06-15 ZMR-171 XML-Schnittstelle für Qualifikationskennzeichenliste
+2005-02-02 Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Qualifikationskennzeichen.xsd"/>
+
+ <xsd:element name="QKZAuswertungRequest">
+ <xsd:annotation>
+ <xsd:documentation>Die Auswertung läuft über alle Personen mit den angegebene QKZ in der angegebenen Gemeinde.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element ref="QualifikationskennzeichenCode" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZAuswertungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element ref="QualifikationskennzeichenCode" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZAuswertungResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Anforderung einer QKZ-Auswertung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="QKZAuswertungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZAuswertung">
+ <xsd:annotation>
+ <xsd:documentation>Auswertungs-XML für QKZs laut ZMR-171</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="QKZZuordnung" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZZuordnung">
+ <xsd:annotation>
+ <xsd:documentation>Definiert eine Zuordnung zwischen einer Person und einem QKZ für die XML-Auswertung laut ZMR-171</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="QualifikationskennzeichenCode"/>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZBearbeiten.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZBearbeiten.xsd
new file mode 100644
index 00000000..2f97c8b8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/QKZBearbeiten.xsd
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: QKZWarten.xsd
+Zweck: Definiert Datentypen für Wartung von Qualifikationskennzeichen im ZMR/ZPR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-05-10 Löschen und Anlegen von mehreren QKZ in einem Request
+2005-02-02 Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Qualifikationskennzeichen.xsd"/>
+
+ <xsd:element name="QKZBearbeitenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Mit einem Request können Qualifikationskennzeichen angelegt oder gelöscht werden.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="QKZBearbeitenInfo"/>
+ <xsd:choice>
+ <xsd:annotation>
+ <xsd:documentation>Referenz auf das Objekt, für das die QKZ-Wartung durchgeführt wird (Person oder Meldung)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz"/>
+ </xsd:choice>
+ <xsd:element ref="QualifikationskennzeichenAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="QualifikationskennzeichenLoeschen" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZBearbeitenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur QKZ-Wartung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenErgebnisType" minOccurs="1" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>Datensatz der angelegten/gelöschten Qualifikationskennzeichen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="QKZBearbeitenInfo" type="QKZBearbeitenInfoType"/>
+ <xsd:complexType name="QKZBearbeitenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur QKZ-Wartung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZREinzelabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZREinzelabfrage.xsd
new file mode 100644
index 00000000..f0cc9d26
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZREinzelabfrage.xsd
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SZREinzelabfrage.xsd
+Zweck: Definiert Datentypen für die Einzalabfrage des Stammzahlenregisters im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-10-27 teo: SZR-Verordnung 2009
+2006-03-21 tsch: Ordnungszahl hinzugefügt
+2004-09-09 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="SZRPersonenbindung.xsd"/>
+
+ <xsd:element name="SZREinzelabfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZREinzelabfrageInfo"/>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZREinzelabfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZREinzelabfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="SZREinzelabfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZREinzelabfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZREinzelabfrageInfo"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZREinzelabfrageInfo" type="SZREinzelabfrageInfoType"/>
+ <xsd:complexType name="SZREinzelabfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die SZR - Einzelabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element ref="base:Behoerdenschluessel" minOccurs="0"/>
+ <xsd:element name="ListePersonenWennNichtEindeutig" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="SZREinzelabfrageErgebnis">
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:sequence>
+ <xsd:element ref="base:OrdnungsZahl"/>
+ <xsd:element ref="base:Register"/>
+ <xsd:element name="PersonHistorisch" type="xsd:boolean"/>
+ </xsd:sequence>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonenbindungErgebnis" maxOccurs="10"/>
+ </xsd:sequence>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonenbindung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonenbindung.xsd
new file mode 100644
index 00000000..81a836d6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonenbindung.xsd
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SZRPersonenbindung.xsd
+Zweck: Definiert Datentypen für die Personenbindungs-Suche Anfrage des Stammzahlenregisters ins ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-10-27 teo: SZR-Verordnung 2009
+2008-11-12 teo: +ERnPEintragWennNotwendig, SZRPersonenbindungErgebnis als Array für Ergebnisliste
+2006-03-21 tsch: Ordnungszahl hinzugefügt
+2004-09-09 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Reisedokument.xsd"/>
+
+ <xsd:element name="SZRPersonenbindungRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonenbindungInfo"/>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonenbindungResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonenbindungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="SZRPersonenbindungErgebnis" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonenbindungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonenbindungInfo"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonenbindungInfo" type="SZRPersonenbindungInfoType"/>
+ <xsd:complexType name="SZRPersonenbindungInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Personenbindungsanfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ <xsd:element ref="base:Behoerdenschluessel" minOccurs="0"/>
+ <xsd:element name="ERnPEintragBeiBedarf" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="SZRPersonenbindungErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PersonenDaten"/>
+ <xsd:element ref="base:Register"/>
+ <xsd:element ref="base:Adressschluessel" minOccurs="0"/>
+ <xsd:element name="WohnsitzHistorisch" type="xsd:boolean"/>
+ <xsd:element name="AuskunftssperreGesetzt" type="xsd:boolean"/>
+ <xsd:element name="ERnPEintragAngelegt" type="xsd:boolean" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonensuche.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonensuche.xsd
new file mode 100644
index 00000000..7e1050e5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRPersonensuche.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SZRPersonensuche.xsd
+Zweck: Definiert Datentypen für die Personensuche - Abfrage des Stammzahlenregisters ins ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-03-21 tsch: Ordnungszahl hinzugefügt
+2004-09-09 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="SZRPersonenbindung.xsd"/>
+
+ <xsd:element name="SZRPersonensucheRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonensucheInfo"/>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonensucheResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonensucheAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="SZRPersonensucheErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonensucheAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="SZRPersonensucheInfo"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRPersonensucheInfo" type="SZRPersonensucheInfoType"/>
+ <xsd:complexType name="SZRPersonensucheInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die SZR - Personensuche</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Bezugsfeld"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="SZRPersonensucheErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze"/>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRSammelabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRSammelabfrage.xsd
new file mode 100644
index 00000000..0608fa38
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SZRSammelabfrage.xsd
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: SZRSammelabfrage.xsd
+Zweck: Definiert Datentypen für Sammelrequests des Stammzahlenregisters ins ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-03-21 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/SZRPersonenbindung.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZREinzelabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZRPersonensuche.xsd"/>
+
+ <xsd:element name="SZRSammelRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:element ref="SZRPersonenbindungRequest"/>
+ <xsd:element ref="SZREinzelabfrageRequest"/>
+ <xsd:element ref="SZRPersonensucheRequest"/>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SZRSammelResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Item" minOccurs="0" maxOccurs="unbounded">
+ <xsd:complexType>
+ <xsd:choice>
+ <xsd:element ref="SZRPersonenbindungResponse"/>
+ <xsd:element ref="SZREinzelabfrageResponse"/>
+ <xsd:element ref="SZRPersonensucheResponse"/>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Sperrliste.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Sperrliste.xsd
new file mode 100644
index 00000000..624919ff
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Sperrliste.xsd
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Adresssperrliste
+Zweck: Definiert Requests/Responses zum Lesen/Erfassen/Löschen von Adressen, an denen eine
+ Wohnsitzanmeldung nicht erlaubt ist.
+Author(s): Richie Mayrhofer, ZMR
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzUmmelden.xsd"/>
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="SperrlisteRequest">
+ <xsd:annotation>
+ <xsd:documentation>Auflisten der gesperrten Adressen für die angegebene Gemeinde</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperrlisteResponse">
+ <xsd:annotation>
+ <xsd:documentation>Response der Personensuche im ZMR. Geliefert werden die ID-Daten sowie alle Staatsangehoerigkeiten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="SperradresseErgebnis" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperrlisteAnlegenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Anlegen einer neuen Adressen für die angegebene Gemeinde</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Sperradresse" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperrlisteUpdateResponse">
+ <xsd:annotation>
+ <xsd:documentation>Message fuer das Update einer Sperradresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperrlisteLoeschenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Loeschen von Sperradressen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence minOccurs="1" maxOccurs="unbounded">
+ <xsd:element ref="SperradresseId"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperradresseId">
+ <xsd:annotation>
+ <xsd:documentation>Id der Sperradresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="EntityId" type="xsd:long"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SperradresseErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>gespeicherte Sperradresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="EntityId" type="xsd:long"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ <xsd:element ref="Sperradresse"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Sperradresse">
+ <xsd:annotation>
+ <xsd:documentation>Adresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Postleitzahl"/>
+ <xsd:element ref="cio:Gemeinde"/>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ <xsd:element ref="cio:Ortschaft" minOccurs="0"/>
+ <xsd:element ref="cio:Strassenname"/>
+ <xsd:element name="Hausnummer" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Stiege" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Tuer" type="xsd:string" minOccurs="0"/>
+ <xsd:element ref="AdressRegisterEintrag" minOccurs="1"/>
+ <xsd:element ref="cio:Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element ref="base:OKZ" minOccurs="0"/>
+ <xsd:element ref="base:SKZ" minOccurs="0"/>
+ <xsd:element ref="base:Gebaeudeunterscheidung" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Storno.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Storno.xsd
new file mode 100644
index 00000000..50b6f1f4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Storno.xsd
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Storno.xsd
+Zweck: Definiert Datentypen für den Usecase "Person und/oder Wohnsitz Stornieren" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-04-16 teo: ZMR-1397: Anzeige von Details in der Storno Voransicht (Personenstorno)
+2009-07-23 teo: Mehrfachstorno / Undo
+2004-09-27 tsch: Erstellt
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="Personensuche.xsd"/>
+
+ <xsd:element name="StornoDarstellenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="StornoModus" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Über den Storno-Modus kann gesteuert werden, ob
+ der Storno normal durchgeführt werden soll, oder
+ zb. ob der letzte Storno rückgängig gemacht werden soll.
+ Fehlt der Storno-Modus wird das Storno normal
+ durchgeführt.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Falls eine bestimmte Meldung storniert werden soll,
+ müssen hier ihre Referenzdaten geschickt werden.
+ Wird nur die Personreferenz geschickt, wird die Person storniert
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="StornoDarstellenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Stellt den Stornovorgang für den User dar</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Für jede in den Storno involvierte Person wird ein Element StornoVergleich geliefert.
+ Hier wird der Person-Gesamtdatensatz vor und nach dem Storno dargestellt.
+ Auch wenn aussschließlich Meldedaten vom Storno betroffen sind, wird die gesamte Person geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element name="StornoVergleich" type="StornoVergleichType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:complexType name="StornoVergleichType">
+ <xsd:sequence>
+ <xsd:element name="PersonSatzVorStorno" type="PersonErgebnisSatzType"/>
+ <xsd:element name="PersonSatzNachStorno" type="PersonErgebnisSatzType" minOccurs="0"/>
+ <xsd:element name="WeitereBetroffenePerson" type="base:ZMRZahlType" minOccurs="0" maxOccurs="unbounded">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bei einem Storno kann vorkommen, dass mehrere Personen involviert sind.
+ Zum Beispiel bei einem Kit-Fall. Um davor zu warnen, wird hier explizit
+ eine Liste von ZMR-Zahlen geliefert, die Personen anzeigen, bei denen das
+ Storno ebenfalls eine Änderung bewirken würde.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="StornoRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="StornoModus" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Über den Storno-Modus kann gesteuert werden, ob
+ der Storno normal durchgeführt werden soll, oder
+ zb. ob der letzte Storno rückgängig gemacht werden soll.
+ Fehlt der Storno-Modus wird das Storno normal
+ durchgeführt.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Falls eine bestimmte Meldung storniert werden soll,
+ müssen hier ihre Referenzdaten geschickt werden.
+ Wird nur die Personreferenz geschickt, wird die Person storniert
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="StornoResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort des Storno-Vorgangs</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element name="PersonSatzNachStorno" type="PersonErgebnisSatzType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="StornoModus">
+ <xsd:annotation>
+ <xsd:documentation>
+ Stellt Steuerungsmöglichkeiten für den Storno zur Verfügung.
+ zb. normales Storno, letztes Storno rückgängig machen (Storno vom Storno)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="NORMAL"/>
+ <xsd:enumeration value="RUECKGAENGIG"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SzrAbfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SzrAbfrage.xsd
new file mode 100644
index 00000000..1e8261ab
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/SzrAbfrage.xsd
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd" />
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd" />
+ <xsd:include schemaLocation="../zmr/entities/Reisedokument.xsd" />
+
+ <xsd:element name="SzrAbfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="Art" type="AbfrageArt" />
+ <xsd:element name="SzrTransactionId" type="xsd:string" />
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0" />
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" />
+ <xsd:element ref="DokumentSuchdaten" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:simpleType name="AbfrageArt">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="EinzelMitList" />
+ <xsd:enumeration value="EinzelOhneList" />
+ <xsd:enumeration value="Kombi" />
+ <xsd:enumeration value="Persbin" />
+ <xsd:enumeration value="Suche" />
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="SzrAbfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message" />
+ <xsd:element ref="SzrAbfrageErgebnis" minOccurs="0" maxOccurs="unbounded" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="SzrAbfrageErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:PersonenDaten" />
+ <xsd:element ref="base:Register" />
+ <xsd:element name="Basiszahl" type="xsd:string" />
+ <xsd:element ref="base:Adressschluessel" minOccurs="0" />
+ <xsd:element name="WohnsitzHistorisch" type="xsd:boolean" minOccurs="0" />
+ <xsd:element name="AuskunftssperreGesetzt" type="xsd:boolean" minOccurs="0" />
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/TechnischeAnsicht.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/TechnischeAnsicht.xsd
new file mode 100644
index 00000000..a8d09153
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/TechnischeAnsicht.xsd
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: TechnischeAnsicht.xsd
+Zweck: Definiert Datentypen für die technische Ansicht eines Personensatzes mit Meldungen
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2009-10-27 mp: Schnittstelle überarbeitet, Person und Meldung getrennt
+2009-08-24 mp: Bei TechnischeAnsichtInfo minOccurs=0 gesetzt
+2009-08-19 teo: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+
+ <xsd:element name="TechnischeAnsichtRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TechnischeAnsichtInfo" minOccurs="0"/>
+ <xsd:element ref="PersonReferenz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TechnischeAnsichtAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="TechnischeAnsichtErgebnisPerson"/>
+ <xsd:element ref="TechnischeAnsichtErgebnisMeldung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TechnischeAnsichtInfo" minOccurs="0"/>
+ <xsd:element ref="PersonReferenz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtInfo" type="TechnischeAnsichtInfoType"/>
+ <xsd:complexType name="TechnischeAnsichtInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Abfrage zur technischen Ansicht</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="TechnischeAnsichtErgebnisPerson">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Enthält alle Personenzustände (für eine Person) zu einem bestimmten techn. Änderungszeitpunkt.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="TechnischeAnsichtPerson" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtErgebnisMeldung">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Enthält alle Meldungszustände (für eine Meldung) zu einem bestimmten techn. Änderungszeitpunkt.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="TechnischeAnsichtMeldung" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtPerson">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Liste der technischen Zustände einer Person zu einem Zeitpunkt.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="TechnischerZeitpunkt" type="base:TimestampType"/>
+ <xsd:element ref="PersonErgebnisTechnisch" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TechnischeAnsichtMeldung">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Liste der technischen Zustände einer Meldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="TechnischerZeitpunkt" type="base:TimestampType"/>
+ <xsd:element ref="MeldungErgebnisTechnisch" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="PersonErgebnisTechnisch">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>komplette Personendaten mit Information für den technischen Stichzeitpunkt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="PersonErgebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldungErgebnisTechnisch">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>komplette Meldung mit Information für den technischen Stichzeitpunkt</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="MeldungErgebnis"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Ummeldeserviceabfrage.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Ummeldeserviceabfrage.xsd
new file mode 100644
index 00000000..8f459931
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Ummeldeserviceabfrage.xsd
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Ummeldeserviceabfrage.xsd
+Zweck: Definiert Datentypen für die Abfrage für Ummeldeservices im ZMR
+Author(s): Ehrenmüller Oliver, ZMR-SU
+
+Aenderungshistorie:
+2009-05-07 teo: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+
+ <xsd:element name="UmmSrvAbfrageRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="UmmSrvAbfrageInfo"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="UmmSrvAbfrageResponse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="UmmSrvAbfrageAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="UmmSrvAbfrageErgebnis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="UmmSrvAbfrageAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="UmmSrvAbfrageInfo"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="UmmSrvAbfrageInfo" type="UmmSrvAbfrageInfoType"/>
+ <xsd:complexType name="UmmSrvAbfrageInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die BP-Abfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Pin">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="6"/>
+ <xsd:maxLength value="6"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+
+ <xsd:element name="UmmSrvAbfrageErgebnis">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WehrpflichtigeAbfragen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WehrpflichtigeAbfragen.xsd
new file mode 100644
index 00000000..9a5e6e1a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WehrpflichtigeAbfragen.xsd
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: WehrpflichtigeAbfragen.xsd
+Zweck: Definiert Datentypen für die Wehrpflichtigenabfrage im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-28 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Personenabfrage.xsd"/>
+
+ <xsd:element name="WehrpflichtigeAbfragenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WehrpflichtigeAbfragenInfo"/>
+ <xsd:element ref="cio:Bundesland"/>
+ <xsd:element name="GeburtsdatumVon" type="base:TimestampType"/>
+ <xsd:element name="GeburtsdatumBis" type="base:TimestampType"/>
+ <xsd:element ref="cio:Familienname"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WehrpflichtigeAbfragenResponse">
+ <xsd:annotation>
+ <xsd:documentation>
+ Es wir entweder das Feld PDFDaten (Anforderung als Druck) mit allen gefundenen Datensätzen,
+ oder WehrpflichtigeAbfragenErgebnis mit der aktuell geblätterten Seite geliefert.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WehrpflichtigeAbfragenAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="WehrpflichtigeAbfragenErgebnis" minOccurs="0"/>
+ <xsd:element name="PDFDaten" type="xsd:base64Binary" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WehrpflichtigeAbfragenAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WehrpflichtigeAbfragenInfo"/>
+ <xsd:element ref="cio:Bundesland"/>
+ <xsd:element name="GeburtsdatumVon" type="base:TimestampType"/>
+ <xsd:element name="GeburtsdatumBis" type="base:TimestampType"/>
+ <xsd:element ref="cio:Familienname"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WehrpflichtigeAbfragenInfo" type="WehrpflichtigeAbfragenInfoType"/>
+ <xsd:complexType name="WehrpflichtigeAbfragenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen für die Wehrpflichtigenabfrage</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="AlsDruck" type="xsd:boolean"/>
+ <xsd:element ref="base:AnzahlSaetze" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="WehrpflichtigeAbfragenErgebnis" type="WehrpflichtigeAbfragenErgebnisType"/>
+ <xsd:complexType name="WehrpflichtigeAbfragenErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Enthält je einen 'PersonErgebnisSatz' pro gefundener Person. Wird keine Person gefunden, befindet sich eine entprechende Text-Message in 'base:Message'</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der in der Datenbank gefundenen Personen</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeVon">
+ <xsd:annotation>
+ <xsd:documentation>Beginn-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern); Start mit 0</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:SaetzeBis">
+ <xsd:annotation>
+ <xsd:documentation>Ende-Index dieser Ergebnisliste im Gesamtergebnis (bei Blaettern)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="PersonErgebnisSatz" type="PAbfrageErgebnisSatzType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAbmelden.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAbmelden.xsd
new file mode 100644
index 00000000..5d3b7cc2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAbmelden.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: WohnsitzAbmelden.xsd
+Zweck: Definiert Datentypen für den Usecase "Wohnsitz abmelden" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-06-24 tsch: WohnsitzAbmeldenMsg entfernt
+2004-01-28 tsch: Gesamtdatensatz der neuen Meldung in der Response-Message
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Behoerdenattribute.xsd"/>
+
+ <xsd:element name="WohnsitzAbmeldenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WohnsitzAbmeldenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzAbmeldenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Wohnsitzabmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der abgemeldeten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzAbmeldenInfo" type="WohnsitzAbmeldenInfoType"/>
+ <xsd:complexType name="WohnsitzAbmeldenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Wohnsitzabmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+ <xsd:sequence>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAnmelden.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAnmelden.xsd
new file mode 100644
index 00000000..75670c47
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzAnmelden.xsd
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: WohnsitzAnmelden.xsd
+Zweck: Definiert Datentypen für den Usecase "Wohnsitz anmelden" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-06-24 tsch: WohnsitzAnmeldenMsg entfernt
+2004-01-28 tsch: Gesamtdatensatz der abgemeldeten Meldung in der Response-Message
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+
+ <xsd:element name="WohnsitzAnmeldenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WohnsitzAnmeldenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungAnlage"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzAnmeldenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Wohnsitzanmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der angelegten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzAnmeldenInfo" type="WohnsitzAnmeldenInfoType"/>
+
+ <xsd:complexType name="WohnsitzAnmeldenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>allgemeine Fachliche Informationen zur Wohnsitzanmeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+ <xsd:sequence>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzKorrigieren.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzKorrigieren.xsd
new file mode 100644
index 00000000..90153232
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzKorrigieren.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: WohnsitzKorrigieren.xsd
+Zweck: Definiert Datentypen für den Usecase "Wohnsitz korrigieren" im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-09-27 tsch: Erstellt
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Behoerdenattribute.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Auskunftssperre.xsd"/>
+
+ <xsd:element name="WohnsitzKorrigierenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WohnsitzKorrigierenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzKorrigierenResponse">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Wohnsitzkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="MeldungErgebnis">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der korrigierten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzKorrigierenInfo" type="WohnsitzKorrigierenInfoType"/>
+ <xsd:complexType name="WohnsitzKorrigierenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Wohnsitzkorrektur</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="base:InfoFachlichType">
+ <xsd:sequence>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ <xsd:element ref="cio:Abgabestelle" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzUmmelden.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzUmmelden.xsd
new file mode 100644
index 00000000..48128ade
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/WohnsitzUmmelden.xsd
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: WohnsitzUmmelden.xsd
+Zweck: Definiert Datentypen für den Usecase "Wohnsitz ummelden" im ZMR (siehe Messages.xsd)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2009-12-10 mp: Änderungsmöglichkeit d. Unterkunftgebers bei Ummeldung
+2009-08-06 teo: Auskunftssperre auf Meldung
+2004-07-06 tsch: WohnsitzUmmeldenInfo.Von optional
+2004-06-24 tsch: WohnsitzUmmeldenMsg entfernt
+2004-01-28 tsch: Gesamtdatensaetze der involvierten Meldungen in der Response-Message
+2004-01-25 tsch: BehoerdenattributeAendern wird BehoerdenattributeSetzen
+-->
+
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Behoerdenattribute.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Auskunftssperre.xsd"/>
+
+ <xsd:element name="WohnsitzUmmeldenRequest">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="WohnsitzUmmeldenInfo"/>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element name="UMMVorgang1">
+ <xsd:annotation>
+ <xsd:documentation>Referenz auf die erste in den Ummeldevorgang involvierte Meldung (wird entweder umgemeldet, oder abgemeldet), sowie deren evtl. geänderten Behördenattribute</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="UMMVorgang2" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>Zweite in den Ummeldevorgang involvierte Meldung (wird entweder umgemeldet, oder angemeldet - entsprechend entweder Referenz oder MeldungAnlage), sowie deren Behördenattribute (bei Ummeldung)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element ref="MeldungAnlage"/>
+ <xsd:sequence>
+ <xsd:element ref="MeldungReferenz"/>
+ <xsd:element name="BehoerdenattributeSetzen" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element ref="AuskunftssperreAenderung" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="AuskunftssperreAnlage" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzUmmeldenResponse">
+ <xsd:annotation>
+ <xsd:documentation>Server-Antwort zur Wohnsitzummeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:sequence minOccurs="0">
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element name="UMMErgebnis1" type="MeldungErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der umgemeldeten Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element name="UMMErgebnis2" type="MeldungErgebnisType" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtdatensatz der umgemeldeten oder neuen Meldung (mit EntityIDs der Meldung und deren abhängigen Entities)</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="WohnsitzUmmeldenInfo" type="WohnsitzUmmeldenInfoType"/>
+ <xsd:complexType name="WohnsitzUmmeldenInfoType">
+ <xsd:annotation>
+ <xsd:documentation>Fachliche Informationen zur Wohnsitzummeldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Von" minOccurs="0"/>
+ <xsd:element ref="base:GrundFreitext" minOccurs="0"/>
+ <xsd:element ref="UmmeldungAktion"/>
+ <xsd:choice>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="UmmeldungAktion">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="HWS_NWS_HWS"/>
+ <xsd:enumeration value="HWS_NWS"/>
+ <xsd:enumeration value="HWS_ABM_HWS"/>
+ <xsd:enumeration value="NWS_HWS"/>
+ <xsd:enumeration value="HWS_ABM_NWS_HWS"/>
+ <xsd:enumeration value="HWS_NWS_NWS_HWS"/>
+ <xsd:enumeration value="NWS_ABM_NWS"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRDatenauszug.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRDatenauszug.xsd
new file mode 100644
index 00000000..cdab5654
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRDatenauszug.xsd
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ZMRDatenauszug.xsd
+Zweck: Definiert Datentypen für den Datenabgleich externer Partner mit dem ZMR.
+ Die Partner übermitteln eine csv-Datei mit Suchbegriffen, diese xsd definiert die Struktur des Antwort-XML.
+Author(s): Richard Mayrhofer
+
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Personensuche.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="ZMRDatenauszug">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Identification" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="Personendaten" minOccurs="1"/>
+ <xsd:element ref="Meldedaten" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRProxy.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRProxy.xsd
new file mode 100644
index 00000000..bb0583ef
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZMRProxy.xsd
@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Name: ZMRProxy.xsd
+Zweck: Fasst alle ZMR-Vorgangs XSD-Files zusammen
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2011-09-05 teo: Änderungsdienst ZWR (PN126)
+2010-03-08 teo: Historische Meldungskorrektur
+2010-02-01 teo: MeldebestätigungenAnforderung hinzugefügt
+2009-08-24 mp: TechnischeAnsicht hinzugefügt
+2009-08-06 teo: Auskunftssperre ändern hinzugefügt
+2009-05-07 teo: Ummeldeserviceabfrage hinzugefügt
+2009-01-23 teo: GISSuche hinzugefügt
+2006-11-06 tsch: ORFGISAnforderung hinzugefügt
+2006-03-21 tsch: SZRSammelabfrage hinzugefügt
+2005-01-14 tsch: Aviso aktivieren entfernt, Gleichstzungtabelle Warten hinzugefügt
+2004-11-22 tsch: Gerichtskommissaerabfrage hinzugefügt
+2004-09-28 tsch: Wehrfplichtigenanfrage, ablaufende Auskunfssperren-Suche hinzugefügt
+2004-09-27 tsch: Storno/Korrektur hinzugefügt
+2004-09-09 tsch: SZR-Vorgänge sowie Person trennen/zusammenführen hinzugefügt
+2004-08-24 tsch: GISAdressabfrage hinzugefügt
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/Personensuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonAnlegen.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonAendern.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzAnmelden.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzAbmelden.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzUmmelden.xsd"/>
+ <xsd:include schemaLocation="../zmr/Adresssuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/Meldeauskunft.xsd"/>
+ <xsd:include schemaLocation="../zmr/BKMeldeauskunft.xsd"/>
+ <xsd:include schemaLocation="../zmr/Meldebestaetigung.xsd"/>
+ <xsd:include schemaLocation="../zmr/Avisosuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/AvisoAnlegen.xsd"/>
+ <xsd:include schemaLocation="../zmr/AvisoAendern.xsd"/>
+ <xsd:include schemaLocation="../zmr/AvisoFreigeben.xsd"/>
+ <xsd:include schemaLocation="../zmr/Datenabgleich.xsd"/>
+ <xsd:include schemaLocation="../zmr/Behoerdenabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/Businesspartnerabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/BusinesspartnerabfrageErweitert.xsd"/>
+ <xsd:include schemaLocation="../zmr/BusinesspartnerAnfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/Bestandsaenderungen.xsd"/>
+ <xsd:include schemaLocation="../zmr/Fremdenabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/Hauseigentuemerabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/IAPPersonenabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/Personenabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/Zuzugsbestaetigung.xsd"/>
+ <xsd:include schemaLocation="../zmr/GISAdressabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonZusammenfuehren.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonTrennen.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZREinzelabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZRPersonenbindung.xsd"/>
+ <xsd:include schemaLocation="../zmr/SzrAbfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZRPersonensuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/SZRSammelabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/BehoerdenattributeAendern.xsd"/>
+ <xsd:include schemaLocation="../zmr/Storno.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonKorrigieren.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzKorrigieren.xsd"/>
+ <xsd:include schemaLocation="../zmr/WehrpflichtigeAbfragen.xsd"/>
+ <xsd:include schemaLocation="../zmr/AblaufendeAuskunftssperrenSuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/Gerichtskommissaerabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/ObjektsucheSteuerfahndung.xsd"/>
+ <xsd:include schemaLocation="../zmr/Adoption.xsd"/>
+ <xsd:include schemaLocation="../zmr/GleichsetzungstabelleWarten.xsd"/>
+ <xsd:include schemaLocation="../zmr/QKZBearbeiten.xsd"/>
+ <xsd:include schemaLocation="../zmr/QKZAuswertung.xsd"/>
+ <xsd:include schemaLocation="../zmr/BPKPruefung.xsd"/>
+ <xsd:include schemaLocation="../zmr/ORFGISAnforderung.xsd"/>
+ <xsd:include schemaLocation="../zmr/Anwendungsintegration.xsd"/>
+ <xsd:include schemaLocation="../zmr/AnwendungsintegrationWiederholung.xsd"/>
+ <xsd:include schemaLocation="../zmr/Personenlisten.xsd"/>
+ <xsd:include schemaLocation="../zmr/GISSuche.xsd"/>
+ <xsd:include schemaLocation="../zmr/Ummeldeserviceabfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/AuskunftssperreAendern.xsd"/>
+ <xsd:include schemaLocation="../zmr/TechnischeAnsicht.xsd"/>
+ <xsd:include schemaLocation="../zmr/MeldebestaetigungenAnfordern.xsd"/>
+ <xsd:include schemaLocation="../zmr/MeldungHistKorrigieren.xsd"/>
+ <xsd:include schemaLocation="../zmr/ObjektsucheMindestsicherung.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonenIndex.xsd"/>
+ <xsd:include schemaLocation="../zmr/PersonExport.xsd"/>
+ <xsd:include schemaLocation="../zmr/ErnpAbfrage.xsd"/>
+ <xsd:include schemaLocation="../zmr/ZMRDatenauszug.xsd"/>
+ <xsd:include schemaLocation="../zmr/ZmrBuergerService.xsd"/>
+ <xsd:include schemaLocation="../zmr/Gemeindeeinstellungen.xsd"/>
+ <xsd:include schemaLocation="../zmr/Sperrliste.xsd"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZmrBuergerService.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZmrBuergerService.xsd
new file mode 100644
index 00000000..9732778d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/ZmrBuergerService.xsd
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ZmrBuergerService.xsd
+Zweck: Definiert Requests/Responses und Datentypen für die Usecases des ZMR-Buergerservice mit Buergerkarte.
+Author(s): Richie Mayrhofer, ZMR
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../zmr/entities/Meldung.xsd"/>
+ <xsd:include schemaLocation="../zmr/entities/Person.xsd"/>
+ <xsd:include schemaLocation="../zmr/WohnsitzUmmelden.xsd"/>
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="BuergerPersonensucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Personensuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TrackingInfo" minOccurs="0"/>
+ <xsd:element ref="cio:Familienname" minOccurs="1"/>
+ <xsd:element ref="cio:Vorname" minOccurs="1"/>
+ <xsd:element ref="cio:Geburtsdatum" minOccurs="1"/>
+ <xsd:element ref="bpkZP" minOccurs="1"/>
+ <xsd:element ref="base:Stichtag" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerPersonensucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Response der Personensuche im ZMR. Geliefert werden die ID-Daten sowie alle Staatsangehoerigkeiten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="PersonendatenBuerger" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="MeldedatenBuerger" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerMitbewohnersucheRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Mitbewohnersuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TrackingInfo" minOccurs="0"/>
+ <xsd:element ref="bpkZP"/>
+ <xsd:element ref="EntityIdPerson"/>
+ <xsd:element ref="EntityIdMeldung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerMitbewohnersucheResponse">
+ <xsd:annotation>
+ <xsd:documentation>Response der Mitbewohnersuche im ZMR. Geliefert wird die angefragte Adresse sowie die ID-Daten aller Personen an der Adresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Suchperson" minOccurs="1" maxOccurs="1"/>
+ <xsd:element ref="MinderjaehrigePerson" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerWohnsitzAnmeldenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Wohnsitzanmeldung im ZMR. bPK/ZP der </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TrackingInfo" minOccurs="0"/>
+ <xsd:element name="Signatur" type="xsd:base64Binary"/>
+ <xsd:element ref="bpkZP"/>
+ <xsd:element ref="cio:Wohnsitzqualitaet"/>
+ <xsd:element ref="Adressinfo"/>
+ <xsd:element ref="AnmeldedatenPerson" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerWohnsitzAbmeldenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Wohnsitzanmeldung im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TrackingInfo" minOccurs="0"/>
+ <xsd:element name="Signatur" type="xsd:base64Binary"/>
+ <xsd:element ref="bpkZP"/>
+ <xsd:element ref="Abmeldedaten" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerWohnsitzUmmeldenRequest">
+ <xsd:annotation>
+ <xsd:documentation>Suchkriterien für die Wohnsitzanmeldung im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="TrackingInfo" minOccurs="0"/>
+ <xsd:element name="Signatur" type="xsd:base64Binary"/>
+ <xsd:element ref="bpkZP"/>
+ <xsd:element ref="UmmeldungAktion" />
+ <!-- neue Adresse, leer UmmeldeAktion wenn nicht HWS_ABM_NWS_HWS oder HWS_NWS_NWS_HWS -->
+ <xsd:element ref="AnmeldeAdresse" minOccurs="0" maxOccurs="1"/>
+ <xsd:element ref="Ummeldedaten" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="TrackingInfo">
+ <xsd:annotation>
+ <xsd:documentation>Transaction- und UUID des Service Clients</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="TransactionId" type="xsd:string"/>
+ <xsd:element name="UUID" type="xsd:string"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AnmeldeAdresse">
+ <xsd:annotation>
+ <xsd:documentation>neue Meldung bei HWS_ABM_NWS_HWS und HWS_NWS_NWS_HWS</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Adressinfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="BuergerWohnsitzserviceResponse">
+ <xsd:annotation>
+ <xsd:documentation>Response der Wohnsitzabmeldung im ZMR. Geliefert wird der MessageCode, die Anzahl der an/ab/umgemeldeten Personen und die Meldebestaetigungen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="base:AnzahlSaetze"/>
+ <xsd:element name="PDF" type="xsd:base64Binary" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="bpkZP" type="xsd:string"/>
+ <xsd:element name="EntityIdPerson" type="xsd:long"/>
+ <xsd:element name="EntityIdMeldung" type="xsd:long"/>
+
+ <xsd:element name="PersonendatenBuerger">
+ <xsd:annotation>
+ <xsd:documentation>aktuelle Personendaten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityIdPerson"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Geburtsort"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ <xsd:element ref="Staatsangehoerigkeit" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element ref="bpkZP" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Staatsangehoerigkeit">
+ <xsd:annotation>
+ <xsd:documentation>Staatsangehoerigkeiten der Person, mindestens eine (ISO-Code3 + Name)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Staatscode"/>
+ <xsd:element ref="cio:Staatsname"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldedatenBuerger">
+ <xsd:annotation>
+ <xsd:documentation>aktuelle Meldungen zur Person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="MeldungKurzinfo"/>
+ <xsd:element ref="Adressinfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MeldungKurzinfo">
+ <xsd:annotation>
+ <xsd:documentation>aktuelle Meldungen zur Person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityIdMeldung"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ <xsd:element ref="cio:Wohnsitzqualitaet"/>
+ <xsd:element ref="base:GemeldetVon"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Adressinfo">
+ <xsd:annotation>
+ <xsd:documentation>Adresse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Postleitzahl"/>
+ <xsd:element ref="cio:Gemeinde"/>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ <xsd:element ref="cio:Ortschaft" minOccurs="0"/>
+ <xsd:element ref="cio:Strassenname"/>
+ <xsd:element name="Hausnummer" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Stiege" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="Tuer" type="xsd:string" minOccurs="0"/>
+ <xsd:element ref="AdressRegisterEintrag" minOccurs="0"/>
+ <xsd:element ref="cio:Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Suchperson">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten der abfragenden Person</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonendatenBuerger"/>
+ <xsd:element ref="MeldedatenBuerger"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="MinderjaehrigePerson">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten der minderjaehrigen Kinder</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="PersonendatenBuerger"/>
+ <xsd:element ref="MeldungKurzinfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Abmeldedaten">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten fuer eine abzumeldende Person </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <!-- Id der abzumeldenden Meldung -->
+ <xsd:element ref="Wohnsitz"/>
+ <!-- Id der abzumeldenden Person -->
+ <xsd:element ref="EntityIdPerson"/>
+ <!-- Timestamp letzte Aenderung Person -->
+ <xsd:element ref="base:LetzteAenderung"/>
+ <xsd:element ref="VerzugsstaatIso3" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Ummeldedaten">
+ <xsd:annotation>
+ <xsd:documentation>Personen- und Meldedaten fuer eine umzumeldende Person </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <!-- Id der umzumeldenden Person -->
+ <xsd:element ref="UmmeldedatenPerson"/>
+ <!-- Zuzugs- oder Verzugsstaat -->
+ <xsd:choice>
+ <xsd:element ref="ZuzugsstaatIso3" minOccurs="0"/>
+ <xsd:element ref="VerzugsstaatIso3" minOccurs="0"/>
+ </xsd:choice>
+ <!-- alte/bisherige Meldung -->
+ <xsd:element ref="Abmeldung" minOccurs="1"/>
+ <!-- neue/Ziel-Meldung bei Wechsel der WohnsitzQualitaet -->
+ <xsd:element ref="Anmeldung" minOccurs="0" maxOccurs="1"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Abmeldung">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Wohnsitz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Anmeldung">
+ <xsd:annotation>
+ <xsd:documentation>neue Meldung bei HWS_ABM_NWS_HWS und HWS_NWS_NWS_HWS</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="Wohnsitz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Wohnsitz">
+ <xsd:annotation>
+ <xsd:documentation>Id der zu aendernden Meldung sowie Datum der letzten Aenderung </xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityIdMeldung"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ZuzugsstaatIso3" type="StaatscodeType"/>
+ <xsd:element name="VerzugsstaatIso3" type="StaatscodeType"/>
+
+ <xsd:simpleType name="StaatscodeType">
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="AnmeldedatenPerson">
+ <xsd:annotation>
+ <xsd:documentation>Zuzugsstaat und Ummeldedaten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ZuzugsstaatIso3" minOccurs="0" />
+ <xsd:element ref="UmmeldedatenPerson"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+
+ <xsd:element name="UmmeldedatenPerson">
+ <xsd:annotation>
+ <xsd:documentation>Id der Person und Religionsbekenntnis</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="EntityIdPerson"/>
+ <xsd:element name="Religionsbekenntnis" type="xsd:string"/>
+ <xsd:element ref="base:LetzteAenderung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Zuzugsbestaetigung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Zuzugsbestaetigung.xsd
new file mode 100644
index 00000000..d557ae50
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/Zuzugsbestaetigung.xsd
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Zuzugsbestaetigung.xsd
+Zweck: Definiert Datentypen für die Zuzugsbetätigungen aus dem ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2011-09-13 teo: ZMR-1656 Zuzugsbestätigung aufgrund Wahlrechtsänderung anpassen
+2004-08-20 tsch: Kapselung der Zuzugssätze im Element Zuzugsbestaetigung
+2004-08-17 tsch: Erstellung
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="ZuzugsbestaetigungRequest">
+ <xsd:annotation>
+ <xsd:documentation>Anfragedaten der Zuzugsbestaetigung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ZuzugsbestaetigungInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ZuzugsbestaetigungResponse">
+ <xsd:annotation>
+ <xsd:documentation>In der Response werden die Anfragedaten aus dem Request und das Abgleichergebnis geliefert.</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ZuzugsbestaetigungAnfrage"/>
+ <xsd:element ref="base:Message"/>
+ <xsd:element ref="Zuzugsbestaetigung" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="ZuzugsbestaetigungInfo" type="ZuzugsbestaetigungInfoType"/>
+
+ <xsd:complexType name="ZuzugsbestaetigungInfoType">
+ <xsd:sequence>
+ <xsd:element ref="base:GemeindeNr"/>
+ <xsd:element name="ZuzugsbestaetigungVon" type="base:TimestampType"/>
+ <xsd:element name="ZuzugsbestaetigungBis" type="base:TimestampType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ZuzugsbestaetigungAnfrage">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="ZuzugsbestaetigungInfo"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="Zuzugsbestaetigung" type="ZuzugsbestaetigungType"/>
+
+ <xsd:complexType name="ZuzugsbestaetigungType">
+ <xsd:sequence>
+ <xsd:element ref="base:GefundeneSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Gesamtanzahl der Zuzugs-Saetze für diese Anfrage</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="base:AnzahlSaetze">
+ <xsd:annotation>
+ <xsd:documentation>Anzahl der im File gelieferten Zuzugs-Saetze</xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="ZuzugsbestaetigungSatz" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ZuzugsbestaetigungSatz" type="ZuzugsbestaetigungSatzType"/>
+ <xsd:complexType name="ZuzugsbestaetigungSatzType">
+ <xsd:sequence>
+ <xsd:element name="ZugezogenPerson" type="ZugezogenPersonType"/>
+ <xsd:element name="ZugezogenAm" type="base:TimestampType"/>
+ <xsd:element name="ZugezogenGemeindeNr" type="base:GemeindeNrType"/>
+ <xsd:element name="ZugezogenGemeinde" type="base:GemeindenameType"/>
+ <xsd:element name="HaftAnschrift" type="cio:PostAdresseTyp" minOccurs="0"/>
+ <xsd:element name="ZuLoeschenAm" type="base:TimestampType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ZugezogenPersonType">
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ </xsd:sequence>
+ </xsd:complexType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/AkademischerGrad.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/AkademischerGrad.xsd
new file mode 100644
index 00000000..3ebf0c0a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/AkademischerGrad.xsd
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: AkademischerGrad.xsd
+Zweck: Definiert Datentypen für die akademischen Grade einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-03-01 tsch: Feld AusstellBehoerde optional
+2004-06-20 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="AkademischerGradErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Suchergebnisse-Struktur akademischer Grade einer Person</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:AkadGradKey"/>
+ <xsd:element ref="base:AkadGradStellung"/>
+ <xsd:element ref="base:AkadGradReihung"/>
+ <xsd:element ref="base:AkadGradLang"/>
+ <xsd:element ref="base:AkadGradKurz"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AkademischerGradAnlage" type="AkademischerGradAnlageType"/>
+ <xsd:complexType name="AkademischerGradAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für Anlagen von akademischen Graden im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:annotation>
+ <xsd:documentation>
+ Bei Anlage eines offiziellen akademischer Grades muss der AkadGradKey des Grades geschickt werden,
+ die einzelnen Felder (ohne AkadGradKey) sind nur bei Anlage eines "händischen", nicht offiziellen
+ Grades zu befüllen.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="base:AkadGradKey"/>
+ <xsd:sequence>
+ <xsd:element ref="base:AkadGradStellung"/>
+ <xsd:element ref="base:AkadGradReihung"/>
+ <xsd:element ref="base:AkadGradLang"/>
+ <xsd:element ref="base:AkadGradKurz"/>
+ </xsd:sequence>
+ </xsd:choice>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AkademischerGradAenderung" type="AkademischerGradAenderungType"/>
+ <xsd:complexType name="AkademischerGradAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Struktur für Änderungen von akademischen Graden im ZMR.
+ Die Felder AkadGradLang und AkadGradKurz lassen sich nur bei nicht-offiziellen Graden (kein AkadGradKey) ändern.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityReferenz"/>
+ <xsd:element ref="base:AkadGradLang" minOccurs="0"/>
+ <xsd:element ref="base:AkadGradKurz" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Auskunftssperre.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Auskunftssperre.xsd
new file mode 100644
index 00000000..30dafed3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Auskunftssperre.xsd
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Auskunftssperre.xsd
+Zweck: Definiert Auskunftssperren für ZMR-Entities (Person und Meldung)
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-10-27 tsch: Felder bei Änderung optional, Beendigung hinzugefügt
+2004-08-06 tsch: SperrText in AuskunftssperreErgebnisType hinzugefügt
+2004-06-14 tsch: Handling mehrerer Auskunftssperren
+2004-01-22 tsch: Auskunftssperre->AuskunftssperreErgebnisType
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="AuskunftssperreErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Auskunftssperre-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="SperreVon"/>
+ <xsd:element ref="SperreBis"/>
+ <xsd:element ref="SperrCode"/>
+ <xsd:element ref="SperrText"/>
+ <xsd:element ref="SperrFreitext" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AuskunftssperreAnlage" type="AuskunftssperreAnlageType"/>
+ <xsd:complexType name="AuskunftssperreAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für Anlagen von Auskunftssperren</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="SperreVon"/>
+ <xsd:element ref="SperreBis"/>
+ <xsd:element ref="SperrCode"/>
+ <xsd:element ref="SperrFreitext" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AuskunftssperreAenderung" type="AuskunftssperreAenderungType"/>
+ <xsd:complexType name="AuskunftssperreAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für Änderungen von Auskunftssperren</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityReferenz"/>
+ <xsd:element ref="SperreVon" minOccurs="0"/>
+ <xsd:element ref="SperreBis" minOccurs="0"/>
+ <xsd:element ref="SperrCode" minOccurs="0"/>
+ <xsd:element ref="SperrFreitext" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="SperreVon" type="base:TimestampType"/>
+ <xsd:element name="SperreBis" type="base:TimestampType"/>
+
+ <xsd:element name="SperrCode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="15"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="SperrFreitext">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="240"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="SperrText">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="50"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Aviso.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Aviso.xsd
new file mode 100644
index 00000000..dff1d5eb
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Aviso.xsd
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Aviso.xsd
+Zweck: Definiert Datentypen für die Anlage, Aenderung und Suche von Avisi
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-06-02 mp: ZMR-1142: AvisoAktenzahl für case-insensitive Suche auf bestimmte Zeichen begrenzt
+2005-01-14 tsch: Adaptionen bei Änderung; Abfragerhythmus entfernt
+2004-11-26 tsch: Erweiterung um Avisotreffer
+2004-04-06 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:include schemaLocation="../Personenabfrage.xsd"/>
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="AvisoReferenz" type="AvisoReferenzType"/>
+ <xsd:complexType name="AvisoReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Typ für Referenzdaten eines Aviso (immer das aktuellste, das heisst jüngstes 'Von'), mit Avisozahl zur Kontrolle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Technisch"/>
+ <xsd:element ref="AvisoZahl"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoErgebnis" type="AvisoErgebnisType"/>
+
+
+ <xsd:complexType name="AvisoErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Aviso-Struktur für Suchergebnisse der Avisosuchen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="AvisoZahl"/>
+ <xsd:element ref="AvisoAktenzahl" minOccurs="0"/>
+ <xsd:element ref="base:Behoerdenschluessel"/>
+ <xsd:element ref="base:BehoerdenBezeichnung" minOccurs="0"/>
+
+ <xsd:element ref="ZustaendigeMeldebehoerde"/>
+
+ <xsd:element ref="AvisoStart"/>
+ <xsd:element ref="AvisoEnde"/>
+ <xsd:element ref="AvisoStatus"/>
+
+ <xsd:element ref="AvisoSuchkriterien"/>
+ <xsd:element ref="AvisoSuchdaten"/>
+
+ <xsd:element ref="AvisoTreffer" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoTreffer" type="AvisoTrefferType"/>
+ <xsd:complexType name="AvisoTrefferType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für gefundenen Treffer des Aviso im ZMR (ein Treffer repräsentiert eine gefundene Person)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="AvisoTrefferStatus"/>
+ <xsd:element name="AvisoTrefferAusgeschlossen" type="xsd:boolean"/>
+ <xsd:element name="AvisoTrefferPersonendaten" type="PAbfrageErgebnisSatzType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoAnlage" type="AvisoAnlageType"/>
+ <xsd:complexType name="AvisoAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Aviso-Struktur für Neuanlagen von Avisi im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:BehoerdenNr" minOccurs="0"/>
+ <xsd:element ref="AvisoAktenzahl" minOccurs="0"/>
+ <xsd:element ref="ZustaendigeMeldebehoerde"/>
+
+ <xsd:element ref="AvisoStart"/>
+ <xsd:element ref="AvisoEnde"/>
+
+ <xsd:element ref="AvisoSuchkriterien"/>
+ <xsd:element ref="AvisoSuchdaten"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoAenderung" type="AvisoAenderungType"/>
+ <xsd:complexType name="AvisoAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Aviso-Struktur für Aenderungen von Avisdaten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="AvisoStart" minOccurs="0"/>
+ <xsd:element ref="AvisoEnde" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoTrefferAenderung" type="AvisoTrefferAenderungType"/>
+ <xsd:complexType name="AvisoTrefferAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur zum Ein/Ausschliessen von Avisotreffern eines Aviso</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="PersonReferenz"/>
+ <xsd:element ref="base:Bezugsfeld" minOccurs="0"/>
+ <xsd:element name="AvisoTrefferAusschliessen" type="xsd:boolean"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="AvisoSuchkriterien">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:Formalisiert"/>
+ <xsd:element ref="base:InclusivNameVorErsterEhe"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoSuchdaten">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ <xsd:element name="AvisoZahl">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[0-9]{9}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AvisoAktenzahl">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="72"/>
+ <xsd:pattern value="[a-zA-Z0-9ÄÖÜäöüß^°!&quot;§$&amp;/(){}\[\]=?\\´`*+~#',;.:\-_@ ]*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:element name="AvisoStart" type="base:TimestampType"/>
+ <xsd:element name="AvisoEnde" type="base:TimestampType"/>
+
+ <xsd:element name="AvisoStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="N"/>
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="D"/>
+ <xsd:enumeration value="H"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="AvisoTrefferStatus">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="A"/>
+ <xsd:enumeration value="H"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="ZustaendigeMeldebehoerde" type="base:GemeindeNrType"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Behoerdenattribute.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Behoerdenattribute.xsd
new file mode 100644
index 00000000..0b2cc6b8
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Behoerdenattribute.xsd
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Behoerdenattribute.xsd
+Zweck: Definiert die Struktur von Behördenattributen für Meldungen
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-12-01 tsch: Attribut6 hinzugefügt
+2004-01-22 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="BehoerdenattributeErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Behördenattribute-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:sequence>
+ <xsd:element ref="Attribut1" minOccurs="0"/>
+ <xsd:element ref="Attribut2" minOccurs="0"/>
+ <xsd:element ref="Attribut3" minOccurs="0"/>
+ <xsd:element ref="Attribut4" minOccurs="0"/>
+ <xsd:element ref="Attribut5" minOccurs="0"/>
+ <xsd:element ref="Attribut6" minOccurs="0"/>
+ <xsd:element ref="OMRNummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="BehoerdenattributeSetzenType">
+ <xsd:annotation>
+ <xsd:documentation>Behördenattribute-Struktur zum Setzen der Behördenattribute einer Meldung</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="Attribut1" minOccurs="0"/>
+ <xsd:element ref="Attribut2" minOccurs="0"/>
+ <xsd:element ref="Attribut3" minOccurs="0"/>
+ <xsd:element ref="Attribut4" minOccurs="0"/>
+ <xsd:element ref="Attribut5" minOccurs="0"/>
+ <xsd:element ref="Attribut6" minOccurs="0"/>
+ <xsd:element ref="OMRNummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Attribut1" type="AttributType"/>
+ <xsd:element name="Attribut2" type="AttributType"/>
+ <xsd:element name="Attribut3" type="AttributType"/>
+ <xsd:element name="Attribut4" type="AttributType"/>
+ <xsd:element name="Attribut5" type="AttributType"/>
+ <xsd:element name="Attribut6" type="AttributType"/>
+ <xsd:element name="OMRNummer" type="AttributType"/>
+
+ <xsd:simpleType name="AttributType">
+ <xsd:restriction base="xsd:string">
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="240"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPAnschrift.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPAnschrift.xsd
new file mode 100644
index 00000000..0fb07b9b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPAnschrift.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ERnPAnschrift.xsd
+Zweck: Definiert Anschriftntypen für Suchergebnisse aus dem ERnP der übergreifenden ZMR-Suche
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2005-11-29 tsch: Firmenname, Ansprechpartner hinzugefügt
+2005-10-11 tsch: Umbenennung Anschrift->Anschrift
+2005-10-06 tsch: Umbenennung EGR->ERnP
+2005-08-30 tsch: Anpassungen an neu erstellte Schnittstelle des ERnP
+2004-01-27 tsch: Erstellung (Diese Struktur der EGR-Anschrift ist vorläufig, und wird noch angepasst!)
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:element name="ERnPAnschriftErgebnis" type="ERnPAnschriftErgebnisType"/>
+ <xsd:complexType name="ERnPAnschriftErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Anschrift-Struktur für Suchergebnisse aus dem ERnP</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="cio:PostAdresse" minOccurs="0"/>
+ <xsd:element ref="PostleitzahlStaat" minOccurs="0"/>
+ <xsd:element ref="base:Adressstatus" minOccurs="0"/>
+ <xsd:element ref="base:Adressschluessel" minOccurs="0"/>
+ <xsd:element ref="base:HauptIdent" minOccurs="0"/>
+ <xsd:element ref="base:StrasseZweisprachig" minOccurs="0"/>
+ <xsd:element ref="base:Postleitzahlgebiet" minOccurs="0"/>
+ <xsd:element ref="cio:TelefonAdresse" minOccurs="0" maxOccurs="3"/>
+ <xsd:element ref="cio:InternetAdresse" minOccurs="0"/>
+ <xsd:element name="Firmenname1" type="FirmennameType" minOccurs="0"/>
+ <xsd:element name="Firmenname2" type="FirmennameType" minOccurs="0"/>
+ <xsd:element ref="Ansprechpartner" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="PostleitzahlStaat">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:pattern value="[A-Z]{3}"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+
+ <xsd:simpleType name="FirmennameType">
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <xsd:element name="Ansprechpartner">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPPerson.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPPerson.xsd
new file mode 100644
index 00000000..d4b83b63
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/ERnPPerson.xsd
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: ERnPPerson.xsd
+Zweck: Definiert Persondatentypen für Suchergebnisse aus dem ERnP der übergreifenden ZMR-Suche
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-04-02 teo: +Kit-Informationen
+2010-02-25 mp: +Akad. Grad
+2006-01-12 tsch: Anschrift optional
+2005-10-06 tsch: Umbenennung EGR->ERnP
+2005-08-30 tsch: Anpassungen an neu erstellte Schnittstelle des ERnP
+2004-01-27 tsch: Erstellung (Diese Struktur der EGR-Person ist vorläufig, und wird noch angepasst!)
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="ERnPAnschrift.xsd"/>
+
+ <xsd:element name="ERnPPersonErgebnis" type="ERnPPersonErgebnisType"/>
+
+ <xsd:complexType name="ERnPPersonErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Suchergebnisse aus dem ERnP</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:ErgebnissatzInfo"/>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="0"/>
+ <xsd:element ref="cio:NatuerlichePerson"/>
+ <xsd:element name="ReferenziertePersonen" type="ERnPReferenziertePersonenErgebnisType" minOccurs="0"/>
+ <xsd:element name="Reisedokument" type="ERnPReisedokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Dokument" type="ERnPDokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="PersonGeprueft" type="xsd:boolean"/>
+ <xsd:element name="Anschrift" type="ERnPAnschriftErgebnisType" minOccurs="0"/>
+ <xsd:element name="AkadGrad" type="ERnPAkademischerGradErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ERnPDokumentErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Dokument-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:DokumentNummer"/>
+ <xsd:element ref="base:AusstellDatum"/>
+ <xsd:element ref="base:AusstellBehoerde"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:SterbeDatum" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ERnPReisedokumentErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Reisedokument-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:DokumentGiltBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ERnPAkademischerGradErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Akademischer-Grad-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:AkadGradKey"/>
+ <xsd:element ref="base:AkadGradStellung"/>
+ <xsd:element ref="base:AkadGradReihung"/>
+ <xsd:element ref="base:AkadGradLang"/>
+ <xsd:element ref="base:AkadGradKurz"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="ERnPReferenziertePersonenErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Hier befinden sich Referenzan auf Personen, die mit der Person in technischer Beziehung stehen.
+ - KITQuelle, KITZiel, SPLITQuelle, SPLITZiel1 und SPLITZiel2 sind Referenzen auf geKITete
+ bzw. geSPLITete Quellpersonen- bzw. Zielpersonen und entsprechend befüllt (siehe Beschreibung KIT/SPLIT)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="KitQuelle" type="base:OrdnungsZahlType" minOccurs="0"/>
+ <xsd:element name="KitZiel" type="base:OrdnungsZahlType" minOccurs="0"/>
+ <xsd:element name="SplitQuelle" type="base:OrdnungsZahlType" minOccurs="0"/>
+ <xsd:element name="SplitZiel1" type="base:OrdnungsZahlType" minOccurs="0"/>
+ <xsd:element name="SplitZiel2" type="base:OrdnungsZahlType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd
new file mode 100644
index 00000000..361c0c95
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: EidasIdentitaet.xsd
+Zweck: Definiert Datentypen für die EidasIdentitaeten einer Person im ZMR
+Author(s): Richard Mayrhofer
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-iEidasce"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="EidasIdentitaetErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>EIDAS-Identitaet-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="EidasArt"/>
+ <xsd:element ref="Staatscode2" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="EidasWert" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasIdentitaetAnlage" type="EidasIdentitaetAnlageType"/>
+ <xsd:complexType name="EidasIdentitaetAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>EIDAS-Identitaet-Struktur für Identitaetanlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EidasArt"/>
+ <xsd:element ref="Staatscode2"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="EidasWert" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="image" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasIdentitaetAenderung" type="EidasIdentitaetAenderungType"/>
+ <xsd:complexType name="EidasIdentitaetAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>EidasIdentitaet-Struktur für Änderungen von Identitaeten im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Technisch"/>
+ <xsd:element ref="EidasArt" minOccurs="0"/>
+ <xsd:element ref="Staatscode2" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="EidasWert" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="image" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasSuchdaten" type="EidasSuchdatenType"/>
+ <xsd:complexType name="EidasSuchdatenType">
+ <xsd:annotation>
+ <xsd:documentation>EidasIdentitaet-Struktur für EidasIdentitensuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EidasArt" minOccurs="0"/>
+ <xsd:element ref="Staatscode2" minOccurs="0"/>
+ <xsd:element ref="EidasWert" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Staatscode2">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="2"/>
+ <xsd:maxLength value="2"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EidasArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="255"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EidasWert">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="255"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="image" type="xsd:base64Binary"/>
+
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd.svntmp b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd.svntmp
new file mode 100644
index 00000000..cd07bd8a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/EidasIdentitaet.xsd.svntmp
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: EidasIdentitaet.xsd
+Zweck: Definiert Datentypen für die EidasIdentitaeten einer Person im ZMR
+Author(s): Richard Mayrhofer
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-iEidasce"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="EidasIdentitaetErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>EIDAS-Identitaet-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="EidasArt"/>
+ <xsd:element ref="Staatscode3" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasIdentitaetAnlage" type="EidasIdentitaetAnlageType"/>
+ <xsd:complexType name="EidasIdentitaetAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>EIDAS-Identitaet-Struktur für Identitaetanlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EidasArt"/>
+ <xsd:element ref="Staatscode3"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="EidasNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="image" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasIdentitaetAenderung" type="EidasIdentitaetAenderungType"/>
+ <xsd:complexType name="EidasIdentitaetAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>EidasIdentitaet-Struktur für Änderungen von Identitaeten im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Technisch"/>
+ <xsd:element ref="EidasArt" minOccurs="0"/>
+ <xsd:element ref="Staatscode3" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="EidasNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="image" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="EidasSuchdaten" type="EidasSuchdatenType"/>
+ <xsd:complexType name="EidasSuchdatenType">
+ <xsd:annotation>
+ <xsd:documentation>EidasIdentitaet-Struktur für EidasIdentitensuche im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="EidasArt" minOccurs="0"/>
+ <xsd:element ref="EidasNummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="Staatscode3">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="3"/>
+ <xsd:maxLength value="3"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EidasArt">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="55"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="EidasNummer">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="0"/>
+ <xsd:maxLength value="54"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="image" type="xsd:base64Binary"/>
+
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Meldung.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Meldung.xsd
new file mode 100644
index 00000000..0ea75355
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Meldung.xsd
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Meldung.xsd
+Zweck: Definiert Meldedatentypen für das ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-08-18 tsch: Qualifikationskennzeichen hinzugefügt
+2004-08-02 tsch: Adressschluessel hinzugefügt; StrasseZweisprachig, Postleitzahlgebiet, weitere optionale Adresssfelder bei MeldungErgebnis hinzugefügt
+2004-08-02 tsch: Adressdaten in Struktur-Feld 'Wohnsitz' gekapselt
+2004-07-30 tsch: PostAdresseAnlageKlaerung entfernt, Keys und Adressfelde in PostadresseAnlage optional, Felder an neue Personrecord angepasst
+2004-07-14 tsch: Postleitzahl in Klärungsadresse optional
+2004-07-08 tsch: Felder Adresszusatz, HauptIdentadresse hinzugefügt
+2004-06-24 tsch: Bezeichung Beharrungsadresse->Klaerungsadresse
+2004-06-18 tsch: ErgebnissatzInfo hinzugefügt
+2004-06-14 tsch: Handling mehrerer Auskunftssperren
+2004-04-14 tsch: MeldungAnlageType: Korrekturen bei Beharrungsadresse/offizielle Adresse
+2004-01-27 tsch: ZMRAdresse wird PostAdresse
+2004-01-22 tsch: Integration der CIO-Personendaten Struktur (http://reference.e-government.gv.at/namespace/persondata/de/20040201#)
+-->
+
+<xsd:schema targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Behoerdenattribute.xsd"/>
+ <xsd:include schemaLocation="Auskunftssperre.xsd"/>
+ <xsd:include schemaLocation="Qualifikationskennzeichen.xsd"/>
+
+ <xsd:element name="MeldungReferenz" type="MeldungReferenzType"/>
+ <xsd:complexType name="MeldungReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Typ für Referenzdaten einer Meldung, (immer die aktuellste, das heisst jüngstes 'Von') mit WS-Qualität zur Kontrolle)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Technisch">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bei einer Änderung von Meldedaten müssen hier die EntityID der Meldung, sowie der
+ Zeitpunkt der letzten Änderung am Meldungssatz (Meldung-Entity und abhängige Entities wie Behördenattribute)
+ geschickt werden.
+ Der LetzteAenderung-Timestamp muss mit dem LetzteAenderung-Timestamp im Feld ErgebnissatzInfo
+ aus dem Suchergebnissatz übereinstimmen
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ <xsd:element ref="cio:Wohnsitzqualitaet">
+ <xsd:annotation>
+ <xsd:documentation>
+ Die Wohnsitzqualität der Meldung muss zur Kontrolle unverändert
+ mitgeschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="MeldungErgebnis" type="MeldungErgebnisType"/>
+ <xsd:complexType name="MeldungErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Meldung-Struktur für Suchergebnisse aus dem ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:ErgebnissatzInfo"/>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element name="Wohnsitz" type="WohnsitzErgebnisType"/>
+ <xsd:element ref="base:GemeldetVon"/>
+ <xsd:element ref="base:PeriodeCode"/>
+ <xsd:element ref="base:PeriodeText"/>
+ <xsd:element ref="base:PeriodeFreitext" minOccurs="0"/>
+ <xsd:element ref="base:GemeldetBis" minOccurs="0"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeErgebnisType" minOccurs="0"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PostAdresseErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>ZMR-Adresse (Suchergebnis)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element ref="cio:Postleitzahl"/>
+ <xsd:element ref="cio:Gemeinde"/>
+ <xsd:element ref="cio:Gemeindekennziffer"/>
+ <xsd:element ref="cio:Ortschaft" minOccurs="0"/>
+ <xsd:element ref="cio:OrtschaftZweisprachig" minOccurs="0"/>
+ <xsd:element name="Zustelladresse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Adresszeile" minOccurs="0"/>
+ <xsd:element ref="cio:Strassenname"/>
+ <xsd:element ref="cio:Orientierungsnummer"/>
+ <xsd:element ref="cio:Gebaeude" minOccurs="0"/>
+ <xsd:element ref="cio:Nutzungseinheit" minOccurs="0"/>
+ <xsd:element ref="cio:Wohnsitzqualitaet"/>
+ <xsd:element ref="cio:Abgabestelle" minOccurs="0"/>
+ <xsd:element ref="cio:Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element ref="AdressRegisterEintrag" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="WohnsitzErgebnisType">
+ <xsd:sequence>
+ <xsd:element name="PostAdresse" type="PostAdresseErgebnisType"/>
+ <xsd:element ref="base:Adressstatus"/>
+ <xsd:element ref="base:Adressschluessel" minOccurs="0"/>
+ <xsd:element ref="base:HauptIdent" minOccurs="0"/>
+ <xsd:element ref="base:StrasseZweisprachig" minOccurs="0"/>
+ <xsd:element ref="base:Postleitzahlgebiet" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="MeldungAnlage" type="MeldungAnlageType"/>
+ <xsd:complexType name="MeldungAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Meldung-Struktur zur Wohnsitzanmeldung im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="Wohnsitz" type="WohnsitzAnlageType"/>
+ <xsd:element ref="base:Unterkunftgeber" minOccurs="0"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="WohnsitzAnlageType">
+ <xsd:sequence>
+ <xsd:element name="PostAdresse" type="PostAdresseAnlageType"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="PostAdresseAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>ZMR-Adresse (für Wohnsitzanlage)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractAddressType">
+ <xsd:sequence>
+ <xsd:element ref="cio:Postleitzahl" minOccurs="0"/>
+ <xsd:element ref="cio:Gemeindekennziffer" minOccurs="0"/>
+ <xsd:element ref="cio:Ortschaft" minOccurs="0"/>
+ <xsd:element ref="cio:OrtschaftZweisprachig" minOccurs="0"/>
+ <xsd:element name="Zustelladresse">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Adresszeile" minOccurs="0"/>
+ <xsd:element ref="cio:Strassenname" minOccurs="0"/>
+ <xsd:element ref="cio:Orientierungsnummer" minOccurs="0"/>
+ <xsd:element ref="cio:Gebaeude" minOccurs="0"/>
+ <xsd:element ref="cio:Nutzungseinheit" minOccurs="0"/>
+ <xsd:element ref="cio:Wohnsitzqualitaet"/>
+ <xsd:element ref="cio:Abgabestelle" minOccurs="0"/>
+ <xsd:element ref="cio:Nutzungseinheitlaufnummer" minOccurs="0"/>
+ <xsd:element ref="AdressRegisterEintrag" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:element name="AdressRegisterEintrag">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Adresscode" minOccurs="1"/>
+ <xsd:element ref="cio:Subcode" minOccurs="0"/>
+ <xsd:element ref="cio:Objektnummer" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+</xsd:schema>
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Person.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Person.xsd
new file mode 100644
index 00000000..8e3e55ee
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Person.xsd
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Person.xsd
+Zweck: Definiert Persondatentypen für das Personenregister
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2006-04-18 woeg: +optionales Feld Familienstand
+2004-12-17 tsch: optionales Feld Affix in NatuerlichePersonErgebnisType hinzugefügt
+2004-09-29 tsch: Standarddokumente hinzugefügt
+2004-06-22 tsch: StaatZugezogen bei PersonAenderung hinzugefügt, akademische Grade hinzugefügt, Titel hinzugefügt
+2004-06-18 tsch: ErgebnissatzInfo hinzugefügt
+2004-06-14 tsch: Behördenattribute hinzugefügt
+2004-06-14 tsch: Handling mehrerer Auskunftssperren
+2004-01-22 tsch: Integration der CIO-Personendaten Struktur (http://reference.e-government.gv.at/namespace/persondata/de/20040201#)
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+ <xsd:include schemaLocation="Reisedokument.xsd"/>
+ <xsd:include schemaLocation="Behoerdenattribute.xsd"/>
+ <xsd:include schemaLocation="Auskunftssperre.xsd"/>
+ <xsd:include schemaLocation="Qualifikationskennzeichen.xsd"/>
+ <xsd:include schemaLocation="Staatsangehoerigkeit.xsd"/>
+ <xsd:include schemaLocation="AkademischerGrad.xsd"/>
+ <xsd:include schemaLocation="Standarddokument.xsd"/>
+ <xsd:include schemaLocation="EidasIdentitaet.xsd"/>
+
+ <xsd:element name="PersonReferenz" type="PersonReferenzType"/>
+ <xsd:complexType name="PersonReferenzType">
+ <xsd:annotation>
+ <xsd:documentation>Typ für Referenzdaten einer Person (immer die aktuellste, das heisst jüngstes 'Von'), mit ZMR-Zahl zur Kontrolle</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:Technisch">
+ <xsd:annotation>
+ <xsd:documentation>
+ Bei einer Änderung von Personendaten müssen hier die EntityID der Person, sowie der
+ Zeitpunkt der letzten Änderung am Personensatz (Person-Entity und abhängige Entities wie Reisedokumente)
+ geschickt werden.
+ Der LetzteAenderung-Timestamp muss mit dem LetzteAenderung-Timestamp im Feld ErgebnissatzInfo
+ aus dem Suchergebnissatz übereinstimmen
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
+ <xsd:element ref="base:ZMRZahl">
+ <xsd:annotation>
+ <xsd:documentation>
+ Die ZMR-Zahl der Person muss zur Kontrolle unverändert
+ mitgeschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="PersonErgebnis" type="PersonErgebnisType"/>
+
+
+ <xsd:complexType name="PersonErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Suchergebnisse aus dem ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:ErgebnissatzInfo"/>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:ZMRZahl" minOccurs="0"/>
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonErgebnisType"/>
+ <xsd:element ref="base:Titel" minOccurs="0"/>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ <xsd:element name="ReferenziertePersonen" type="ReferenziertePersonenErgebnisType" minOccurs="0"/>
+ <xsd:element name="Reisedokument" type="ReisedokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeErgebnisType" minOccurs="0"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Qualifikationskennzeichen" type="QualifikationskennzeichenErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AkademischerGrad" type="AkademischerGradErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Standarddokument" type="StandarddokumentErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="EidasIdentitaet" type="EidasIdentitaetErgebnisType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Natuerliche Person (Suchergebnis)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractPersonType">
+ <xsd:sequence>
+ <xsd:element name="PersonenName">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Familienname"/>
+ <xsd:element ref="cio:Affix" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="cio:AlternativName" minOccurs="0"/>
+ <xsd:element ref="cio:Familienstand" minOccurs="0"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Geburtsort"/>
+ <xsd:element ref="cio:Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsstaat"/>
+ <xsd:element ref="cio:Sterbedatum" minOccurs="0"/>
+ <xsd:element name="Staatsangehoerigkeit" type="StaatsangehoerigkeitErgebnisType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="ReferenziertePersonenErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>
+ Hier befinden sich Referenzan auf Personen, die mit der Person in technischer Beziehung stehen.
+ - Die Ordnungszahl verweist auf den Personenzatz im Ergänzungsregister, falls die Person vom
+ vom EGR ins ZMR übernommen wurde.
+ - KITQuelle, KITZiel, SPLITQuelle, SPLITZiel1 und SPLITZiel2 sind Referenzen auf geKITete
+ bzw. geSPLITete Quellpersonen- bzw. Zielpersonen und entsprechend befüllt (siehe Beschreibung KIT/SPLIT)
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:OrdnungsZahl" minOccurs="0"/>
+ <xsd:element name="KitQuelle" type="base:ZMRZahlType" minOccurs="0"/>
+ <xsd:element name="KitQuelleBpk" type="cio:IdentificationType" minOccurs="0"/>
+ <xsd:element name="KitZiel" type="base:ZMRZahlType" minOccurs="0"/>
+ <xsd:element name="KitZielBpk" type="cio:IdentificationType" minOccurs="0"/>
+ <xsd:element name="SplitQuelle" type="base:ZMRZahlType" minOccurs="0"/>
+ <xsd:element name="SplitZiel1" type="base:ZMRZahlType" minOccurs="0"/>
+ <xsd:element name="SplitZiel2" type="base:ZMRZahlType" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="PersonAnlage" type="PersonAnlageType"/>
+ <xsd:complexType name="PersonAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Personenanlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonAnlageType"/>
+ <xsd:element ref="base:Titel" minOccurs="0"/>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element name="Reisedokument" type="ReisedokumentAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Behoerdenattribute" type="BehoerdenattributeSetzenType" minOccurs="0"/>
+ <xsd:element name="Auskunftssperre" type="AuskunftssperreAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="AkademischerGrad" type="AkademischerGradAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="Standarddokument" type="StandarddokumentAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="EidasIdentitaet" type="EidasIdentitaetAnlageType" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Natuerliche Person (Personenanlage)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractPersonType">
+ <xsd:sequence>
+ <xsd:element name="PersonenName">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Vorname"/>
+ <xsd:element ref="cio:Familienname"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="cio:AlternativName" minOccurs="0"/>
+ <xsd:element ref="cio:Familienstand" minOccurs="0"/>
+ <xsd:element ref="cio:Geschlecht"/>
+ <xsd:element ref="cio:Geburtsdatum"/>
+ <xsd:element ref="cio:Geburtsort"/>
+ <xsd:element ref="cio:Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsstaat"/>
+ <xsd:element name="Staatsangehoerigkeit" type="StaatsangehoerigkeitAnlageType" minOccurs="1" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+ <xsd:element name="PersonAenderung" type="PersonAenderungType"/>
+ <xsd:complexType name="PersonAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Person-Struktur für Personendatenänderungen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="NatuerlichePerson" type="NatuerlichePersonAenderungTyp" minOccurs="0"/>
+ <xsd:element ref="base:Titel" minOccurs="0"/>
+ <xsd:choice>
+ <xsd:element ref="base:StaatZugezogen" minOccurs="0"/>
+ <xsd:element ref="base:StaatVerzogen" minOccurs="0"/>
+ </xsd:choice>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="NatuerlichePersonAenderungTyp">
+ <xsd:annotation>
+ <xsd:documentation>Natuerliche Person (Änderung)</xsd:documentation>
+ </xsd:annotation>
+ <xsd:complexContent>
+ <xsd:extension base="cio:AbstractPersonType">
+ <xsd:sequence>
+ <xsd:element name="PersonenName" minOccurs="0">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element ref="cio:Vorname" minOccurs="0"/>
+ <xsd:element ref="cio:Familienname" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element ref="cio:AlternativName" minOccurs="0"/>
+ <xsd:element ref="cio:Familienstand" minOccurs="0"/>
+ <xsd:element ref="cio:Geschlecht" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsdatum" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsort" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsbundesland" minOccurs="0"/>
+ <xsd:element ref="cio:Geburtsstaat" minOccurs="0"/>
+ <xsd:element ref="cio:Sterbedatum" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:extension>
+ </xsd:complexContent>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Qualifikationskennzeichen.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Qualifikationskennzeichen.xsd
new file mode 100644
index 00000000..044452c6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Qualifikationskennzeichen.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Qualifikationskennzeichen.xsd
+Zweck: Definiert Datentypen für die Qualifikationskennzeichen einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-02-02 tsch: Umbennenung auf QualifikationskennzeichenCode, QualifikationskennzeichenText, Adaptionen
+2004-01-22 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="QualifikationskennzeichenErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Qualifikationskennzeichen-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:sequence>
+ <xsd:element ref="QualifikationskennzeichenCode"/>
+ <xsd:element ref="QualifikationskennzeichenText" minOccurs="0"/>
+ <xsd:element ref="QualifikationskennzeichenGiltAb" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="QualifikationskennzeichenAnlage" type="QualifikationskennzeichenAnlageType"/>
+ <xsd:complexType name="QualifikationskennzeichenAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für Anlagen von Qualifikationskennzeichen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="QualifikationskennzeichenCode" minOccurs="1"/>
+ <xsd:element ref="QualifikationskennzeichenText" minOccurs="0"/>
+ <xsd:element ref="QualifikationskennzeichenGiltAb" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="QualifikationskennzeichenLoeschen" type="QualifikationskennzeichenLoeschenType"/>
+ <xsd:complexType name="QualifikationskennzeichenLoeschenType">
+ <xsd:annotation>
+ <xsd:documentation>Struktur für Änderungen von Qualifikationskennzeichen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityReferenz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="QualifikationskennzeichenCode">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="35"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="QualifikationskennzeichenText">
+ <xsd:simpleType>
+ <xsd:restriction base="xsd:string">
+ <xsd:whiteSpace value="collapse"/>
+ <xsd:minLength value="1"/>
+ <xsd:maxLength value="55"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+ </xsd:element>
+ <xsd:element name="QualifikationskennzeichenGiltAb" type="xsd:date"/>
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Reisedokument.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Reisedokument.xsd
new file mode 100644
index 00000000..edbbcc8c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Reisedokument.xsd
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Reisedokument.xsd
+Zweck: Definiert Datentypen für die Reisedokumente einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-03-16 teo: LMR-756/CLM-1504 Reisedokument gültig bis erfassen
+2004-01-22 tsch: Reisedokument->ReisedokumentErgebnisType
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="ReisedokumentErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Reisedokument-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:DokumentGiltBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ReisedokumentAnlage" type="ReisedokumentAnlageType"/>
+ <xsd:complexType name="ReisedokumentAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Reisedokument-Struktur für Reisedokumentanlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:DokumentGiltBis" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="ReisedokumentAenderung" type="ReisedokumentAenderungType"/>
+ <xsd:complexType name="ReisedokumentAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Reisedokument-Struktur für Änderungen von Reisedokumenten im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityReferenz"/>
+ <xsd:element ref="base:DokumentArt" minOccurs="0"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:DokumentGiltBis" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="DokumentSuchdaten" type="DokumentSuchdatenType"/>
+ <xsd:complexType name="DokumentSuchdatenType">
+ <xsd:annotation>
+ <xsd:documentation>Reisedokument-Struktur für Reisedokumentanlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:DokumentArt" minOccurs="0"/>
+ <xsd:element ref="base:DokumentNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Staatsangehoerigkeit.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Staatsangehoerigkeit.xsd
new file mode 100644
index 00000000..2dcdee66
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Staatsangehoerigkeit.xsd
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Staatsangehoerigkeit.xsd
+Zweck: Definiert Datentypen für die Staatsangehoerigkeiten einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2010-03-15 teo: +GueltigVon, +GueltigBis: Gültigkeitsdatum für Staatsangehörigkeiten
+2004-12-20 tsch: ISOCode3 in StaatsangehoerigkeitErgebnisType optional (für historische Staaten)
+2004-08-04 tsch: StaatsangehoerigkeitAenderungType: EntityReferenz optional (Staatsangeh. kann auch uber ISOCode3 identifiziert werden)
+2004-01-26 tsch: Erstellung
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ xmlns:cio="http://reference.e-government.gv.at/namespace/persondata/de/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+ <xsd:import namespace="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" schemaLocation="../../eingebunden/PersonDataZMR.xsd"/>
+
+ <xsd:complexType name="StaatsangehoerigkeitErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Staatsangehoerigkeit-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="cio:ISOCode3" minOccurs="0"/>
+ <xsd:element ref="cio:StaatsnameDE" minOccurs="1"/>
+ <xsd:element ref="cio:StaatsnameEN" minOccurs="0"/>
+ <xsd:element ref="cio:StaatsnameFR" minOccurs="0"/>
+ <xsd:element name="GueltigVon" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="GueltigBis" type="xsd:date" minOccurs="0"/>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="StaatsangehoerigkeitAnlage" type="StaatsangehoerigkeitAnlageType"/>
+ <xsd:complexType name="StaatsangehoerigkeitAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Staatsangehoerigkeit-Struktur für Anlagen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="cio:ISOCode3"/>
+ <xsd:element name="GueltigVon" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="GueltigBis" type="xsd:date" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="StaatsangehoerigkeitAenderung" type="StaatsangehoerigkeitAenderungType"/>
+ <xsd:complexType name="StaatsangehoerigkeitAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Staatsangehoerigkeit-Struktur für Änderungen im ZMR</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:annotation>
+ <xsd:documentation>
+ Wenn der Schlüssel (EntityID) der Staatsbürgerschaft nicht bekannt ist,
+ kann alternativ der ISO-Code geschickt werden.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:element ref="base:EntityReferenz"/>
+ <xsd:element ref="cio:ISOCode3"/>
+ </xsd:choice>
+ <xsd:element name="GueltigVon" type="xsd:date" minOccurs="0"/>
+ <xsd:element name="GueltigBis" type="xsd:date" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Standarddokument.xsd b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Standarddokument.xsd
new file mode 100644
index 00000000..5b14bcc4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/main/resources/wsdl/zmr_client/xsd/zmr/entities/Standarddokument.xsd
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Name: Standarddokument.xsd
+Zweck: Definiert Datentypen für die Standarddokumente einer Person im ZMR
+Author(s): Tschurtschenthaler Thomas, ZMR-SU
+
+Aenderungshistorie:
+2004-11-03 tsch: Ausstellungsstaat hinzugefügt
+2004-09-29 tsch: Erstellt
+-->
+
+<xsd:schema xmlns="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#"
+ targetNamespace="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#"
+ elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0">
+ <xsd:import namespace="http://bmi.gv.at/namespace/zmr-su/base/20040201#" schemaLocation="../../eingebunden/EingebundenProxy.xsd"/>
+
+ <xsd:complexType name="StandarddokumentErgebnisType">
+ <xsd:annotation>
+ <xsd:documentation>Standarddokument-Struktur für Suchergebnisse</xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:sequence>
+ <xsd:element ref="base:EntityErgebnisReferenz"/>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:EintragungsNummer"/>
+ <xsd:element ref="base:AusstellDatum"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:SterbeDatum" minOccurs="0"/>
+ <xsd:element ref="base:SterbeUhrzeit" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="StandarddokumentAnlage" type="StandarddokumentAnlageType"/>
+ <xsd:complexType name="StandarddokumentAnlageType">
+ <xsd:annotation>
+ <xsd:documentation>Standarddokument-Struktur für Standarddokumentanlagen</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:DokumentArt"/>
+ <xsd:element ref="base:EintragungsNummer"/>
+ <xsd:element ref="base:AusstellDatum"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:SterbeDatum" minOccurs="0"/>
+ <xsd:element ref="base:SterbeUhrzeit" minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:element name="StandarddokumentAenderung" type="StandarddokumentAenderungType"/>
+ <xsd:complexType name="StandarddokumentAenderungType">
+ <xsd:annotation>
+ <xsd:documentation>Standarddokument-Struktur für Änderungen von Standarddokumenten</xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element ref="base:EntityReferenz"/>
+ <xsd:element ref="base:DokumentArt" minOccurs="0"/>
+ <xsd:element ref="base:EintragungsNummer" minOccurs="0"/>
+ <xsd:element ref="base:AusstellDatum" minOccurs="0"/>
+ <xsd:element ref="base:AblaufDatum" minOccurs="0"/>
+ <xsd:element ref="base:AusstellBehoerde" minOccurs="0"/>
+ <xsd:element ref="base:Ausstellungsstaat" minOccurs="0"/>
+ <xsd:element ref="base:SterbeDatum" minOccurs="0"/>
+ <xsd:element ref="base:SterbeUhrzeit" minOccurs="0"/>
+ <xsd:element ref="base:Beendigung"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+</xsd:schema> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java
index 0d9d4fb8..4d4ac47d 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/EidasSignalServletTest.java
@@ -14,7 +14,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
@@ -47,12 +46,10 @@ import eu.eidas.auth.commons.tx.BinaryLightToken;
import eu.eidas.specificcommunication.exception.SpecificCommunicationException;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
"/SpringTest-context_basic_mapConfig.xml"})
-@EnableWebMvc
public class EidasSignalServletTest {
@Autowired private MsConnectorDummyConfigMap basicConfig;
@@ -61,14 +58,14 @@ public class EidasSignalServletTest {
@Autowired private ITransactionStorage transStore;
@Autowired private DummyProtocolAuthService protAuthService;
@Autowired private DummySpecificCommunicationService connector;
-
-
+
+
private MockHttpServletRequest httpReq;
private MockHttpServletResponse httpResp;
private TestRequestImpl pendingReq;
private MsConnectorDummySpConfiguration oaParam;
-
-
+
+
/**
* jUnit test set-up.
*/
@@ -78,7 +75,7 @@ public class EidasSignalServletTest {
httpResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
-
+
final Map<String, String> spConfig = new HashMap<>();
spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");
spConfig.put("target", "urn:publicid:gv.at:cdid+XX");
@@ -92,51 +89,51 @@ public class EidasSignalServletTest {
pendingReq.setAuthUrl("http://test.com/");
pendingReq.setTransactionId("avaasbav");
pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
-
+
connector.setiLightResponse(null);
-
-
+
+
}
-
+
@Test
public void noResponsToken() throws IOException, EaafException {
//set-up
-
+
//execute test
controller.restoreEidasAuthProcess(httpReq, httpResp);
-
+
//validate state
Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
Assert.assertNotNull("missing error", protAuthService.getException());
- Assert.assertEquals("Wrong errorId", "auth.26",
+ Assert.assertEquals("Wrong errorId", "auth.26",
((EaafException) protAuthService.getException()).getErrorId());
-
+
}
-
+
@Test
public void unknownResponseToken() throws IOException, EaafException {
//set-up
- httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
+ httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
RandomStringUtils.randomAlphanumeric(10));
-
+
//execute test
controller.restoreEidasAuthProcess(httpReq, httpResp);
-
+
//validate state
Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
Assert.assertNotNull("missing error", protAuthService.getException());
- Assert.assertEquals("Wrong errorId", "auth.26",
+ Assert.assertEquals("Wrong errorId", "auth.26",
((EaafException) protAuthService.getException()).getErrorId());
-
+
}
-
+
@Test
public void withRelayState() throws IOException, EaafException, SpecificCommunicationException {
- //set-up
- String relayState = RandomStringUtils.randomAlphanumeric(10);
+ //set-up
+ String relayState = RandomStringUtils.randomAlphanumeric(10);
pendingReq.setPendingReqId(relayState);
storage.storePendingRequest(pendingReq);
-
+
Builder iLightResponse = new AuthenticationResponse.Builder();
iLightResponse.id("_".concat(Random.nextHexRandom16()))
.issuer(RandomStringUtils.randomAlphabetic(10))
@@ -145,37 +142,37 @@ public class EidasSignalServletTest {
.inResponseTo("_".concat(Random.nextHexRandom16()))
.subjectNameIdFormat("afaf")
.relayState(relayState);
-
+
AuthenticationResponse eidasResp = iLightResponse.build();
- BinaryLightToken token = connector.putResponse(eidasResp);
- httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
+ BinaryLightToken token = connector.putResponse(eidasResp);
+ httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
Base64.getEncoder().encodeToString(token.getTokenBytes()));
-
+
//execute test
controller.restoreEidasAuthProcess(httpReq, httpResp);
-
-
+
+
//validate state
Assert.assertNotNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
- Assert.assertEquals("wrong eIDAS response", eidasResp,
+ Assert.assertEquals("wrong eIDAS response", eidasResp,
httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
-
- Assert.assertNotNull("missing error", protAuthService.getException());
- Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",
+
+ Assert.assertNotNull("missing error", protAuthService.getException());
+ Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",
((EaafException) protAuthService.getException()).getErrorId());
-
+
}
-
+
@Test
public void withOutRelayStateMissingPendingReq() throws IOException, EaafException, SpecificCommunicationException {
- //set-up
- String pendingReqId = RandomStringUtils.randomAlphanumeric(10);
+ //set-up
+ String pendingReqId = RandomStringUtils.randomAlphanumeric(10);
pendingReq.setPendingReqId(pendingReqId);
storage.storePendingRequest(pendingReq);
-
+
String inResponseTo = "_".concat(Random.nextHexRandom16());
-
+
Builder iLightResponse = new AuthenticationResponse.Builder();
iLightResponse.id("_".concat(Random.nextHexRandom16()))
.issuer(RandomStringUtils.randomAlphabetic(10))
@@ -183,35 +180,35 @@ public class EidasSignalServletTest {
.statusCode(Constants.SUCCESS_URI)
.inResponseTo(inResponseTo)
.subjectNameIdFormat("afaf");
-
+
AuthenticationResponse eidasResp = iLightResponse.build();
- BinaryLightToken token = connector.putResponse(eidasResp);
- httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
+ BinaryLightToken token = connector.putResponse(eidasResp);
+ httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
Base64.getEncoder().encodeToString(token.getTokenBytes()));
-
+
//execute test
controller.restoreEidasAuthProcess(httpReq, httpResp);
-
-
+
+
//validate state
Assert.assertNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
Assert.assertNotNull("missing error", protAuthService.getException());
- Assert.assertEquals("Wrong errorId", "auth.26",
+ Assert.assertEquals("Wrong errorId", "auth.26",
((EaafException) protAuthService.getException()).getErrorId());
-
+
}
-
+
@Test
public void withInResponseToElement() throws IOException, EaafException, SpecificCommunicationException {
- //set-up
- String pendingReqId = RandomStringUtils.randomAlphanumeric(10);
+ //set-up
+ String pendingReqId = RandomStringUtils.randomAlphanumeric(10);
pendingReq.setPendingReqId(pendingReqId);
storage.storePendingRequest(pendingReq);
-
+
String inResponseTo = "_".concat(Random.nextHexRandom16());
transStore.put(inResponseTo, pendingReqId, -1);
-
+
Builder iLightResponse = new AuthenticationResponse.Builder();
iLightResponse.id("_".concat(Random.nextHexRandom16()))
.issuer(RandomStringUtils.randomAlphabetic(10))
@@ -219,26 +216,26 @@ public class EidasSignalServletTest {
.statusCode(Constants.SUCCESS_URI)
.inResponseTo(inResponseTo)
.subjectNameIdFormat("afaf");
-
+
AuthenticationResponse eidasResp = iLightResponse.build();
- BinaryLightToken token = connector.putResponse(eidasResp);
- httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
+ BinaryLightToken token = connector.putResponse(eidasResp);
+ httpReq.setParameter(EidasParameterKeys.TOKEN.toString(),
Base64.getEncoder().encodeToString(token.getTokenBytes()));
-
+
//execute test
controller.restoreEidasAuthProcess(httpReq, httpResp);
-
-
+
+
//validate state
Assert.assertNotNull("eIDAS response", httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
- Assert.assertEquals("wrong eIDAS response", eidasResp,
+ Assert.assertEquals("wrong eIDAS response", eidasResp,
httpReq.getAttribute(Constants.DATA_FULL_EIDAS_RESPONSE));
-
- Assert.assertNotNull("missing error", protAuthService.getException());
- Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",
+
+ Assert.assertNotNull("missing error", protAuthService.getException());
+ Assert.assertEquals("Wrong errorId", "PendingRequest object is not of type 'RequestImpl.class'",
((EaafException) protAuthService.getException()).getErrorId());
-
+
}
-
+
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java
deleted file mode 100644
index 31b05676..00000000
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTestProduction.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright 2018 A-SIT Plus GmbH
- * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
- * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
- *
- * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "License");
- * You may not use this work except in compliance with the License.
- * You may obtain a copy of the License at:
- * https://joinup.ec.europa.eu/news/understanding-eupl-v12
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This product combines work with different licenses. See the "NOTICE" text
- * file for details on the various modules and licenses.
- * The "NOTICE" text file is part of the distribution. Any derivative works
- * that you distribute must include a readable copy of the "NOTICE" text file.
-*/
-
-package at.asitplus.eidas.specific.modules.auth.eidas.v2.test;
-
-import java.io.IOException;
-import java.security.InvalidKeyException;
-import java.security.MessageDigest;
-import java.security.NoSuchProviderException;
-import java.util.List;
-
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.bouncycastle.util.encoders.Base64;
-import org.joda.time.DateTime;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.annotation.IfProfileValue;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.TestPropertySource;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.util.Base64Utils;
-import org.w3c.dom.Element;
-
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;
-import at.gv.e_government.reference.namespace.persondata._20020228.AlternativeNameType;
-import at.gv.e_government.reference.namespace.persondata._20020228.IdentificationType;
-import at.gv.e_government.reference.namespace.persondata._20020228.PersonNameType;
-import at.gv.e_government.reference.namespace.persondata._20020228.PhysicalPersonType;
-import at.gv.egiz.eaaf.core.api.data.EaafConstants;
-import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
-import at.gv.egiz.eaaf.core.api.idp.auth.data.IIdentityLink;
-import at.gv.egiz.eaaf.core.exceptions.EaafBuilderException;
-import at.gv.egiz.eaaf.core.exceptions.EaafParserException;
-import at.gv.egiz.eaaf.core.impl.builder.BpkBuilder;
-import at.gv.egiz.eaaf.core.impl.data.Pair;
-import at.gv.egiz.eaaf.core.impl.data.Triple;
-import at.gv.egiz.eaaf.core.impl.idp.auth.data.SimpleIdentityLinkAssertionParser;
-import szrservices.IdentityLinkType;
-import szrservices.PersonInfoType;
-import szrservices.SZRException_Exception;
-import szrservices.TravelDocumentType;
-
-
-@IfProfileValue(name = "spring.profiles.active", value = "devEnvironment")
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(locations = {
- "/SpringTest-context_tasks_test.xml",
- "/SpringTest-context_basic_realConfig.xml"})
-@TestPropertySource(locations = {
- //"classpath:/application.properties",
- "file:/home/tlenz/Projekte/config/ms_connector/default_config.properties",
- })
-public class SzrClientTestProduction {
- private static final Logger log = LoggerFactory.getLogger(SzrClientTestProduction.class);
-
- @Autowired
- SzrClient szrClient;
- @Autowired
- IConfiguration basicConfig;
-
- private static final String givenName = "Franz";
- private static final String familyName = "Mustermann";
- // private static final String dateOfBirth = "1989-05-05";
- private static final String dateOfBirth = "1989-05-04";
- private static final String eIDASeID = "IS/AT/1234ffgsdfg56789ABCDEF";
-
- private static final String DUMMY_TARGET = EaafConstants.URN_PREFIX_CDID + "ZP";
-
- @Test
- public void dummyTest() {
-
- }
-
- @Test
- public void getVsz() throws SzrCommunicationException, EidasSAuthenticationException {
- String vsz = szrClient.getEncryptedStammzahl(getPersonInfo());
- Assert.assertNotNull("vsz", vsz);
-
- }
-
- @Test
- public void getVszRandom() throws SzrCommunicationException, EidasSAuthenticationException, EaafBuilderException {
-
- final String givenName = "Franz";
- final String familyName = RandomStringUtils.randomAlphabetic(10);
- final String dateOfBirth = "1989-05-04";
- final String eIDASeID = "IS/AT/" + RandomStringUtils.randomAlphanumeric(20);
-
- IdentityLinkType idl = szrClient.getIdentityLinkInRawMode(getPersonInfo(familyName, givenName, dateOfBirth, eIDASeID));
-
- PersonInfoType vszPerson = getPersonInfo(
- idl.getPersonInfo().getPerson().getName().getFamilyName(),
- idl.getPersonInfo().getPerson().getName().getGivenName(),
- idl.getPersonInfo().getPerson().getDateOfBirth(),
- null);
-
- final Pair<String, String> bpkCalc =
- BpkBuilder.generateAreaSpecificPersonIdentifier(
- idl.getPersonInfo().getPerson().getIdentification().getValue(),
- idl.getPersonInfo().getPerson().getIdentification().getType(),
- EaafConstants.URN_PREFIX_CDID + "ZP");
-
- IdentificationType vszId = new IdentificationType();
- vszPerson.getPerson().setIdentification(vszId);
- vszId.setValue(bpkCalc.getFirst());
- vszId.setType(bpkCalc.getSecond());
-
- String vsz = szrClient.getEncryptedStammzahl(vszPerson);
- Assert.assertNotNull("vsz", vsz);
-
- }
-
- @Test
- public void getEidasBind() throws SzrCommunicationException, EidasSAuthenticationException {
- String vsz = RandomStringUtils.randomAlphanumeric(10);
- String bindingPubKey = Base64.toBase64String(RandomStringUtils.random(20).getBytes());
- String eidStatus = "urn:eidgvat:eid.status.eidas";
- ErnbEidData eidData = new ErnbEidData();
- eidData.setFamilyName(familyName);
- eidData.setGivenName(givenName);
- eidData.setDateOfBirth(new DateTime());
- eidData.setCitizenCountryCode("IS");
- eidData.setPseudonym("1234sdgsdfg56789ABCDEF");
-
-
- String eidasBind = szrClient.getEidsaBind(vsz, bindingPubKey, eidStatus, eidData);
-
- Assert.assertNotNull("eidasBind", eidasBind);
-
- }
-
-
- @Test
- public void getIdentityLinkRawMode() throws SZRException_Exception, EaafParserException,
- NoSuchProviderException, IOException, InvalidKeyException, EidasSAuthenticationException {
- log.debug("Starting connecting SZR Gateway");
- final IdentityLinkType result = szrClient.getIdentityLinkInRawMode(
- getPersonInfo());
-
- final Element idlFromSzr = (Element) result.getAssertion();
- final IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser(idlFromSzr).parseIdentityLink();
-
- if (identityLink == null) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO IDL object" });
- }
-
- System.out.println(identityLink.getSerializedSamlAssertion());
-
- if (StringUtils.isEmpty(identityLink.getFamilyName())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO FamilyName from IDL" });
- }
-
- if (StringUtils.isEmpty(identityLink.getGivenName())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO GivenName from IDL" });
- }
-
- if (StringUtils.isEmpty(identityLink.getDateOfBirth())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO DateOfBirthName from IDL" });
- }
-
- if (StringUtils.isEmpty(identityLink.getIdentificationType())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO baseIdType from IDL" });
- }
-
- if (StringUtils.isEmpty(identityLink.getIdentificationValue())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO baseId from IDL" });
- }
-
- if (StringUtils.isEmpty(identityLink.getSerializedSamlAssertion())) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO serialized IDL" });
- }
-
- if (identityLink.getSamlAssertion() == null) {
- throw new SzrCommunicationException("ernb.00", new Object[] { "NO raw IDL" });
- }
-
- }
-
-
- @Ignore
- @Test
- public void getBpkTest() throws SZRException_Exception, EidasSAuthenticationException {
- final List<String> bPK = szrClient.getBpk(getPersonInfo(), DUMMY_TARGET,
- basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ,
- "no VKZ defined"));
-
- if (bPK.isEmpty()) {
- throw new SzrCommunicationException("ernb.01", new Object[]{"bPK list is empty"});
- }
- for (String b : bPK) {
- if (StringUtils.isEmpty(b)) {
- throw new SzrCommunicationException("ernb.01", new Object[]{"bPK is null or empty"});
- }
- }
-
- }
-
- private String createHashFromUniqueId(String uniqueId) throws EidasSAuthenticationException {
- try {
- final MessageDigest md = MessageDigest.getInstance("SHA-256");
- final byte[] hash = md.digest(uniqueId.getBytes("UTF-8"));
- final String hashBase64 = new String(Base64Utils.encode(hash), "UTF-8").replaceAll("\r\n", "");
- return hashBase64;
-
- } catch (final Exception ex) {
- throw new EidasSAuthenticationException("internal.03", new Object[] {}, ex);
-
- }
- }
-
- private PersonInfoType getPersonInfo() throws EidasSAuthenticationException {
- return getPersonInfo(familyName, givenName, dateOfBirth, eIDASeID);
-
- }
-
- private PersonInfoType getPersonInfo(String familyName, String givenName, String dateOfBirth, String eIDASeID)
- throws EidasSAuthenticationException {
- final PersonInfoType personInfo = new PersonInfoType();
- final PersonNameType personName = new PersonNameType();
- final PhysicalPersonType naturalPerson = new PhysicalPersonType();
- final TravelDocumentType eDocument = new TravelDocumentType();
-
- naturalPerson.setName(personName);
- personInfo.setPerson(naturalPerson);
-
- // person information
- personName.setFamilyName(familyName);
- personName.setGivenName(givenName);
- naturalPerson.setDateOfBirth(dateOfBirth);
-
- // parse some eID attributes
- if (eIDASeID != null) {
- final Triple<String, String, String> eIdentifier =
- EidasResponseUtils.parseEidasPersonalIdentifier(eIDASeID);
- final String uniqueId = createHashFromUniqueId(eIdentifier.getThird());
- final String citizenCountry = eIdentifier.getFirst();
-
- eDocument.setIssuingCountry(citizenCountry);
- eDocument.setDocumentNumber(uniqueId);
-
- // eID document information
- eDocument.setDocumentType(basicConfig.getBasicConfiguration(
- Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_EDOCUMENTTYPE,
- Constants.SZR_CONSTANTS_DEFAULT_DOCUMENT_TYPE));
-
- personInfo.setTravelDocument(eDocument);
-
- }
-
- // set place-of-birth
- naturalPerson.setPlaceOfBirth(RandomStringUtils.randomAlphabetic(5));
-
- //set birthname
- final AlternativeNameType alternativeName = new AlternativeNameType();
- naturalPerson.setAlternativeName(alternativeName);
- alternativeName.setFamilyName(RandomStringUtils.randomAlphabetic(5));
-
-
- return personInfo;
-
- }
-}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientProductionTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientProductionTest.java
new file mode 100644
index 00000000..59cf4520
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientProductionTest.java
@@ -0,0 +1,486 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.IfProfileValue;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import lombok.SneakyThrows;
+
+@IfProfileValue(name = "spring.profiles.active", value = "devEnvironment")
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_realConfig.xml"})
+@TestPropertySource(locations = {
+ //"classpath:/application.properties",
+ "file:/home/tlenz/Projekte/config/ms_connector/default_config.properties",
+ })
+public class ErnpRestClientProductionTest {
+
+ //private static final String TEST_PREFIX = "XXX_";
+ private static final String TEST_PREFIX = "";
+
+ @Autowired IErnpClient client;
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierServerError() {
+ String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ personalIdentifierFirst = "";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-00")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode()));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+
+ }
+
+ @Ignore
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("DOPISNÍ")
+ .givenName("DANA")
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ checkErnpResult(resp.getPersonResult().get(0), eidasDataFirst, 1);
+ assertEquals("wrong bpk", "vypyCkyczK7i+cgPWlJasuJphIA=",
+ resp.getPersonResult().get(0).getBpk());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierNoResult() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("DOPISNÍ")
+ .givenName("DANA")
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Ignore
+ @Test
+ @SneakyThrows
+ public void searchWithMdsSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("DOPISNÍ")
+ .givenName("DANA")
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getDateOfBirth(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ checkErnpResult(resp.getPersonResult().get(0), eidasDataFirst, 1);
+ assertEquals("wrong bpk", "vypyCkyczK7i+cgPWlJasuJphIA=",
+ resp.getPersonResult().get(0).getBpk());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsNoResult() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(RandomStringUtils.randomAlphanumeric(10))
+ .givenName(RandomStringUtils.randomAlphanumeric(10))
+ .dateOfBirth("1996-10-15")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getDateOfBirth(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void addTwiceSameMdsAndMdsSearch() {
+ // *** add new random first person ***
+ final String addFirstPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "XZ";
+ final SimpleEidasData addFirstPersonData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .givenName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + addFirstPersonPersonalIdentifier)
+ .pseudonym(addFirstPersonPersonalIdentifier)
+ .build();
+
+ // add entry
+ ErnpRegisterResult addFirstPersonResponse = client.add(addFirstPersonData);
+
+ // verify added entry
+ assertNotNull("no ERnP response", addFirstPersonResponse);
+ assertEquals("wrong resp size", 1, addFirstPersonResponse.getPersonResult().size());
+ checkErnpResult(addFirstPersonResponse.getPersonResult().get(0), addFirstPersonData, 1);
+
+
+ // *** add new random second person with same MDS ***
+ final String addSecondPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final SimpleEidasData addSecondPersonData = addFirstPersonData.toBuilder()
+ .personalIdentifier(cc + "/AT/" + addSecondPersonPersonalIdentifier)
+ .pseudonym(addSecondPersonPersonalIdentifier)
+ .build();
+
+ // add entry
+ ErnpRegisterResult addSecondPersonResponse = client.add(addSecondPersonData);
+
+ // verify added entry
+ assertNotNull("no ERnP response", addSecondPersonResponse);
+ assertEquals("wrong resp size", 1, addSecondPersonResponse.getPersonResult().size());
+ checkErnpResult(addSecondPersonResponse.getPersonResult().get(0), addSecondPersonData, 1);
+
+
+
+ // search with MDS
+ ErnpRegisterResult resp = client.searchWithMds(addFirstPersonData.getGivenName(), addFirstPersonData.getFamilyName(),
+ addFirstPersonData.getDateOfBirth(), cc);
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 2, resp.getPersonResult().size());
+
+ }
+
+
+
+ @Test
+ @SneakyThrows
+ public void addSearchAndPersonalIdUpdate() {
+ // *** add new random entry ***
+
+ final String addPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "DE";
+ final SimpleEidasData addPersonData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .givenName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + addPersonPersonalIdentifier)
+ .pseudonym(addPersonPersonalIdentifier)
+ .birthName(RandomStringUtils.randomAlphabetic(8))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ // add entry
+ ErnpRegisterResult addPersonResponse = client.add(addPersonData);
+
+ // verify added entry
+ assertNotNull("no ERnP response", addPersonResponse);
+ assertEquals("wrong resp size", 1, addPersonResponse.getPersonResult().size());
+ checkErnpResult(addPersonResponse.getPersonResult().get(0), addPersonData, 1);
+
+
+ // *** search entry by countrySpecifics ***
+ final String ccPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ SimpleEidasData ccSpecificData = addPersonData.toBuilder()
+ .personalIdentifier(cc + "/AT/" + ccPersonPersonalIdentifier)
+ .pseudonym(ccPersonPersonalIdentifier)
+ .build();
+ PersonSuchenRequest ccSearchReq =
+ new DeSpecificDetailSearchProcessor().generateSearchRequest(ccSpecificData);
+
+ // search CC specific
+ ErnpRegisterResult ccSearchResponse = client.searchCountrySpecific(ccSearchReq, cc);
+
+ // verify cc specific result
+ assertNotNull("no ERnP response", ccSearchResponse);
+ assertEquals("wrong resp size", 1, ccSearchResponse.getPersonResult().size());
+ RegisterResult ccSearchPersResult = ccSearchResponse.getPersonResult().get(0);
+ checkErnpResult(ccSearchResponse.getPersonResult().get(0), addPersonData, 1);
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(),
+ ccSearchPersResult.getBpk());
+ assertFalse("no PersonalId change detected", ccSpecificData.equalsRegisterData(ccSearchPersResult));
+
+
+ // *** update entry because PersonalId has changed ***
+ // update ERnP entry
+ ErnpRegisterResult updateResponse = client.update(ccSearchPersResult, ccSpecificData);
+ assertNotNull("no ERnP response", updateResponse);
+ assertEquals("wrong resp size", 1, updateResponse.getPersonResult().size());
+ checkErnpResult(updateResponse.getPersonResult().get(0), addPersonData, 2);
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), ccSearchPersResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), ccPersonPersonalIdentifier);
+
+
+
+ // *** search by first personalIdentifier
+ ErnpRegisterResult persIdSearchFirstResp = client.searchWithPersonIdentifier(
+ addPersonPersonalIdentifier, cc);
+ assertNotNull("no ERnP response", persIdSearchFirstResp);
+ assertEquals("wrong resp size", 1, persIdSearchFirstResp.getPersonResult().size());
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), ccSearchPersResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), ccPersonPersonalIdentifier);
+ checkErnpResult(updateResponse.getPersonResult().get(0), addPersonData, 2);
+
+
+
+ // *** search by second personalIdentifier
+ ErnpRegisterResult persIdSearchSecondResp = client.searchWithPersonIdentifier(
+ ccPersonPersonalIdentifier, cc);
+ assertNotNull("no ERnP response", persIdSearchSecondResp);
+ assertEquals("wrong resp size", 1, persIdSearchSecondResp.getPersonResult().size());
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), ccSearchPersResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), ccPersonPersonalIdentifier);
+ checkErnpResult(updateResponse.getPersonResult().get(0), addPersonData, 2);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void addSearchAndMdsUpdate() {
+ // *** add new random entry ***
+
+ final String addPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "DE";
+ final SimpleEidasData addPersonData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .givenName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1985-05-05")
+ .personalIdentifier(cc + "/AT/" + addPersonPersonalIdentifier)
+ .pseudonym(addPersonPersonalIdentifier)
+ .birthName(RandomStringUtils.randomAlphabetic(8))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ // add entry
+ ErnpRegisterResult addPersonResponse = client.add(addPersonData);
+
+ // verify added entry
+ assertNotNull("no ERnP response", addPersonResponse);
+ assertEquals("wrong resp size", 1, addPersonResponse.getPersonResult().size());
+ checkErnpResult(addPersonResponse.getPersonResult().get(0), addPersonData, 1);
+
+
+ // *** search entry by personalId ***
+ SimpleEidasData mdsHasChanged = addPersonData.toBuilder()
+ .givenName(RandomStringUtils.randomAlphanumeric(10))
+ .familyName(RandomStringUtils.randomAlphanumeric(10))
+ .build();
+
+ // search by personalId
+ ErnpRegisterResult personalIdResponse = client.searchWithPersonIdentifier(addPersonPersonalIdentifier, cc);
+
+ // verify personalId result
+ assertNotNull("no ERnP response", personalIdResponse);
+ assertEquals("wrong resp size", 1, personalIdResponse.getPersonResult().size());
+ RegisterResult persIdSearchResult = personalIdResponse.getPersonResult().get(0);
+ checkErnpResult(personalIdResponse.getPersonResult().get(0), addPersonData, 1);
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(),
+ persIdSearchResult.getBpk());
+ assertFalse("no MDS change detected", mdsHasChanged.equalsRegisterData(persIdSearchResult));
+
+
+ // *** update entry because MDS has changed ***
+ // update ERnP entry
+ ErnpRegisterResult updateResponse = client.update(persIdSearchResult, mdsHasChanged);
+ assertNotNull("no ERnP response", updateResponse);
+ assertEquals("wrong resp size", 1, updateResponse.getPersonResult().size());
+ checkErnpResult(updateResponse.getPersonResult().get(0), mdsHasChanged, 1);
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), persIdSearchResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+
+
+ // *** search by first personalIdentifier
+ ErnpRegisterResult persIdSearchFirstResp = client.searchWithPersonIdentifier(
+ addPersonPersonalIdentifier, cc);
+ assertNotNull("no ERnP response", persIdSearchFirstResp);
+ assertEquals("wrong resp size", 1, persIdSearchFirstResp.getPersonResult().size());
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), persIdSearchResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+ checkErnpResult(updateResponse.getPersonResult().get(0), mdsHasChanged, 1);
+
+ // *** search by first personalIdentifier
+ ErnpRegisterResult mdsSearchResp = client.searchWithMds(
+ mdsHasChanged.getGivenName(), mdsHasChanged.getFamilyName(), mdsHasChanged.getDateOfBirth(), cc);
+ assertNotNull("no ERnP response", mdsSearchResp);
+ assertEquals("wrong resp size", 1, mdsSearchResp.getPersonResult().size());
+ assertEquals("wrong bPK", addPersonResponse.getPersonResult().get(0).getBpk(), persIdSearchResult.getBpk());
+ checkPersonalIdentifier(updateResponse.getPersonResult().get(0), addPersonPersonalIdentifier);
+ checkErnpResult(updateResponse.getPersonResult().get(0), mdsHasChanged, 1);
+
+
+
+ }
+
+
+ @Ignore
+ @Test
+ @SneakyThrows
+ public void addErnpEntry() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("DOPISNÍ")
+ .givenName("DANA")
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.add(eidasDataFirst);
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ checkErnpResult(resp.getPersonResult().get(0), eidasDataFirst, 1);
+
+ }
+
+ @Ignore
+ @Test
+ @SneakyThrows
+ public void addErnpEntryE2ETest() {
+ final String personalIdentifierFirst = "adfasfsadvsafsafweqrwr432553324";
+ final String cc = "EE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("Mustermatch01")
+ .givenName("Max")
+ .dateOfBirth("1965-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.add(eidasDataFirst);
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ checkErnpResult(resp.getPersonResult().get(0), eidasDataFirst, 1);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void addRandomErnpEntry() {
+ final String addPersonPersonalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "XZ";
+ final SimpleEidasData addPersonData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .givenName(TEST_PREFIX + RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1985-05-05")
+ .personalIdentifier(cc + "/AT/" + addPersonPersonalIdentifier)
+ .pseudonym(addPersonPersonalIdentifier)
+ .birthName(RandomStringUtils.randomAlphabetic(8))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ // add entry
+ ErnpRegisterResult addPersonResponse = client.add(addPersonData);
+
+ // verify added entry
+ assertNotNull("no ERnP response", addPersonResponse);
+ assertEquals("wrong resp size", 1, addPersonResponse.getPersonResult().size());
+ checkErnpResult(addPersonResponse.getPersonResult().get(0), addPersonData, 1);
+
+ }
+
+
+ private void checkErnpResult(RegisterResult registerResult, final SimpleEidasData eidasData, int numOfPseudonyms) {
+ assertEquals("wrong familyname", eidasData.getFamilyName(), registerResult.getFamilyName());
+ assertEquals("wrong givenname", eidasData.getGivenName(), registerResult.getGivenName());
+ assertEquals("wrong birthday", eidasData.getDateOfBirth(), registerResult.getDateOfBirth());
+ assertEquals("wrong personalId size", numOfPseudonyms, registerResult.getPseudonym().size());
+ assertEquals("wrong placeOfBirth", eidasData.getPlaceOfBirth(), registerResult.getPlaceOfBirth());
+ assertEquals("wrong birthName", eidasData.getBirthName(), registerResult.getBirthName());
+ assertTrue("no bPK", StringUtils.isNotEmpty(registerResult.getBpk()));
+ checkPersonalIdentifier(registerResult, eidasData.getPseudonym());
+
+ }
+
+ private void checkPersonalIdentifier(RegisterResult registerResult, String pseudonym) {
+ assertTrue("wrong or no personalId", registerResult.getPseudonym().stream()
+ .filter(el -> pseudonym.equals(el))
+ .findFirst()
+ .isPresent());
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientTest.java
new file mode 100644
index 00000000..a9e10de6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ErnpRestClientTest.java
@@ -0,0 +1,1085 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+
+import java.net.HttpURLConnection;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor;
+import at.gv.egiz.eaaf.core.impl.utils.TransactionIdUtils;
+import lombok.SneakyThrows;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+import okhttp3.mockwebserver.RecordedRequest;
+import okhttp3.mockwebserver.SocketPolicy;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml" })
+@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
+public class ErnpRestClientTest {
+
+ @Autowired MsConnectorDummyConfigMap basicConfig;
+ @Autowired IErnpClient client;
+
+ private static ObjectMapper mapper = new ObjectMapper();
+ private static MockWebServer mockWebServer;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ @SneakyThrows
+ public static void classInitializer() {
+ mockWebServer = new MockWebServer();
+ mockWebServer.start(1718);
+
+ }
+
+ @AfterClass
+ @SneakyThrows
+ public static void resetTestEnviroment() {
+ mockWebServer.shutdown();
+
+ }
+
+ /**
+ * jUnit test initializer.
+ *
+ * @throws InterruptedException in case of an error
+ */
+ @Before
+ public void initialize() throws InterruptedException {
+ mockWebServer.takeRequest(2, TimeUnit.MILLISECONDS);
+ TransactionIdUtils.setTransactionId(UUID.randomUUID().toString());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierServerError() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(500)
+ .setBody("Internal error"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode()));
+
+ mockWebServer.takeRequest();
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/ernp_handbook_example.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchResidence() {
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithResidenceData(null, null, null, null, null, null);
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsNoResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ mockWebServer.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.NO_RESPONSE)
+ .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(), eidasDataFirst.getDateOfBirth(), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsErrorResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(400)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/error_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(), eidasDataFirst.getDateOfBirth(), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsNoResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/ernp_empty_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(), eidasDataFirst.getDateOfBirth(), cc);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "Searching with MDS only");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkJsonElement(person, "familienname", eidasDataFirst.getFamilyName());
+ checkJsonElement(person, "vorname", eidasDataFirst.getGivenName());
+ checkPersonDateOfBirth(person, eidasDataFirst.getDateOfBirth());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsSingleResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/3_search_with_mds_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(), eidasDataFirst.getDateOfBirth(), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "DOPISNÍ", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "DANA", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1996-01-01", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "vypyCkyczK7i+cgPWlJasuJphIA=", persInfo.getBpk());
+ assertEquals("wrong pseudonym", "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", persInfo.getPseudonym().get(0));
+ assertNull("placeOfBirth", persInfo.getPlaceOfBirth());
+ assertNull("birthName", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsMultiResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/4_search_with_mds_multi_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithMds(eidasDataFirst.getGivenName(), eidasDataFirst.getFamilyName(), eidasDataFirst.getDateOfBirth(), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 2, resp.getPersonResult().size());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdNoResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ mockWebServer.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.NO_RESPONSE)
+ .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdErrorResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(400)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/error_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdNoResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/ernp_empty_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "Searching PersonIdentifier");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkEidasDocument(person, "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasDataFirst.getPseudonym());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdSingleResult() {
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_search_with_personalId_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "CtKKrtUe", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "dUeYzUFg", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1985-05-05", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "+OQnljn0Son1W2rkM73nP/VMsvc=", persInfo.getBpk());
+ assertEquals("wrong pseudonym", "Y8ADWaeh0h", persInfo.getPseudonym().get(0));
+ assertEquals("wrong placeOfBirth", "hrFevCfP", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "sNUEAhEr", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdSingleResultCountryNoMatch() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_search_with_personalId_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "CtKKrtUe", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "dUeYzUFg", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1985-05-05", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "+OQnljn0Son1W2rkM73nP/VMsvc=", persInfo.getBpk());
+ assertTrue("pseudonym", persInfo.getPseudonym().isEmpty());
+ assertNull("placeOfBirth", persInfo.getPlaceOfBirth());
+ assertNull("birthName", persInfo.getBirthName());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdMultiResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/4_search_with_mds_multi_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(eidasDataFirst.getPseudonym(), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsNoResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ mockWebServer.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.NO_RESPONSE)
+ .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchCountrySpecific(new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsErrorResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(400)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/error_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchCountrySpecific(new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsNoResult() {
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc).toBuilder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/ernp_empty_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchCountrySpecific(
+ new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "Searching DE specific");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkJsonElement(person, "familienname", eidasDataFirst.getFamilyName());
+ checkJsonElement(person, "vorname", eidasDataFirst.getGivenName());
+ checkPersonDateOfBirth(person, eidasDataFirst.getDateOfBirth());
+ checkEidasDocument(person, "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc, eidasDataFirst.getPlaceOfBirth());
+ checkEidasDocument(person, "http://eidas.europa.eu/attributes/naturalperson/BirthName", cc, eidasDataFirst.getBirthName());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsSingleResult() {
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_search_with_personalId_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchCountrySpecific(
+ new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "CtKKrtUe", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "dUeYzUFg", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1985-05-05", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "+OQnljn0Son1W2rkM73nP/VMsvc=", persInfo.getBpk());
+ assertEquals("wrong pseudonym", "Y8ADWaeh0h", persInfo.getPseudonym().get(0));
+ assertEquals("wrong placeOfBirth", "hrFevCfP", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "sNUEAhEr", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsSingleResultCountryNoMatch() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_search_with_personalId_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ ErnpRegisterResult resp = client.searchCountrySpecific(
+ new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc);
+
+ // validate state
+ mockWebServer.takeRequest();
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "CtKKrtUe", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "dUeYzUFg", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1985-05-05", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "+OQnljn0Son1W2rkM73nP/VMsvc=", persInfo.getBpk());
+ assertTrue("pseudonym", persInfo.getPseudonym().isEmpty());
+ assertNull("placeOfBirth", persInfo.getPlaceOfBirth());
+ assertNull("birthName", persInfo.getBirthName());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void searchWithCcspecificsMultiResult() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/4_search_with_mds_multi_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchCountrySpecific(new DeSpecificDetailSearchProcessor().generateSearchRequest(eidasDataFirst), cc));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void addPersonNoResponse() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ mockWebServer.enqueue(new MockResponse()
+ .setSocketPolicy(SocketPolicy.NO_RESPONSE)
+ .setResponseCode(HttpURLConnection.HTTP_NO_CONTENT));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.add(eidasDataFirst));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.11", error.getErrorId());
+ mockWebServer.takeRequest();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void addPersonSimpleSuccess() {
+ final String cc = "CZ";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc);
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_add_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ // execute operation
+ ErnpRegisterResult resp = client.add(eidasDataFirst);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkJsonElement(reqJson, "begruendung", "Add new person");
+ JsonNode person = getJsonObject(reqJson, "personendaten");
+ checkJsonElement(person, "familienname", eidasDataFirst.getFamilyName());
+ checkJsonElement(person, "vorname", eidasDataFirst.getGivenName());
+ checkPersonDateOfBirth(person, eidasDataFirst.getDateOfBirth());
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasDataFirst.getPseudonym());
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc);
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/BirthName", cc);
+
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "mRjMKAQc", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "vdqZZIaA", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1996-01-01", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "TBGoMlirU881e2jMGETa9WLx1+A=", persInfo.getBpk());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void addPersonSimpleComplexe() {
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc).toBuilder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_add_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute operation
+ // execute operation
+ ErnpRegisterResult resp = client.add(eidasDataFirst);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkJsonElement(reqJson, "begruendung", "Add new person");
+ JsonNode person = getJsonObject(reqJson, "personendaten");
+ checkJsonElement(person, "familienname", eidasDataFirst.getFamilyName());
+ checkJsonElement(person, "vorname", eidasDataFirst.getGivenName());
+ checkPersonDateOfBirth(person, eidasDataFirst.getDateOfBirth());
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasDataFirst.getPseudonym());
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc, eidasDataFirst.getPlaceOfBirth());
+ checkEidasDocument(reqJson, "http://eidas.europa.eu/attributes/naturalperson/BirthName", cc, eidasDataFirst.getBirthName());
+
+ // validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", "mRjMKAQc", persInfo.getFamilyName());
+ assertEquals("wrong givenName", "vdqZZIaA", persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", "1996-01-01", persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", "TBGoMlirU881e2jMGETa9WLx1+A=", persInfo.getBpk());
+ assertEquals("wrong pseudonym", "88hvWzUaIX", persInfo.getPseudonym().get(0));
+ assertEquals("wrong placeOfBirth", "VRNCAylF", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "miEklFHC", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateNoLatestVersion() {
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = generateRandomEidasData(cc).toBuilder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/ernp_empty_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ RegisterResult ernpResult = RegisterResult.builder()
+ .familyName(eidasDataFirst.getFamilyName())
+ .givenName(eidasDataFirst.getGivenName())
+ .dateOfBirth(eidasDataFirst.getDateOfBirth())
+ .bpk("")
+ .pseudonym(Arrays.asList(eidasDataFirst.getPseudonym()))
+ .build();
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.update(ernpResult, eidasDataFirst));
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ mockWebServer.takeRequest();
+
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void updateNoUpdateRequired() {
+ final String cc = "DE";
+ final String personalIdentifierFirst = "Y8ADWaeh0h";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("CtKKrtUe")
+ .givenName("dUeYzUFg")
+ .dateOfBirth("1985-05-05")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_kitt_search_latest_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ RegisterResult ernpResult = RegisterResult.builder()
+ .familyName(eidasDataFirst.getFamilyName())
+ .givenName(eidasDataFirst.getGivenName())
+ .dateOfBirth(eidasDataFirst.getDateOfBirth())
+ .bpk("+OQnljn0Son1W2rkM73nP/VMsvc=")
+ .pseudonym(Arrays.asList(eidasDataFirst.getPseudonym()))
+ .birthName("sNUEAhEr")
+ .placeOfBirth("hrFevCfP")
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.update(ernpResult, eidasDataFirst);
+
+ // validate request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "KITT get-latest-version");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkJsonElement(person, "familienname", ernpResult.getFamilyName());
+ checkJsonElement(person, "vorname", ernpResult.getGivenName());
+ checkJsonElement(person, "bpkZp", ernpResult.getBpk());
+ checkPersonDateOfBirth(person, ernpResult.getDateOfBirth());
+
+ //validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", ernpResult.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("wrong givenName", ernpResult.getGivenName(), persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", ernpResult.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", ernpResult.getBpk(), persInfo.getBpk());
+ assertEquals("wrong pseudonym", ernpResult.getPseudonym().get(0), persInfo.getPseudonym().get(0));
+ assertEquals("wrong placeOfBirth", "hrFevCfP", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "sNUEAhEr", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateUpdateRequiredMds() {
+ final String cc = "DE";
+ final String personalIdentifierFirst = "Y8ADWaeh0h";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("mVzTMpig6r")
+ .givenName("Jb2vj1Xpql")
+ .dateOfBirth("1985-05-05")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .placeOfBirth("hrFevCfP")
+ .birthName("sNUEAhEr")
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_kitt_search_latest_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/1_kitt_update_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ RegisterResult ernpResult = RegisterResult.builder()
+ .familyName("CtKKrtUe")
+ .givenName("dUeYzUFg")
+ .dateOfBirth("1985-05-05")
+ .bpk("+OQnljn0Son1W2rkM73nP/VMsvc=")
+ .pseudonym(Arrays.asList("Y8ADWaeh0h"))
+ .birthName("sNUEAhEr")
+ .placeOfBirth("hrFevCfP")
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.update(ernpResult, eidasDataFirst);
+
+ // validate request
+ // check get-latest-version request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "KITT get-latest-version");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkJsonElement(person, "familienname", ernpResult.getFamilyName());
+ checkJsonElement(person, "vorname", ernpResult.getGivenName());
+ checkJsonElement(person, "bpkZp", ernpResult.getBpk());
+ checkPersonDateOfBirth(person, ernpResult.getDateOfBirth());
+
+ // check update request
+ final RecordedRequest requestKitt = mockWebServer.takeRequest();
+ String reqBodyKitt = requestKitt.getBody().readUtf8();
+ assertFalse("no request body", reqBodyKitt.isEmpty());
+ JsonNode reqJsonKitt = mapper.readTree(reqBodyKitt);
+ checkJsonElement(reqJsonKitt, "begruendung", "KITT update dataset");
+ checkJsonElement(reqJsonKitt, "entityId", "1933000000000475");
+ checkJsonElement(reqJsonKitt, "version", "2022-03-03T10:07:28.885Z");
+ JsonNode personChange = getJsonObject(reqJsonKitt, "aendern");
+ JsonNode personKitt = getJsonObject(personChange, "personendaten");
+ checkJsonElement(personKitt, "familienname", eidasDataFirst.getFamilyName());
+ checkJsonElement(personKitt, "vorname", eidasDataFirst.getGivenName());
+ checkPersonDateOfBirth(personKitt, eidasDataFirst.getDateOfBirth());
+
+ assertFalse("find 'aendern' element", reqJsonKitt.has("anlegen"));
+ assertFalse("find 'aendern' element", personChange.has("eidas"));
+
+
+ //validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("wrong givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", ernpResult.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", ernpResult.getBpk(), persInfo.getBpk());
+ assertEquals("wrong pseudonym", ernpResult.getPseudonym().get(0), persInfo.getPseudonym().get(0));
+ assertEquals("wrong placeOfBirth", "hrFevCfP", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "sNUEAhEr", persInfo.getBirthName());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateUpdateRequiredEidasDocs() {
+ final String cc = "DE";
+ final String personalIdentifierFirst = "nj1m79jm9z";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("mRjMKAQc")
+ .givenName("vdqZZIaA")
+ .dateOfBirth("1996-01-01")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .birthName(RandomStringUtils.randomAlphabetic(10))
+ .build();
+
+ // set ERnP response
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_kitt_search_latest_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_kitt_update_resp.json"),
+ "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ RegisterResult ernpResult = RegisterResult.builder()
+ .familyName("mRjMKAQc")
+ .givenName("vdqZZIaA")
+ .dateOfBirth("1996-01-01")
+ .bpk("TBGoMlirU881e2jMGETa9WLx1+A=")
+ .pseudonym(Arrays.asList("88hvWzUaIX"))
+ .birthName("VRNCAylF")
+ .placeOfBirth("miEklFHC")
+ .build();
+
+ // execute operation
+ ErnpRegisterResult resp = client.update(ernpResult, eidasDataFirst);
+
+ // validate request
+ // check get-latest-version request
+ final RecordedRequest request = mockWebServer.takeRequest();
+ String reqBody = request.getBody().readUtf8();
+ assertFalse("no request body", reqBody.isEmpty());
+ JsonNode reqJson = mapper.readTree(reqBody);
+ checkSearchOptions(reqJson, "KITT get-latest-version");
+ JsonNode person = getJsonObject(reqJson, "suchdaten");
+ checkJsonElement(person, "familienname", ernpResult.getFamilyName());
+ checkJsonElement(person, "vorname", ernpResult.getGivenName());
+ checkJsonElement(person, "bpkZp", ernpResult.getBpk());
+ checkPersonDateOfBirth(person, ernpResult.getDateOfBirth());
+
+ // check update request
+ final RecordedRequest requestKitt = mockWebServer.takeRequest();
+ String reqBodyKitt = requestKitt.getBody().readUtf8();
+ assertFalse("no request body", reqBodyKitt.isEmpty());
+ JsonNode reqJsonKitt = mapper.readTree(reqBodyKitt);
+ checkJsonElement(reqJsonKitt, "begruendung", "KITT update dataset");
+ checkJsonElement(reqJsonKitt, "entityId", "1933000000000498");
+ checkJsonElement(reqJsonKitt, "version", "2022-03-03T10:14:59.712Z");
+ JsonNode personChange = getJsonObject(reqJsonKitt, "anlegen");
+ checkEidasDocument(personChange, "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasDataFirst.getPseudonym());
+ assertFalse("find 'aendern' element", reqJsonKitt.has("aendern"));
+
+ //validate state
+ assertNotNull("no ERnP response", resp);
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("wrong familyname", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("wrong givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("wrong dateOfBirth", ernpResult.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("wrong bpk", ernpResult.getBpk(), persInfo.getBpk());
+ assertEquals("wrong pseudonym", ernpResult.getPseudonym().get(0), persInfo.getPseudonym().get(0));
+ assertEquals("wrong pseudonym", eidasDataFirst.getPseudonym(), persInfo.getPseudonym().get(1));
+ assertEquals("wrong placeOfBirth", "VRNCAylF", persInfo.getPlaceOfBirth());
+ assertEquals("wrong birthName", "miEklFHC", persInfo.getBirthName());
+
+ }
+
+
+ private SimpleEidasData generateRandomEidasData(String cc) {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ return SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName(RandomStringUtils.randomAlphanumeric(10))
+ .givenName(RandomStringUtils.randomAlphanumeric(10))
+ .dateOfBirth("1996-10-15")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ }
+
+ private void checkEidasDocument(JsonNode person, String art, String cc, String expected) {
+ assertTrue("no element: eidas", person.has("eidas"));
+ assertTrue("wrong type element: eidas", person.get("eidas").isArray());
+
+ boolean found = false;
+ Iterator<JsonNode> docs = person.get("eidas").elements();
+ while (docs.hasNext() && !found) {
+ JsonNode el = docs.next();
+ assertTrue("art", el.has("art"));
+ assertTrue("wert", el.has("wert"));
+ assertTrue("cc", el.has("staatscode2"));
+ found = art.equals(el.get("art").asText()) && cc.equals(el.get("staatscode2").asText())
+ && expected.equals(el.get("wert").asText());
+
+ }
+ assertTrue("Missing eidas document", found);
+
+ }
+
+ private void checkEidasDocument(JsonNode person, String art, String cc) {
+ assertTrue("no element: eidas", person.has("eidas"));
+ assertTrue("wrong type element: eidas", person.get("eidas").isArray());
+
+ boolean found = false;
+ Iterator<JsonNode> docs = person.get("eidas").elements();
+ while (docs.hasNext() && !found) {
+ JsonNode el = docs.next();
+ assertTrue("art", el.has("art"));
+ assertTrue("wert", el.has("wert"));
+ assertTrue("cc", el.has("staatscode2"));
+ found = art.equals(el.get("art").asText()) && cc.equals(el.get("staatscode2").asText());
+
+ }
+ assertFalse("Missing eidas document", found);
+
+ }
+
+ private void checkPersonDateOfBirth(JsonNode person, String dateOfBirth) {
+ JsonNode birthDay = getJsonObject(person, "geburtsdatum");
+ String[] el = dateOfBirth.split("-");
+ checkJsonElement(birthDay, "jahr", Integer.parseInt(el[0]));
+ checkJsonElement(birthDay, "monat", Integer.parseInt(el[1]));
+ checkJsonElement(birthDay, "tag", Integer.parseInt(el[2]));
+
+ }
+
+ private void checkSearchOptions(JsonNode json, String reason) {
+ checkJsonElement(json, "begruendung", reason);
+ JsonNode options = getJsonObject(json, "suchoptionen");
+ checkJsonElement(options, "historisch", "AktuellUndHistorisch");
+ checkJsonElement(options, "sucheMitNamensteilen", false);
+ checkJsonElement(options, "suchwizard", false);
+ checkJsonElement(options, "zmr", false);
+
+ }
+
+ private JsonNode getJsonObject(JsonNode json, String key) {
+ assertTrue("no element: " + key, json.has(key));
+ assertTrue("wrong type element: " + key, json.get(key).isObject());
+ return json.get(key);
+
+ }
+
+ private void checkJsonElement(JsonNode json, String key, int expected) {
+ assertTrue("no element: " + key, json.has(key));
+ assertTrue("wong element-type: " + key, json.get(key).isInt());
+ assertEquals("wong element-value: " + key, expected, json.get(key).asInt());
+
+ }
+
+ private void checkJsonElement(JsonNode json, String key, String expected) {
+ assertTrue("no element: " + key, json.has(key));
+ assertTrue("wong element-type: " + key, json.get(key).isTextual());
+ assertEquals("wong element-value: " + key, expected, json.get(key).asText());
+
+ }
+
+ private void checkJsonElement(JsonNode json, String key, boolean expected) {
+ assertTrue("no element: " + key, json.has(key));
+ assertTrue("wong element-type: " + key, json.get(key).isBoolean());
+ assertEquals("wong element-value: " + key, expected, json.get(key).asBoolean());
+
+ }
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientProductionTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientProductionTest.java
new file mode 100644
index 00000000..d2bfe662
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientProductionTest.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2018 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+*/
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.util.encoders.Base64;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.IfProfileValue;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr.SzrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+
+
+@IfProfileValue(name = "spring.profiles.active", value = "devEnvironment")
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_realConfig.xml"})
+@TestPropertySource(locations = {
+ //"classpath:/application.properties",
+ "file:/home/tlenz/Projekte/config/ms_connector/default_config.properties",
+ })
+public class SzrClientProductionTest {
+ private static final Logger log = LoggerFactory.getLogger(SzrClientProductionTest.class);
+
+ @Autowired
+ SzrClient szrClient;
+ @Autowired
+ IConfiguration basicConfig;
+
+ private static final String DUMMY_TARGET = EaafConstants.URN_PREFIX_CDID + "ZP";
+
+ @Test
+ public void dummyTest() {
+
+ }
+
+
+ @Ignore
+ @Test
+ public void getEncBaseId() throws SzrCommunicationException {
+
+ MatchedPersonResult matchingResult = MatchedPersonResult.builder()
+ .bpk("QusNG6WEct/vkD1aoRfxHod0Dtk=")
+ .familyName("Garcia")
+ .givenName("javier")
+ .dateOfBirth("1964-12-31")
+ .build();
+
+
+ String baseId = szrClient.getEncryptedStammzahl(matchingResult);
+
+
+ assertNotNull("not encrypted baseId", baseId);
+
+ }
+
+
+ @Test
+ public void getEidasBind() throws EidasSAuthenticationException {
+ String vsz = RandomStringUtils.randomAlphanumeric(10);
+ String bindingPubKey = Base64.toBase64String(RandomStringUtils.random(20).getBytes());
+ String eidStatus = "urn:eidgvat:eid.status.eidas";
+
+ String eidasBind = szrClient.getEidasBind(vsz, bindingPubKey, eidStatus, getEidData());
+
+ Assert.assertNotNull("eidasBind", eidasBind);
+
+ }
+
+ @Ignore
+ @Test
+ public void getBpkTest() throws EidasSAuthenticationException {
+ String vkz = basicConfig.getBasicConfiguration(
+ Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined");
+ final List<String> bPK = szrClient.getBpk(getEidData(), DUMMY_TARGET, vkz);
+
+ if (bPK.isEmpty()) {
+ throw new SzrCommunicationException("ernb.01", new Object[]{"bPK list is empty"});
+ }
+ for (String b : bPK) {
+ if (StringUtils.isEmpty(b)) {
+ throw new SzrCommunicationException("ernb.01", new Object[]{"bPK is null or empty"});
+ }
+ }
+
+ }
+
+ private SimpleEidasData getEidData() {
+ return SimpleEidasData.builder()
+ .familyName("Mustermann")
+ .givenName("Franz")
+ .dateOfBirth("1989-05-04")
+ .citizenCountryCode("IS")
+ .pseudonym("1234ffgsdfg56789ABCDEF")
+ .build();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientTest.java
index 4d9ae035..e61532a3 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/SzrClientTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/SzrClientTest.java
@@ -21,100 +21,71 @@
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
-package at.asitplus.eidas.specific.modules.auth.eidas.v2.test;
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.when;
import java.io.IOException;
-import java.security.InvalidKeyException;
-import java.security.MessageDigest;
-import java.security.NoSuchProviderException;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.ws.soap.SOAPFaultException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.cxf.binding.soap.SoapFault;
-import org.joda.time.DateTime;
-import org.jose4j.lang.JoseException;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.util.Base64Utils;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.skjolber.mockito.soap.SoapServiceRule;
import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.szr.SzrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;
-import at.gv.e_government.reference.namespace.persondata._20020228.PersonNameType;
-import at.gv.e_government.reference.namespace.persondata._20020228.PhysicalPersonType;
import at.gv.egiz.eaaf.core.api.data.EaafConstants;
-import at.gv.egiz.eaaf.core.api.idp.auth.data.IIdentityLink;
-import at.gv.egiz.eaaf.core.exceptions.EaafParserException;
-import at.gv.egiz.eaaf.core.impl.data.Triple;
-import at.gv.egiz.eaaf.core.impl.idp.auth.data.SimpleIdentityLinkAssertionParser;
import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
-import szrservices.GetBPKFromStammzahlEncryptedResponse;
-import szrservices.GetBPKFromStammzahlEncryptedResponseType;
+import lombok.extern.slf4j.Slf4j;
import szrservices.GetIdentityLinkEidasResponse;
-import szrservices.IdentityLinkType;
import szrservices.PersonInfoType;
import szrservices.SZR;
import szrservices.SZRException_Exception;
import szrservices.SignContentEntry;
import szrservices.SignContentResponse;
import szrservices.SignContentResponseType;
-import szrservices.TravelDocumentType;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
"/SpringTest-context_basic_mapConfig.xml"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
+@Slf4j
public class SzrClientTest {
- private static final Logger log = LoggerFactory.getLogger(SzrClientTest.class);
@Autowired SzrClient szrClient;
@Autowired MsConnectorDummyConfigMap basicConfig;
- private static ObjectMapper mapper = new ObjectMapper();
-
- private static final String givenName = "Franz";
- private static final String familyName = "Mustermann";
- private static final String dateOfBirth = "1989-05-05";
- private static final String eIDASeID = "IS/AT/1234sdgsdfg56789ABCDEF";
private static final String DUMMY_TARGET = EaafConstants.URN_PREFIX_CDID + "ZP";
private SZR szrMock = null;
- ErnbEidData eidData = null;
@Rule
public SoapServiceRule soap = SoapServiceRule.newInstance();
@@ -126,45 +97,10 @@ public class SzrClientTest {
public void initializer() {
if (szrMock == null) {
szrMock = soap.mock(SZR.class, "http://localhost:1234/demoszr");
-
}
-
- eidData = new ErnbEidData();
- eidData.setFamilyName(familyName);
- eidData.setGivenName(givenName);
- eidData.setDateOfBirth(new DateTime());
- eidData.setCitizenCountryCode("IS");
- eidData.setPseudonym("1234sdgsdfg56789ABCDEF");
-
- basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.eidasbind.mds.inject", "false");
-
- }
-
-
-
-
- @Test
- public void getStammzahlenEcryptedTest() throws JAXBException, SZRException_Exception, SzrCommunicationException {
- final GetBPKFromStammzahlEncryptedResponse szrResponse = new GetBPKFromStammzahlEncryptedResponse();
- final GetBPKFromStammzahlEncryptedResponseType result1 = new GetBPKFromStammzahlEncryptedResponseType();
- szrResponse.getOut().add(result1);
- result1.setKey(RandomStringUtils.randomAlphanumeric(20));
-
- // when(szrMock.getBPKFromStammzahlEncrypted(anyList()))
- // .thenReturn(Arrays.asList(result1));
- when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(result1.getKey());
-
- String stammzahlEncrypted = szrClient.getEncryptedStammzahl(new PersonInfoType());
-
- Assert.assertEquals("bcBind not match", result1.getKey(), stammzahlEncrypted);
-
- when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(null);
- try {
- stammzahlEncrypted = szrClient.getEncryptedStammzahl(new PersonInfoType());
- } catch (SzrCommunicationException e) {
- Assert.assertTrue("Not correct error", e.getMessage().contains("ernb.01"));
- }
+ basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.eidasbind.mds.inject", "false");
+
}
@Test
@@ -181,45 +117,45 @@ public class SzrClientTest {
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(content);
final String bcBind = szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
Assert.assertNotNull("bcBind is null", bcBind);
Assert.assertEquals("bcBind not match", result1.getValue(), bcBind);
-
+
}
@Test
public void eidasBindNull() throws SZRException_Exception {
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(null);
-
- try {
+
+ try {
szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
} catch (SzrCommunicationException e) {
Assert.assertTrue("Not correct error", e.getMessage().contains("ernb.01"));
-
- }
+
+ }
}
-
+
@Test
public void eidasBindInvalidResponse() throws SZRException_Exception {
final SignContentEntry result2 = new SignContentEntry();
final SignContentResponseType content1 = new SignContentResponseType();
content1.getOut().add(result2);
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(content1);
-
+
try {
szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
} catch (SzrCommunicationException e) {
Assert.assertTrue("Not correct error", e.getMessage().contains("ernb.01"));
-
+
}
}
-
+
public void eidasBindEmptyResponse() throws SZRException_Exception {
final SignContentEntry result2 = new SignContentEntry();
final SignContentResponseType content1 = new SignContentResponseType();
@@ -227,20 +163,19 @@ public class SzrClientTest {
result2.setKey("bcBindReq");
result2.setValue("");
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(content1);
-
+
try {
szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
} catch (SzrCommunicationException e) {
Assert.assertTrue("Not correct error", e.getMessage().contains("ernb.01"));
-
- }
+
+ }
}
-
+
@Test
- public void eidasBindValid() throws SZRException_Exception, SzrCommunicationException, JsonMappingException,
- JsonProcessingException, JoseException {
+ public void eidasBindValid() throws SZRException_Exception, SzrCommunicationException {
final SignContentResponse szrResponse = new SignContentResponse();
final SignContentEntry result1 = new SignContentEntry();
final SignContentResponseType content = new SignContentResponseType();
@@ -253,19 +188,18 @@ public class SzrClientTest {
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(content);
final String bcBind = szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
Assert.assertNotNull("bcBind is null", bcBind);
Assert.assertEquals("bcBind not match", result1.getValue(), bcBind);
-
+
}
@Test
- public void eidasBindValidWithMds() throws SZRException_Exception, SzrCommunicationException, JoseException,
- JsonMappingException, JsonProcessingException {
+ public void eidasBindValidWithMds() throws SZRException_Exception, SzrCommunicationException {
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.eidasbind.mds.inject", "true");
-
+
final SignContentResponse szrResponse = new SignContentResponse();
final SignContentEntry result1 = new SignContentEntry();
final SignContentResponseType content = new SignContentResponseType();
@@ -278,77 +212,18 @@ public class SzrClientTest {
when(szrMock.signContent(any(), anyList(), anyList())).thenReturn(content);
final String bcBind = szrClient
- .getEidsaBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
- RandomStringUtils.randomAlphabetic(10), eidData);
+ .getEidasBind(RandomStringUtils.randomAlphabetic(10), RandomStringUtils.randomAlphabetic(10),
+ RandomStringUtils.randomAlphabetic(10), getEidData());
Assert.assertNotNull("bcBind is null", bcBind);
Assert.assertEquals("bcBind not match", result1.getValue(), bcBind);
}
-
- @Test
- public void getIdentityLinkRawModeValidResponse()
- throws SZRException_Exception, EaafParserException, NoSuchProviderException, IOException, InvalidKeyException,
- EidasSAuthenticationException, JAXBException {
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
-
- try {
- log.debug("Starting connecting SZR Gateway");
- final IdentityLinkType result = szrClient.getIdentityLinkInRawMode(getPersonInfo());
-
- Assert.assertNotNull(result);
- Assert.assertNotNull(result.getAssertion());
-
- final IIdentityLink identityLink = new SimpleIdentityLinkAssertionParser((Element) result.getAssertion())
- .parseIdentityLink();
- Assert.assertNotNull(identityLink);
-
- System.out.println(identityLink.getSerializedSamlAssertion());
-
- checkElement("Mustermann", identityLink.getFamilyName());
- checkElement("Hans", identityLink.getGivenName());
- checkElement("1989-05-05", identityLink.getDateOfBirth());
- checkElement("urn:publicid:gv.at:baseid", identityLink.getIdentificationType());
- checkElement("k+zDM1BVpN1WJO4x7ZQ3ng==", identityLink.getIdentificationValue());
- Assert.assertNotNull(identityLink.getSerializedSamlAssertion());
- Assert.assertNotNull(identityLink.getSamlAssertion());
-
- } catch (final SzrCommunicationException e) {
- Assert.fail();
-
- }
-
- }
-
- @Test
- public void getIdentityLinkRawModeErrorTravelerDocExists()
- throws SZRException_Exception, EaafParserException, NoSuchProviderException, IOException, InvalidKeyException,
- EidasSAuthenticationException, JAXBException, ParserConfigurationException, SAXException {
- setSzrExceptionIdentityLink("/data/szr/szr_resp_error_travelerdocexists.xml");
-
- try {
- log.debug("Starting connecting SZR Gateway");
- szrClient.getIdentityLinkInRawMode(getPersonInfo());
- Assert.fail();
-
- } catch (final SzrCommunicationException e) {
- checkElement("ernb.02", e.getErrorId());
- Assert.assertNotNull(e.getCause());
- org.springframework.util.Assert.isInstanceOf(SOAPFaultException.class, e.getCause());
- Assert.assertNotNull(((SOAPFaultException) e.getCause()).getFault());
- checkElement("p344:F455", ((SOAPFaultException) e.getCause()).getFault().getFaultCode());
- checkElement(
- "The travel document you sent to insert a person already exists for another person. " + "Either check the document or have the person altered accordingly",
- ((SOAPFaultException) e.getCause()).getFault().getFaultString());
-
- }
-
- }
@Ignore
@Test
- public void getBpkTest() throws SZRException_Exception, EidasSAuthenticationException {
- final List<String> bPK = szrClient.getBpk(getPersonInfo(), DUMMY_TARGET, basicConfig
+ public void getBpkTest() throws EidasSAuthenticationException {
+ final List<String> bPK = szrClient.getBpk(getEidData(), DUMMY_TARGET, basicConfig
.getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_VKZ, "no VKZ defined"));
if (bPK.isEmpty()) {
@@ -368,6 +243,7 @@ public class SzrClientTest {
}
+ @SuppressWarnings("SameParameterValue")
private void setSzrResponseIdentityLink(String responseXmlPath) throws JAXBException, SZRException_Exception {
final JAXBContext jaxbContext = JAXBContext
.newInstance(szrservices.ObjectFactory.class, org.w3._2001._04.xmldsig_more.ObjectFactory.class,
@@ -380,8 +256,9 @@ public class SzrClientTest {
}
+ @SuppressWarnings("SameParameterValue")
private void setSzrExceptionIdentityLink(String responseXmlPath)
- throws JAXBException, ParserConfigurationException, SAXException, IOException, SZRException_Exception {
+ throws ParserConfigurationException, SAXException, IOException, SZRException_Exception {
final Element detailerror = DomUtils.parseXmlNonValidating(this.getClass().getResourceAsStream(responseXmlPath));
final javax.xml.namespace.QName qName = new javax.xml.namespace.QName("urn:SZRServices", "F455", "p344");
final SoapFault fault = new SoapFault(
@@ -393,47 +270,15 @@ public class SzrClientTest {
}
- private String createHashFromUniqueId(String uniqueId) throws EidasSAuthenticationException {
- try {
- final MessageDigest md = MessageDigest.getInstance("SHA-256");
- final byte[] hash = md.digest(uniqueId.getBytes("UTF-8"));
- final String hashBase64 = new String(Base64Utils.encode(hash), "UTF-8").replaceAll("\r\n", "");
- return hashBase64;
-
- } catch (final Exception ex) {
- throw new EidasSAuthenticationException("internal.03", new Object[]{}, ex);
-
- }
+ private SimpleEidasData getEidData() {
+ return SimpleEidasData.builder()
+ .familyName("Mustermann")
+ .givenName("Franz")
+ .dateOfBirth("1989-05-05")
+ .citizenCountryCode("IS")
+ .pseudonym("1234sdgsdfg56789ABCDEF")
+ .build();
}
- private PersonInfoType getPersonInfo() throws EidasSAuthenticationException {
- final PersonInfoType personInfo = new PersonInfoType();
- final PersonNameType personName = new PersonNameType();
- final PhysicalPersonType naturalPerson = new PhysicalPersonType();
- final TravelDocumentType eDocument = new TravelDocumentType();
-
- naturalPerson.setName(personName);
- personInfo.setPerson(naturalPerson);
- personInfo.setTravelDocument(eDocument);
-
- // parse some eID attributes
- final Triple<String, String, String> eIdentifier = EidasResponseUtils.parseEidasPersonalIdentifier(eIDASeID);
- final String uniqueId = createHashFromUniqueId(eIdentifier.getThird());
- final String citizenCountry = eIdentifier.getFirst();
-
- // person information
- personName.setFamilyName(familyName);
- personName.setGivenName(givenName);
- naturalPerson.setDateOfBirth(dateOfBirth);
- eDocument.setIssuingCountry(citizenCountry);
- eDocument.setDocumentNumber(uniqueId);
-
- // eID document information
- eDocument.setDocumentType(basicConfig
- .getBasicConfiguration(Constants.CONIG_PROPS_EIDAS_SZRCLIENT_PARAMS_EDOCUMENTTYPE,
- Constants.SZR_CONSTANTS_DEFAULT_DOCUMENT_TYPE));
-
- return personInfo;
- }
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrAddressSearchClientProductionTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrAddressSearchClientProductionTest.java
new file mode 100644
index 00000000..a6ff234b
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrAddressSearchClientProductionTest.java
@@ -0,0 +1,169 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.IfProfileValue;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrAddressSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrAddressSoapClient.AddressInfo;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrAddressSoapClient.DetailLevel;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.LoggingHandler;
+import at.gv.bmi.namespace.zmr_su.zrm._20040201_.address.Adressdaten;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PostAdresseTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.ZustelladresseTyp;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+
+@IfProfileValue(name = "spring.profiles.active", value = "devEnvironment")
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_realConfig.xml" })
+@TestPropertySource(locations = {
+ // "classpath:/application.properties",
+ "file:/home/tlenz/Projekte/config/ms_connector/default_config.properties",
+})
+public class ZmrAddressSearchClientProductionTest {
+
+
+ @Autowired ZmrAddressSoapClient client;
+ @Autowired IConfiguration basicConfig;
+
+ @BeforeClass
+ public static void classInitializer() {
+ final Logger logger1 = (Logger) LoggerFactory.getLogger(LoggingHandler.class);
+ logger1.setLevel(Level.TRACE);
+
+ final Logger logger2 = (Logger) LoggerFactory.getLogger(ZmrAddressSoapClient.class);
+ logger2.setLevel(Level.TRACE);
+
+ final Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+ rootLogger.setLevel(Level.INFO);
+
+ }
+
+ @Test
+ public void gemeinde() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setGemeinde("Frohnl*");
+ req.setPostAdresse(address);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.CITY, resp.getLevel());
+
+
+ }
+
+ @Test
+ public void ortschaftAndGemeinde() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setGemeinde("Frohnleiten");
+ address.setOrtschaft("Wannersdorf");
+ req.setPostAdresse(address);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.STREET, resp.getLevel());
+
+ }
+
+ @Test
+ public void ortschaftAndGemeindeAndStreet() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setGemeinde("Frohnleiten");
+ address.setOrtschaft("Wannersdorf");
+ req.setPostAdresse(address);
+
+ ZustelladresseTyp addressDetail = new ZustelladresseTyp();
+ addressDetail.setStrassenname("Wannersdorf");
+ address.setZustelladresse(addressDetail);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.NUMBER, resp.getLevel());
+
+ }
+
+
+ @Test
+ public void ortschaftAndGemeinde2() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setGemeinde("Fro*");
+ address.setOrtschaft("Wannersdorf");
+ req.setPostAdresse(address);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.CITY, resp.getLevel());
+
+ }
+
+ @Test
+ public void ortschaftAndGemeinde3() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setGemeinde("Eggelsberg");
+ address.setOrtschaft("Wannersdorf");
+ req.setPostAdresse(address);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.STREET, resp.getLevel());
+
+ }
+
+
+ @Test
+ public void ortschaft() throws EidasSAuthenticationException {
+ // build dummy request
+ Adressdaten req = new Adressdaten();
+ PostAdresseTyp address = new PostAdresseTyp();
+ address.setOrtschaft("Wannersdorf");
+ req.setPostAdresse(address);
+
+ // execute test
+ AddressInfo resp = client.searchAddress(req);
+
+ // validate state
+ assertFalse("no results", resp.getPersonResult().isEmpty());
+ assertEquals("wrong detail level", DetailLevel.CITY, resp.getLevel());
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientProductionTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientProductionTest.java
new file mode 100644
index 00000000..cada6f40
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientProductionTest.java
@@ -0,0 +1,478 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.util.List;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.IfProfileValue;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.LoggingHandler;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.NatuerlichePersonTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PersonenNameTyp;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+
+@IfProfileValue(name = "spring.profiles.active", value = "devEnvironment")
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_realConfig.xml" })
+@TestPropertySource(locations = {
+ // "classpath:/application.properties",
+ "file:/home/tlenz/Projekte/config/ms_connector/default_config.properties",
+})
+public class ZmrClientProductionTest {
+
+ @Autowired
+ ZmrSoapClient client;
+ @Autowired
+ IConfiguration basicConfig;
+
+ @BeforeClass
+ public static void classInitializer() {
+ final Logger logger1 = (Logger) LoggerFactory.getLogger(LoggingHandler.class);
+ logger1.setLevel(Level.TRACE);
+
+ final Logger logger2 = (Logger) LoggerFactory.getLogger(ZmrSoapClient.class);
+ logger2.setLevel(Level.TRACE);
+
+ final Logger rootLogger = (Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
+ rootLogger.setLevel(Level.INFO);
+
+ }
+
+ @Ignore
+ @Test
+ public void searchWithMdsOnly() throws EidasSAuthenticationException {
+
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ "Thomas", "Lenz", "1982-09-06",
+ "AT");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ }
+
+ @Test
+ public void searchWithMdsOnlyTestIdentity() throws EidasSAuthenticationException {
+
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ "XXXHildegard", "XXXÖhlinger", "1971-02-18",
+ "AT");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ }
+
+ /*
+ * Ignore this test because "javier", "Garcia", "1964-12-31", "EE" is used as test-identity
+ * in test-country on vidp.gv.at. vidp.gv.at uses Test-SZR, but Test-SZR is connected to
+ * Q-ZMR and Q-ERnP. There is a staging problem because this test uses T-ZMR and T-ERnP.
+ */
+ @Ignore
+ @Test
+ public void searchWithMdsOnlyEidasIdentity() throws EidasSAuthenticationException {
+
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ "javier", "Garcia", "1964-12-31",
+ "EE");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ }
+
+ @Test
+ public void searchWithCountrySpecificsNoExits() throws EidasSAuthenticationException {
+ final ZmrRegisterResult result = client.searchCountrySpecific(null,
+ generateCustomRequest("AT", "Lenz", "Thomas", "1982-09-06",
+ null,
+ RandomStringUtils.randomAlphabetic(5),
+ RandomStringUtils.randomAlphabetic(5)),
+ "AT");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 0, result.getPersonResult().size());
+
+ }
+
+ @Ignore
+ @Test
+ public void searchWithCountrySpecificsWithPersonalId() throws EidasSAuthenticationException {
+ final ZmrRegisterResult result = client.searchCountrySpecific(null,
+ generateCustomRequest("EE", "Lenz", "Thomas", "1982-09-06",
+ "7cEYSvKZvon+V4CDVzNT4E7cjkU4Vq",
+ null,
+ null),
+ "EE");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ }
+
+ @Test
+ public void searchWithPersonalIdOnlyNoExisting() throws EidasSAuthenticationException {
+
+ final ZmrRegisterResult result = client.searchWithPersonIdentifier(null,
+ RandomStringUtils.randomAlphanumeric(25),
+ "AT");
+
+ assertNotNull("ZMR response", result);
+ assertNotNull("ZMR processId", result.getProcessId());
+ assertNotNull("ZMR personResult", result.getPersonResult());
+ assertEquals("personResult size", 0, result.getPersonResult().size());
+
+ }
+
+ @Test
+ public void updateZmrEntry() throws EidasSAuthenticationException {
+ final String personalIdentifier = "7cEYSvKZvon+V4CDVzNT4E7cjkU4Vq";
+ final String cc = "EE";
+
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("Lenz")
+ .givenName("Thomas")
+ .dateOfBirth("1982-09-06")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .build();
+
+ // get initial result
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ eidasData.getGivenName(),
+ eidasData.getFamilyName(),
+ eidasData.getDateOfBirth(),
+ eidasData.getCitizenCountryCode());
+ assertNotNull("ZMR response", result);
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ // update ZMR entry
+ final ZmrRegisterResult updateResult =
+ client.update(result.getProcessId(),
+ result.getPersonResult().get(0),
+ eidasData);
+
+ assertNotNull("ZMR response", updateResult);
+ assertEquals("personResult size", 1, updateResult.getPersonResult().size());
+
+ final ZmrRegisterResult afterUpdateResult = client.searchWithPersonIdentifier(null,
+ personalIdentifier, cc);
+
+ assertNotNull("ZMR response", afterUpdateResult);
+ assertEquals("personResult size", 1, afterUpdateResult.getPersonResult().size());
+
+ }
+
+ @Test
+ public void updateZmrEntryTestIdentity() throws EidasSAuthenticationException {
+ final String personalIdentifier = "7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq";
+ final String cc = "EE";
+
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("Muster301")
+ .givenName("Eric")
+ .dateOfBirth("1988-01-03")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .build();
+
+ // get initial result
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ eidasData.getGivenName(),
+ eidasData.getFamilyName(),
+ eidasData.getDateOfBirth(),
+ eidasData.getCitizenCountryCode());
+ assertNotNull("ZMR response", result);
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ // update ZMR entry
+ final ZmrRegisterResult updateResult =
+ client.update(result.getProcessId(),
+ result.getPersonResult().get(0),
+ eidasData);
+
+ assertNotNull("ZMR response", updateResult);
+ assertEquals("personResult size", 1, updateResult.getPersonResult().size());
+
+
+ final ZmrRegisterResult afterUpdateResultMds = client.searchCountrySpecific(null,
+ generateCustomRequest("EE", "XXXHildegard", "XXXÖhlinger", "1971-02-18",
+ "7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq",
+ null,
+ null),
+ cc);
+
+ assertNotNull("ZMR response", afterUpdateResultMds);
+ assertNotNull("ZMR processId", afterUpdateResultMds.getProcessId());
+ assertNotNull("ZMR personResult", afterUpdateResultMds.getPersonResult());
+ assertEquals("personResult size", 1, afterUpdateResultMds.getPersonResult().size());
+
+
+ // check if ZMR entry can be found by PersonalId
+ final ZmrRegisterResult afterUpdateResult = client.searchWithPersonIdentifier(null,
+ personalIdentifier, cc);
+
+ assertNotNull("ZMR response", afterUpdateResult);
+ assertEquals("personResult size", 1, afterUpdateResult.getPersonResult().size());
+
+ }
+
+ @Test
+ public void updateZmrEntryDeSpecific() throws EidasSAuthenticationException {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .placeOfBirth("Hintergigritzpotschn")
+ .birthName("XXXvon Heuburg")
+ .build();
+
+ // first login with update
+ // get initial result
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ eidasDataFirst.getGivenName(),
+ eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getDateOfBirth(),
+ eidasDataFirst.getCitizenCountryCode());
+ assertNotNull("ZMR response", result);
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ // update ZMR entry
+ final ZmrRegisterResult updateResult =
+ client.update(result.getProcessId(),
+ result.getPersonResult().get(0),
+ eidasDataFirst);
+
+ assertNotNull("ZMR response", updateResult);
+ assertEquals("personResult size", 1, updateResult.getPersonResult().size());
+
+ // check if ZMR entry can be found by first PersonalId
+ final ZmrRegisterResult firstPersonalIdResult = client.searchWithPersonIdentifier(null,
+ personalIdentifierFirst, cc);
+ assertNotNull("ZMR response", firstPersonalIdResult);
+ assertEquals("first personResult size", 1, firstPersonalIdResult.getPersonResult().size());
+
+
+ // check if ZMR entry is not found by valid pseudonym but wrong country
+ final ZmrRegisterResult wrongPersonalIdResult = client.searchWithPersonIdentifier(null,
+ personalIdentifierFirst, "ES");
+ assertNotNull("ZMR response", wrongPersonalIdResult);
+ assertEquals("first personResult size", 0, wrongPersonalIdResult.getPersonResult().size());
+
+
+ // search CC-specific with MDS + placeOfBirth + birthName
+ final ZmrRegisterResult ccSpecificFirstEntry = client.searchCountrySpecific(null,
+ generateCustomRequest(
+ eidasDataFirst.getCitizenCountryCode(),
+ eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getGivenName(),
+ eidasDataFirst.getDateOfBirth(),
+ null,
+ eidasDataFirst.getPlaceOfBirth(),
+ eidasDataFirst.getBirthName()),
+ cc);
+
+ assertNotNull("ZMR response", ccSpecificFirstEntry);
+ assertNotNull("ZMR processId", ccSpecificFirstEntry.getProcessId());
+ assertNotNull("ZMR personResult", ccSpecificFirstEntry.getPersonResult());
+ assertEquals("personResult size", 1, ccSpecificFirstEntry.getPersonResult().size());
+
+ }
+
+ @Test
+ public void updateZmrEntryTestIdentity2() throws EidasSAuthenticationException {
+ final String personalIdentifierFirst = "7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_first";
+ final String personalIdentifierSecond = "7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_second";
+ final String cc = "EE";
+
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXTüzekçi")
+ .givenName("XXXŐzgür")
+ .dateOfBirth("1983-06-04")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ final SimpleEidasData eidasDataSecond = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXTüzekçi")
+ .givenName("XXXŐzgür")
+ .dateOfBirth("1983-06-04")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierSecond)
+ .pseudonym(personalIdentifierSecond)
+ .build();
+
+
+ // first login with update
+ // get initial result
+ final ZmrRegisterResult result = client.searchWithMds(null,
+ eidasDataFirst.getGivenName(),
+ eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getDateOfBirth(),
+ eidasDataFirst.getCitizenCountryCode());
+ assertNotNull("ZMR response", result);
+ assertEquals("personResult size", 1, result.getPersonResult().size());
+
+ // update ZMR entry
+ final ZmrRegisterResult updateResult =
+ client.update(result.getProcessId(),
+ result.getPersonResult().get(0),
+ eidasDataFirst);
+
+ assertNotNull("ZMR response", updateResult);
+ assertEquals("personResult size", 1, updateResult.getPersonResult().size());
+
+
+ // second login with update
+ // get initial result
+ final ZmrRegisterResult resultSecond = client.searchWithMds(null,
+ eidasDataSecond.getGivenName(),
+ eidasDataSecond.getFamilyName(),
+ eidasDataSecond.getDateOfBirth(),
+ eidasDataSecond.getCitizenCountryCode());
+ assertNotNull("ZMR response", resultSecond);
+ assertEquals("personResult size", 1, resultSecond.getPersonResult().size());
+
+ // update ZMR entry
+ final ZmrRegisterResult updateResultSecond =
+ client.update(resultSecond.getProcessId(),
+ resultSecond.getPersonResult().get(0),
+ eidasDataSecond);
+
+ assertNotNull("ZMR response", updateResultSecond);
+ assertEquals("personResult size", 1, updateResultSecond.getPersonResult().size());
+
+
+ // check if ZMR entry can be found by first PersonalId
+ final ZmrRegisterResult firstPersonalIdResult = client.searchWithPersonIdentifier(null,
+ personalIdentifierFirst, cc);
+ assertNotNull("ZMR response", firstPersonalIdResult);
+ assertEquals("first personResult size", 1, firstPersonalIdResult.getPersonResult().size());
+
+ // check if ZMR entry can be found by second PersonalId
+ final ZmrRegisterResult secondPersonalIdResult = client.searchWithPersonIdentifier(null,
+ personalIdentifierFirst, cc);
+ assertNotNull("ZMR response", secondPersonalIdResult);
+ assertEquals("second personResult size", 1, secondPersonalIdResult.getPersonResult().size());
+
+
+ // search CC-specific with first MDS
+ final ZmrRegisterResult ccSpecificFirstEntry = client.searchCountrySpecific(null,
+ generateCustomRequest(
+ eidasDataFirst.getCitizenCountryCode(),
+ eidasDataFirst.getFamilyName(),
+ eidasDataFirst.getGivenName(),
+ eidasDataFirst.getDateOfBirth(),
+ eidasDataFirst.getPseudonym(),
+ null,
+ null),
+ cc);
+
+ assertNotNull("ZMR response", ccSpecificFirstEntry);
+ assertNotNull("ZMR processId", ccSpecificFirstEntry.getProcessId());
+ assertNotNull("ZMR personResult", ccSpecificFirstEntry.getPersonResult());
+ assertEquals("personResult size", 1, ccSpecificFirstEntry.getPersonResult().size());
+
+
+ // search CC-specific with second MDS
+ final ZmrRegisterResult ccSpecificSecondEntry = client.searchCountrySpecific(null,
+ generateCustomRequest(
+ eidasDataSecond.getCitizenCountryCode(),
+ eidasDataSecond.getFamilyName(),
+ eidasDataSecond.getGivenName(),
+ eidasDataSecond.getDateOfBirth(),
+ eidasDataSecond.getPseudonym(),
+ null,
+ null),
+ cc);
+
+ assertNotNull("ZMR response", ccSpecificSecondEntry);
+ assertNotNull("ZMR processId", ccSpecificSecondEntry.getProcessId());
+ assertNotNull("ZMR personResult", ccSpecificSecondEntry.getPersonResult());
+ assertEquals("personResult size", 1, ccSpecificSecondEntry.getPersonResult().size());
+
+
+ }
+
+
+ private PersonSuchenRequest generateCustomRequest(String cc, String familyName, String givenName,
+ String dateOfBirth, String personalId, String placeOfBirth, String birthName) {
+ final PersonSuchenRequest req = new PersonSuchenRequest();
+
+ // set basic MDS information
+ final NatuerlichePersonTyp searchNatPerson = new NatuerlichePersonTyp();
+ req.setNatuerlichePerson(searchNatPerson);
+ final PersonenNameTyp searchNatPersonName = new PersonenNameTyp();
+ searchNatPerson.setPersonenName(searchNatPersonName);
+ searchNatPersonName.setFamilienname(familyName);
+ searchNatPersonName.setVorname(givenName);
+ searchNatPerson.setGeburtsdatum(dateOfBirth);
+
+ // add addtional eIDAS attributes if available
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_PLACEOFBIRTH, placeOfBirth);
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_BIRTHNAME, birthName);
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER, personalId);
+
+ return req;
+
+ }
+
+ private void addIfAvailable(List<EidasSuchdatenType> eidasSuchdaten,
+ String cc, String attrName, String attrValue) {
+ if (StringUtils.isNotEmpty(attrValue)) {
+ eidasSuchdaten.add(buildEidasSuchData(cc, attrName, attrValue));
+
+ }
+ }
+
+ private EidasSuchdatenType buildEidasSuchData(String cc, String attrName, String attrValue) {
+ final EidasSuchdatenType eidasInfos = new EidasSuchdatenType();
+ eidasInfos.setStaatscode2(cc);
+ eidasInfos.setEidasArt(attrName);
+ eidasInfos.setEidasWert(attrValue);
+ return eidasInfos;
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java
new file mode 100644
index 00000000..4e0a1f28
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java
@@ -0,0 +1,1242 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.cxf.binding.soap.SoapFault;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.github.skjolber.mockito.soap.SoapServiceRule;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.gv.bmi.namespace.zmr_su.base._20040201.RequestType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetAnlageType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonAendernRequest;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonensucheInfoType;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.NatuerlichePersonTyp;
+import at.gv.e_government.reference.namespace.persondata.de._20040201.PersonenNameTyp;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml" })
+@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
+public class ZmrClientTest {
+
+ public static final String PROCESS_GENERAL = "GP_EIDAS";
+ public static final String PROCESS_TASK_SEARCH = "ZPR_VO_Person_suchen_Meldevorgang";
+ public static final String PROCESS_TASK_UPDATE = "ZPR_VO_Person_aendern";
+
+ @Autowired
+ MsConnectorDummyConfigMap basicConfig;
+ @Autowired
+ ZmrSoapClient client;
+
+ @Rule
+ public SoapServiceRule soap = SoapServiceRule.newInstance();
+
+ private ServicePort zmrMock = null;
+
+ private static JAXBContext jaxbContext;
+
+ /**
+ * Initialize jUnit class.
+ */
+ @BeforeClass
+ @SneakyThrows
+ public static void classInitializer() {
+ jaxbContext = JAXBContext.newInstance(
+ at.gv.bmi.namespace.zmr_su.zmr._20040201.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.gis._20070725.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.base._20040201.ObjectFactory.class);
+ }
+
+ /**
+ * Initialize jUnit test.
+ */
+ @Before
+ public void initializer() {
+ if (zmrMock == null) {
+ zmrMock = soap.mock(ServicePort.class, "http://localhost:1234/demozmr");
+ }
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsEmpty() {
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/empty_zmr_result.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithMds(processId,
+ givenName, familyName, dateOfBirth, cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 0, pSuche.getEidasSuchdaten().size());
+ assertNotNull("mds", pSuche.getNatuerlichePerson());
+
+ assertEquals("req. givenName", givenName, pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("req. familyName", familyName, pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("req. dateOfBirth", dateOfBirth, pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsGetHistoricInfos() {
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ final String cc = "EE";
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_historicIncluded.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithMds(processId,
+ givenName, familyName, dateOfBirth, cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000080", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithMdsSuccess() {
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ final String cc = "EE";
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne_2.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithMds(processId,
+ givenName, familyName, dateOfBirth, cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000080", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 2, resp.getPersonResult().size());
+
+ // check first person
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("bPK", "9/MtsPZgBHQMBpQOD6aOY2TUqcY=", persInfo.getBpk());
+ assertEquals("dateOfBirth", "1983-06-04", persInfo.getDateOfBirth());
+ assertEquals("familyName", "XXXTüzekçi", persInfo.getFamilyName());
+ assertEquals("givenName", "XXXŐzgür", persInfo.getGivenName());
+ assertNull("placeOfBirth", persInfo.getPlaceOfBirth());
+ assertNull("birthName", persInfo.getBirthName());
+ assertEquals("num. stored eIDAS identifiers", 1, persInfo.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers",
+ "aabbcc_should_not_be_included_for_DE", persInfo.getPseudonym().get(0));
+
+ // check second person
+ RegisterResult persInfo2 = resp.getPersonResult().get(1);
+ assertEquals("bPK", "UgeknNsc26lVuB7U/uYGVmWtnnA=", persInfo2.getBpk());
+ assertEquals("dateOfBirth", "1983-06-04", persInfo2.getDateOfBirth());
+ assertEquals("familyName", "XXXTüzekçi", persInfo2.getFamilyName());
+ assertEquals("givenName", "XXXŐzgür", persInfo2.getGivenName());
+ assertEquals("num. stored eIDAS identifiers", 1, persInfo2.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers",
+ "7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_first", persInfo2.getPseudonym().get(0));
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 0, pSuche.getEidasSuchdaten().size());
+ assertNotNull("mds", pSuche.getNatuerlichePerson());
+
+ assertEquals("req. givenName", givenName, pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("req. familyName", familyName, pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("req. dateOfBirth", dateOfBirth, pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+ }
+
+ //TODO: test does not throw the valid exception to catch the error that we like to test.
+ @Ignore
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierZmrError() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+
+ // inject response
+ when(zmrMock.service(any(), any())).thenThrow(injectError(false));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(null, personalIdentifierFirst, cc));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.01", error.getErrorId());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierZmrGenericError() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+
+ // inject response
+ when(zmrMock.service(any(), any())).thenThrow(injectError(true));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(null, personalIdentifierFirst, cc));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.99", error.getErrorId());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierGetHistoricInfos() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_historicIncluded.xml"));
+
+ // execute operation
+ EidasSAuthenticationException error = assertThrows("wrong Exception", EidasSAuthenticationException.class,
+ () -> client.searchWithPersonIdentifier(null, personalIdentifierFirst, cc));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.99", error.getErrorId());
+ assertEquals("wrong errorCode", "module.eidasauth.matching.02", ((EaafException) error.getCause()).getErrorId());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierEmptyResult() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/empty_zmr_result.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithPersonIdentifier(null, personalIdentifierFirst, cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, null, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 1, pSuche.getEidasSuchdaten().size());
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, personalIdentifierFirst);
+ assertNull("mds", pSuche.getNatuerlichePerson());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierMoreThanOneResult() {
+ final String personalIdentifierFirst = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = RandomStringUtils.randomAlphabetic(2).toUpperCase();
+
+ // inject response
+ when(zmrMock.service(any(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"));
+
+ // execute operation
+ WorkflowException error = assertThrows("wrong Exception", WorkflowException.class,
+ () -> client.searchWithPersonIdentifier(null, personalIdentifierFirst, cc));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ assertEquals("wrong param 1", "Searching PersonIdentifier", error.getParams()[0]);
+ assertEquals("wrong param 2", "Find more-than-one ZMR entry with search criteria that has to be unique",
+ error.getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithPersonIdentifier(processId,
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("bPK", "UgeknNsc26lVuB7U/uYGVmWtnnA=", persInfo.getBpk());
+ assertEquals("dateOfBirth", eidasDataFirst.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("familyName", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("placeOfBirth", "Hintergigritzpotschn", persInfo.getPlaceOfBirth());
+ assertEquals("birthName", "XXXvon Heuburg", persInfo.getBirthName());
+ assertEquals("num. stored eIDAS identifiers", 2, persInfo.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers", "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit",
+ persInfo.getPseudonym().get(0));
+ assertEquals("stored eIDAS identifiers",
+ "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one",
+ persInfo.getPseudonym().get(1));
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 1, pSuche.getEidasSuchdaten().size());
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, personalIdentifierFirst);
+ assertNull("mds", pSuche.getNatuerlichePerson());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchWithPersonalIdentifierNoBpkZP() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/no_bpk_zp.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithPersonIdentifier(processId,
+ eidasDataFirst.getPseudonym(), eidasDataFirst.getCitizenCountryCode());
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertNull("bPK", persInfo.getBpk());
+ assertEquals("dateOfBirth", eidasDataFirst.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("familyName", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("placeOfBirth", "Hintergigritzpotschn", persInfo.getPlaceOfBirth());
+ assertEquals("birthName", "XXXvon Heuburg", persInfo.getBirthName());
+ assertEquals("num. stored eIDAS identifiers", 2, persInfo.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers", "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit",
+ persInfo.getPseudonym().get(0));
+ assertEquals("stored eIDAS identifiers",
+ "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one",
+ persInfo.getPseudonym().get(1));
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 1, pSuche.getEidasSuchdaten().size());
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, personalIdentifierFirst);
+ assertNull("mds", pSuche.getNatuerlichePerson());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchCcSpecificEmpty() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String cc = "DE";
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String personalIdentifier = RandomStringUtils.randomAlphabetic(10);
+ String placeOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String birthName = RandomStringUtils.randomAlphabetic(10);
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/empty_zmr_result.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchCountrySpecific(processId,
+ generateCustomRequest(cc, familyName, givenName, dateOfBirth, personalIdentifier, placeOfBirth, birthName),
+ cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchCcSpecificMoreThanOneResult() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String cc = "DE";
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String personalIdentifier = RandomStringUtils.randomAlphabetic(10);
+ String placeOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String birthName = RandomStringUtils.randomAlphabetic(10);
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"));
+
+ // execute operation
+ WorkflowException error = assertThrows("wrong Exception", WorkflowException.class,
+ () -> client.searchCountrySpecific(processId,
+ generateCustomRequest(cc, familyName, givenName, dateOfBirth, personalIdentifier, placeOfBirth, birthName),
+ cc));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ assertEquals("wrong param 1", "Searching DE specific", error.getParams()[0]);
+ assertEquals("wrong param 2", "Find more-than-one ZMR entry with search criteria that has to be unique",
+ error.getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchCcSpecificSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String personalIdentifier = RandomStringUtils.randomAlphabetic(10);
+ String placeOfBirth = RandomStringUtils.randomAlphabetic(10);
+ String birthName = RandomStringUtils.randomAlphabetic(10);
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchCountrySpecific(processId,
+ generateCustomRequest(cc, familyName, givenName, dateOfBirth, personalIdentifier, placeOfBirth, birthName),
+ cc);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("bPK", "UgeknNsc26lVuB7U/uYGVmWtnnA=", persInfo.getBpk());
+ assertEquals("dateOfBirth", eidasDataFirst.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("familyName", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("placeOfBirth", "Hintergigritzpotschn", persInfo.getPlaceOfBirth());
+ assertEquals("birthName", "XXXvon Heuburg", persInfo.getBirthName());
+ assertEquals("num. stored eIDAS identifiers", 2, persInfo.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers", "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit",
+ persInfo.getPseudonym().get(0));
+ assertEquals("stored eIDAS identifiers",
+ "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one",
+ persInfo.getPseudonym().get(1));
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertEquals("eidas Docs. size", 3, pSuche.getEidasSuchdaten().size());
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc, placeOfBirth);
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/BirthName", cc, birthName);
+ checkEidasDocumentResult(pSuche.getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, personalIdentifier);
+
+ assertNotNull("mds", pSuche.getNatuerlichePerson());
+ assertEquals("req. givenName", givenName, pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("req. familyName", familyName, pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("req. dateOfBirth", dateOfBirth, pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchResidenceEmpty() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String cc = "DE";
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ AdresssucheOutput addressInfo = AdresssucheOutput.builder()
+ .municipality(RandomStringUtils.randomAlphabetic(10))
+ .number(RandomStringUtils.randomAlphabetic(10))
+ .postleitzahl(RandomStringUtils.randomAlphabetic(10))
+ .street(RandomStringUtils.randomAlphabetic(10))
+ .village(RandomStringUtils.randomAlphabetic(10))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/empty_zmr_result.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithResidenceData(processId,
+ givenName, familyName, dateOfBirth, cc, addressInfo);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 0, resp.getPersonResult().size());
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+
+ assertNotNull("mds", pSuche.getNatuerlichePerson());
+ assertEquals("req. givenName", givenName, pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("req. familyName", familyName, pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("req. dateOfBirth", dateOfBirth, pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+ assertEquals("req. Municipality", addressInfo.getMunicipality(), pSuche.getPostAdresse().getGemeinde());
+ assertEquals("req. Postleitzahl", addressInfo.getPostleitzahl(), pSuche.getPostAdresse().getPostleitzahl());
+ assertEquals("req. Village", addressInfo.getVillage(), pSuche.getPostAdresse().getOrtschaft());
+ assertEquals("req. Street", addressInfo.getStreet(), pSuche.getPostAdresse().getZustelladresse().getStrassenname());
+ assertEquals("req. Number", addressInfo.getNumber(), pSuche.getPostAdresse().getZustelladresse().getOrientierungsnummer());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchResidenceMoreThanOneResult() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String cc = "DE";
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ AdresssucheOutput addressInfo = AdresssucheOutput.builder()
+ .municipality(RandomStringUtils.randomAlphabetic(10))
+ .postleitzahl(RandomStringUtils.randomAlphabetic(10))
+ .street(RandomStringUtils.randomAlphabetic(10))
+ .build();
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithResidenceData(processId,
+ givenName, familyName, dateOfBirth, cc, addressInfo);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 2, resp.getPersonResult().size());
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ assertEquals("req. Municipality", addressInfo.getMunicipality(), pSuche.getPostAdresse().getGemeinde());
+ assertEquals("req. Postleitzahl", addressInfo.getPostleitzahl(), pSuche.getPostAdresse().getPostleitzahl());
+ assertNull("req. Village", pSuche.getPostAdresse().getOrtschaft());
+ assertEquals("req. Street", addressInfo.getStreet(), pSuche.getPostAdresse().getZustelladresse().getStrassenname());
+ assertNull("req. Number", pSuche.getPostAdresse().getZustelladresse().getOrientierungsnummer());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void searchResidenceSuccess() {
+ final String personalIdentifierFirst = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasDataFirst = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifierFirst)
+ .pseudonym(personalIdentifierFirst)
+ .build();
+
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ String familyName = RandomStringUtils.randomAlphabetic(10);
+ String givenName = RandomStringUtils.randomAlphabetic(10);
+ String dateOfBirth = RandomStringUtils.randomAlphabetic(10);
+ AdresssucheOutput addressInfo = AdresssucheOutput.builder()
+ .municipality(RandomStringUtils.randomAlphabetic(10))
+ .postleitzahl(RandomStringUtils.randomAlphabetic(10))
+ .build();
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any())).thenReturn(
+ loadResponseFromFile("/data/zmr/search_with_personalId_only_resp.xml"));
+
+ // execute operation
+ ZmrRegisterResult resp = client.searchWithResidenceData(processId,
+ givenName, familyName, dateOfBirth, cc, addressInfo);
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "367100000000079", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ RegisterResult persInfo = resp.getPersonResult().get(0);
+ assertEquals("bPK", "UgeknNsc26lVuB7U/uYGVmWtnnA=", persInfo.getBpk());
+ assertEquals("dateOfBirth", eidasDataFirst.getDateOfBirth(), persInfo.getDateOfBirth());
+ assertEquals("familyName", eidasDataFirst.getFamilyName(), persInfo.getFamilyName());
+ assertEquals("givenName", eidasDataFirst.getGivenName(), persInfo.getGivenName());
+ assertEquals("placeOfBirth", "Hintergigritzpotschn", persInfo.getPlaceOfBirth());
+ assertEquals("birthName", "XXXvon Heuburg", persInfo.getBirthName());
+ assertEquals("num. stored eIDAS identifiers", 2, persInfo.getPseudonym().size());
+ assertEquals("stored eIDAS identifiers", "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit",
+ persInfo.getPseudonym().get(0));
+ assertEquals("stored eIDAS identifiers",
+ "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one",
+ persInfo.getPseudonym().get(1));
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = zmrReq.getValue().getPersonSuchenRequest();
+ assertEquals("req. Municipality", addressInfo.getMunicipality(), pSuche.getPostAdresse().getGemeinde());
+ assertEquals("req. Postleitzahl", addressInfo.getPostleitzahl(), pSuche.getPostAdresse().getPostleitzahl());
+ assertNull("req. Village", pSuche.getPostAdresse().getOrtschaft());
+ assertNull("req. Number", pSuche.getPostAdresse().getZustelladresse());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void updateProcessNoLatestVersionResult() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String personalIdentifier = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .build();
+
+ RegisterResult toUpdate = RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .dateOfBirth("1994-12-31")
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ //.birthName("")
+ //.placeOfBirth("")
+ //.pseudonym(Arrays.asList(""))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenThrow(new RuntimeException("Request not needed any more"));
+
+
+ // execute operation
+ WorkflowException error = assertThrows("wrong Exception", WorkflowException.class,
+ () -> client.update(processId, toUpdate, eidasData));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ assertEquals("wrong param 1", "KITT get-latest-version", error.getParams()[0]);
+ assertEquals("wrong param 2", "Find NO data-set with already matchted eID during ZMR KITT process",
+ error.getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateProcessMultiLatestVersionResult() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String personalIdentifier = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .build();
+
+ RegisterResult toUpdate = RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .dateOfBirth("1994-12-31")
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ //.birthName("")
+ //.placeOfBirth("")
+ //.pseudonym(Arrays.asList(""))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"))
+ .thenThrow(new RuntimeException("Request not needed any more"));
+
+
+ // execute operation
+ WorkflowException error = assertThrows("wrong Exception", WorkflowException.class,
+ () -> client.update(processId, toUpdate, eidasData));
+
+ assertEquals("wrong errorCode", "module.eidasauth.matching.03", error.getErrorId());
+ assertEquals("wrong param 1", "KITT get-latest-version", error.getParams()[0]);
+ assertEquals("wrong param 2", "Find MORE-THAN-ONE data-sets with already matchted eID during ZMR KITT process",
+ error.getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateProcessRequired() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String personalIdentifier = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .build();
+
+ RegisterResult toUpdate = RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .dateOfBirth("1994-12-31")
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ //.birthName("")
+ //.placeOfBirth("")
+ //.pseudonym(Arrays.asList(""))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-6_kitt_update_resp.xml"))
+ .thenThrow(new RuntimeException("Request not needed any more"));
+
+
+ // execute operation
+ ZmrRegisterResult resp = client.update(processId, toUpdate, eidasData);
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+
+ // check get laterst version request
+ RequestType firstReq = zmrReq.getAllValues().get(0);
+ assertNotNull("1 req.", firstReq.getPersonSuchenRequest());
+ checkBasicRequestParameters(firstReq , PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = firstReq .getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+ assertNull("1 req. ZMR Zahl", pSuche.getZMRZahl());
+ assertEquals("1 req. identifier size", 1,
+ pSuche.getNatuerlichePerson().getIdentification().size());
+ assertEquals("1 req. givenName", toUpdate.getBpk(),
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getValue());
+ assertEquals("1 req. givenName", "urn:publicid:gv.at:cdid+ZP",
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getType());
+ assertNotNull("1 mds", pSuche.getNatuerlichePerson());
+ assertEquals("1 req. givenName", toUpdate.getGivenName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("1 req. familyName", toUpdate.getFamilyName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("1 req. dateOfBirth", toUpdate.getDateOfBirth(),
+ pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+
+ // check update request
+ RequestType secondReq = zmrReq.getAllValues().get(1);
+ assertNotNull("2 req.", secondReq.getPersonAendernRequest());
+ checkBasicRequestParameters(secondReq , PROCESS_TASK_UPDATE, processId, "jUnit123456");
+ PersonAendernRequest secondpSuche = secondReq.getPersonAendernRequest();
+
+ assertEquals("2 req. ZMR Zahl", "000430320173", secondpSuche.getPersonReferenz().getZMRZahl());
+ assertEquals("2 req. tech. Ref. value", "44453600000000697",
+ secondpSuche.getPersonReferenz().getTechnisch().getEntityID());
+ assertEquals("2 req. tech. Ref. date", "2020-02-05T13:07:06.311",
+ secondpSuche.getPersonReferenz().getTechnisch().getLetzteAenderung().toString());
+
+ assertEquals("eidas Docs. size", 6, secondpSuche.getEidasIdentitaetAnlage().size());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc, eidasData.getPlaceOfBirth());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/BirthName", cc, eidasData.getBirthName());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasData.getPseudonym());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName", cc, eidasData.getGivenName());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName", cc, eidasData.getFamilyName());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/DateOfBirth", cc, eidasData.getDateOfBirth());
+
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "366200000000082", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateProcessNoUpdateRequired() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String personalIdentifier = "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit";
+ final String cc = "DE";
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .build();
+
+ RegisterResult toUpdate = RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .dateOfBirth("1994-12-31")
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .pseudonym(Arrays.asList(personalIdentifier))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+ .thenThrow(new RuntimeException("Request not needed any more"));
+
+
+ // execute operation
+ ZmrRegisterResult resp = client.update(processId, toUpdate, eidasData);
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+
+ // check get laterst version request
+ RequestType firstReq = zmrReq.getAllValues().get(0);
+ assertNotNull("1 req.", firstReq.getPersonSuchenRequest());
+ checkBasicRequestParameters(firstReq , PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = firstReq .getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+ assertNull("1 req. ZMR Zahl", pSuche.getZMRZahl());
+ assertEquals("1 req. identifier size", 1,
+ pSuche.getNatuerlichePerson().getIdentification().size());
+ assertEquals("1 req. givenName", toUpdate.getBpk(),
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getValue());
+ assertEquals("1 req. givenName", "urn:publicid:gv.at:cdid+ZP",
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getType());
+ assertNotNull("1 mds", pSuche.getNatuerlichePerson());
+ assertEquals("1 req. givenName", toUpdate.getGivenName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("1 req. familyName", toUpdate.getFamilyName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("1 req. dateOfBirth", toUpdate.getDateOfBirth(),
+ pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", processId.toString(), resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void updateProcessSomeSpecialCases() {
+ BigInteger processId = new BigInteger(RandomStringUtils.randomNumeric(6));
+
+ final String personalIdentifier = RandomStringUtils.randomAlphanumeric(10);
+ final String cc = "DE";
+ final SimpleEidasData eidasData = SimpleEidasData.builder()
+ .citizenCountryCode(cc)
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .dateOfBirth("1994-12-31")
+ .personalIdentifier(cc + "/AT/" + personalIdentifier)
+ .pseudonym(personalIdentifier)
+ .birthName("") //empty addr. values should be ignored
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(10)) //should be ignored because it was already set for DE
+ .build();
+
+ RegisterResult toUpdate = RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .dateOfBirth("1994-12-31")
+ .familyName("XXXvon Brandenburg")
+ .givenName("XXXClaus - Maria")
+ .birthName("XXXvon Heuburg")
+ .placeOfBirth("Hintergigritzpotschn")
+ .pseudonym(Arrays.asList("7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build();
+
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-6_kitt_update_resp.xml"))
+ .thenThrow(new RuntimeException("Request not needed any more"));
+
+
+ // execute operation
+ ZmrRegisterResult resp = client.update(processId, toUpdate, eidasData);
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+
+ // check get latest version request
+ RequestType firstReq = zmrReq.getAllValues().get(0);
+ assertNotNull("1 req.", firstReq.getPersonSuchenRequest());
+ checkBasicRequestParameters(firstReq , PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ PersonSuchenRequest pSuche = firstReq .getPersonSuchenRequest();
+ checkSearchParameters(pSuche.getPersonensucheInfo());
+ assertNull("1 req. ZMR Zahl", pSuche.getZMRZahl());
+ assertEquals("1 req. identifier size", 1,
+ pSuche.getNatuerlichePerson().getIdentification().size());
+ assertEquals("1 req. givenName", toUpdate.getBpk(),
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getValue());
+ assertEquals("1 req. givenName", "urn:publicid:gv.at:cdid+ZP",
+ pSuche.getNatuerlichePerson().getIdentification().get(0).getType());
+ assertNotNull("1 mds", pSuche.getNatuerlichePerson());
+ assertEquals("1 req. givenName", toUpdate.getGivenName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("1 req. familyName", toUpdate.getFamilyName(),
+ pSuche.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("1 req. dateOfBirth", toUpdate.getDateOfBirth(),
+ pSuche.getNatuerlichePerson().getGeburtsdatum());
+
+ // check update request
+ RequestType secondReq = zmrReq.getAllValues().get(1);
+ assertNotNull("2 req.", secondReq.getPersonAendernRequest());
+ checkBasicRequestParameters(secondReq , PROCESS_TASK_UPDATE, processId, "jUnit123456");
+ PersonAendernRequest secondpSuche = secondReq.getPersonAendernRequest();
+
+ assertEquals("2 req. ZMR Zahl", "000430320173", secondpSuche.getPersonReferenz().getZMRZahl());
+ assertEquals("2 req. tech. Ref. value", "44453600000000697",
+ secondpSuche.getPersonReferenz().getTechnisch().getEntityID());
+ assertEquals("2 req. tech. Ref. date", "2020-02-05T13:07:06.311",
+ secondpSuche.getPersonReferenz().getTechnisch().getLetzteAenderung().toString());
+
+
+ // only one attribute for update because birthname is empty and placeOfBirth was already set for DE
+ assertEquals("eidas Docs. size", 1, secondpSuche.getEidasIdentitaetAnlage().size());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasData.getPseudonym());
+
+ // validate state
+ assertNotNull("no ZMR response", resp);
+ assertEquals("wrong processId", "366200000000082", resp.getProcessId().toString());
+ assertEquals("wrong resp size", 1, resp.getPersonResult().size());
+
+ }
+
+
+ private PersonSuchenRequest generateCustomRequest(String cc, String familyName, String givenName,
+ String dateOfBirth, String personalId, String placeOfBirth, String birthName) {
+ final PersonSuchenRequest req = new PersonSuchenRequest();
+
+ // set basic MDS information
+ final NatuerlichePersonTyp searchNatPerson = new NatuerlichePersonTyp();
+ req.setNatuerlichePerson(searchNatPerson);
+ final PersonenNameTyp searchNatPersonName = new PersonenNameTyp();
+ searchNatPerson.setPersonenName(searchNatPersonName);
+ searchNatPersonName.setFamilienname(familyName);
+ searchNatPersonName.setVorname(givenName);
+ searchNatPerson.setGeburtsdatum(dateOfBirth);
+
+ // add addtional eIDAS attributes if available
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_PLACEOFBIRTH, placeOfBirth);
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_BIRTHNAME, birthName);
+ addIfAvailable(req.getEidasSuchdaten(), cc, Constants.eIDAS_ATTRURN_PERSONALIDENTIFIER, personalId);
+
+ return req;
+
+ }
+
+ private void addIfAvailable(List<EidasSuchdatenType> eidasSuchdaten,
+ String cc, String attrName, String attrValue) {
+ if (StringUtils.isNotEmpty(attrValue)) {
+ eidasSuchdaten.add(buildEidasSuchData(cc, attrName, attrValue));
+
+ }
+ }
+
+ private EidasSuchdatenType buildEidasSuchData(String cc, String attrName, String attrValue) {
+ final EidasSuchdatenType eidasInfos = new EidasSuchdatenType();
+ eidasInfos.setStaatscode2(cc);
+ eidasInfos.setEidasArt(attrName);
+ eidasInfos.setEidasWert(attrValue);
+ return eidasInfos;
+
+ }
+
+ private void checkSearchParameters(PersonensucheInfoType toCheck) {
+ assertTrue("searchWithHistory flag", toCheck.getSuchkriterien().isInclusivHistorie());
+ assertFalse("withERsB flag", toCheck.getSuchkriterien().isInclusivERnP());
+ assertFalse("formalisiert flag", toCheck.getSuchkriterien().isFormalisiert());
+ assertFalse("resultWithHistory flag", toCheck.getErgebniskriterien().isInclusivHistorie());
+
+ }
+
+ private void checkEidasDocumentResult(List<EidasSuchdatenType> list, String type, String cc, String value) {
+ Optional<EidasSuchdatenType> eidasDoc = list.stream()
+ .filter(el -> type.equals(el.getEidasArt()))
+ .findFirst();
+
+ assertTrue("eidas doc: " + type, eidasDoc.isPresent());
+ assertEquals("eIDAS docType", type, eidasDoc.get().getEidasArt());
+ assertEquals("eIDAS docValue", value, eidasDoc.get().getEidasWert());
+ assertEquals("eIDAS docCC", cc, eidasDoc.get().getStaatscode2());
+
+ }
+
+ private void checkEidasDocumentAdd(List<EidasIdentitaetAnlageType> list, String type, String cc,
+ String value) {
+ Optional<EidasIdentitaetAnlageType> eidasDoc = list.stream()
+ .filter(el -> type.equals(el.getEidasArt()))
+ .findFirst();
+
+ assertTrue("eidas doc: " + type, eidasDoc.isPresent());
+ assertEquals("eIDAS docType", type, eidasDoc.get().getEidasArt());
+ assertEquals("eIDAS docValue", value, eidasDoc.get().getEidasWert());
+ assertEquals("eIDAS docCC", cc, eidasDoc.get().getStaatscode2());
+
+ }
+
+ private void checkBasicRequestParameters(RequestType requestType, String vorgangName, BigInteger processId,
+ String behoerdennummer) {
+ assertNotNull("no workflow infos", requestType.getWorkflowInfoClient());
+ assertEquals("processName", PROCESS_GENERAL, requestType.getWorkflowInfoClient().getProzessName());
+ assertEquals("vorgangsName", vorgangName, requestType.getWorkflowInfoClient().getVorgangName());
+
+ if (processId != null) {
+ assertEquals("processId", processId, requestType.getWorkflowInfoClient().getProzessInstanzID());
+ } else {
+ assertNull("processId", requestType.getWorkflowInfoClient().getProzessInstanzID());
+ }
+
+ assertNotNull("no client infos", requestType.getClientInfo());
+ assertEquals("behoerdennummer", behoerdennummer, requestType.getClientInfo().getOrganisation()
+ .getBehoerdenNr());
+ }
+
+ private ResponseType loadResponseFromFile(String filepath) throws JAXBException {
+ final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ JAXBElement<?> resp = (JAXBElement<?>) unmarshaller.unmarshal(ZmrClientTest.class.getResourceAsStream(
+ filepath));
+ return (ResponseType) resp.getValue();
+
+ }
+
+ private Throwable injectError(boolean isGeneric) {
+ javax.xml.namespace.QName qName;
+ if (isGeneric) {
+ qName = new javax.xml.namespace.QName("urn:SZRServices", "F455", "p344");
+
+ } else {
+ qName = new javax.xml.namespace.QName("http://bmi.gv.at/namespace/zmr-su/base/20040201#", "ServiceFault", "zmr");
+
+ }
+ final SoapFault fault = new SoapFault(
+ "The travel document you sent to insert a person already exists for another person. " + "Either check the document or have the person altered accordingly",
+ qName);
+ fault.setRole("zmr:ServiceFault");
+ return fault;
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/config/EidasConnectorMessageSourceTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/config/EidasConnectorMessageSourceTest.java
new file mode 100644
index 00000000..1f96b25c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/config/EidasConnectorMessageSourceTest.java
@@ -0,0 +1,43 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.config;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.gv.egiz.eaaf.core.api.logging.IMessageSourceLocation;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"})
+@DirtiesContext
+public class EidasConnectorMessageSourceTest {
+
+ @Autowired
+ private ResourceLoader loader;
+ @Autowired(required = false)
+ private List<IMessageSourceLocation> messageSources;
+
+ @Test
+ public void checkMessageSources() {
+ Assert.assertNotNull("No messageSource", messageSources);
+
+ for (final IMessageSourceLocation messageSource : messageSources) {
+ Assert.assertNotNull("No sourcePath", messageSource.getMessageSourceLocation());
+
+ for (final String el : messageSource.getMessageSourceLocation()) {
+ final Resource messages = loader.getResource(el + ".properties");
+ Assert.assertTrue("Source not exist", messages.exists());
+
+ }
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyAuthConfigMap.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyAuthConfigMap.java
new file mode 100644
index 00000000..ba531029
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyAuthConfigMap.java
@@ -0,0 +1,144 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import at.gv.egiz.eaaf.core.api.idp.IConfigurationWithSP;
+import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * Dummy Application-configuration implementation for jUnit tests.
+ *
+ * @author tlenz
+ *
+ */
+public class DummyAuthConfigMap implements IConfigurationWithSP {
+
+ private Map<String, String> config = new HashMap<>();
+
+ /**
+ * Empty Dummy Application-configuration.
+ *
+ */
+ public DummyAuthConfigMap() {
+
+ }
+
+ /**
+ * Dummy Application-configuration.
+ *
+ * @param configIs Property based configuration
+ * @throws IOException In case of an configuration read error
+ */
+ public DummyAuthConfigMap(final InputStream configIs) throws IOException {
+
+ final Properties props = new Properties();
+ props.load(configIs);
+
+ config = KeyValueUtils.convertPropertiesToMap(props);
+
+ }
+
+ /**
+ * Dummy Application-configuration.
+ *
+ * @param path Path to property based configuration
+ * @throws IOException In case of an configuration read error
+ */
+ public DummyAuthConfigMap(final String path) throws IOException {
+
+ final Properties props = new Properties();
+ props.load(this.getClass().getResourceAsStream(path));
+
+ config = KeyValueUtils.convertPropertiesToMap(props);
+
+ }
+
+
+ @Override
+ public String getBasicConfiguration(final String key) {
+ return config.get(key);
+
+ }
+
+ @Override
+ public String getBasicConfiguration(final String key, final String defaultValue) {
+ final String value = getBasicConfiguration(key);
+ if (StringUtils.isEmpty(value)) {
+ return defaultValue;
+ } else {
+ return value;
+ }
+
+ }
+
+ @Override
+ public boolean getBasicConfigurationBoolean(final String key) {
+ final String value = getBasicConfiguration(key);
+ if (StringUtils.isEmpty(value)) {
+ return false;
+ } else {
+ return Boolean.valueOf(value);
+ }
+ }
+
+ @Override
+ public boolean getBasicConfigurationBoolean(final String key, final boolean defaultValue) {
+ return Boolean.parseBoolean(getBasicConfiguration(key, String.valueOf(defaultValue)));
+
+ }
+
+ @Override
+ public Map<String, String> getBasicConfigurationWithPrefix(final String prefix) {
+ return KeyValueUtils.getSubSetWithPrefix(config, prefix);
+
+ }
+
+ @Override
+ public ISpConfiguration getServiceProviderConfiguration(final String uniqueID)
+ throws EaafConfigurationException {
+ return null;
+ }
+
+ @Override
+ public <T> T getServiceProviderConfiguration(final String spIdentifier, final Class<T> decorator)
+ throws EaafConfigurationException {
+ return null;
+ }
+
+ @Override
+ public URI getConfigurationRootDirectory() {
+ return new java.io.File(".").toURI();
+
+ }
+
+ @Override
+ public String validateIdpUrl(final URL authReqUrl) throws EaafException {
+ return authReqUrl.toString();
+ }
+
+ public void putConfigValue(final String key, final String value) {
+ config.put(key, value);
+ }
+
+ public void removeConfigValue(final String key) {
+ config.remove(key);
+
+ }
+
+ public void removeAll() {
+ config.clear();
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyOA.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyOA.java
new file mode 100644
index 00000000..074dd0bb
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyOA.java
@@ -0,0 +1,304 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+
+import at.gv.egiz.eaaf.core.impl.builder.BpkBuilder;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils;
+import lombok.Getter;
+import lombok.Setter;
+
+public class DummyOA implements IAhSpConfiguration {
+
+ private static final long serialVersionUID = 1L;
+ private String uniqueAppId = null;
+ private String targetIdentifier = null;
+ private String friendlyName = null;
+ private String cc = "AT";
+ private final Map<String, String> config = new HashMap<>();
+ private final List<Pair<String, String>> reqAttributes = new ArrayList<>();
+
+ private boolean mandateEnabled = false;
+ private boolean onlyMandateEnabled = false;
+ private String mandateProfilesCsv;
+
+ private boolean eidasEnabled = false;
+
+ private boolean testCredentialEnabled = true;
+ private String additionalBpkTargetCsv;
+ private List<Pair<String, String>> additionalEncBpkTargets;
+
+ @Setter
+ private boolean restricted = true;
+
+ @Setter
+ private long latestVdaAuthentication = 60 * 365 * 5;
+
+ @Getter
+ @Setter
+ private boolean publicServiceProvider;
+
+ @Getter
+ @Setter
+ private boolean multiMandateEnabled;
+
+ @Setter
+ private String bmiUniqueIdentifier;
+
+ @Override
+ public Map<String, String> getFullConfiguration() {
+ return this.config;
+ }
+
+ @Override
+ public String getConfigurationValue(final String key) {
+ return this.config.get(key);
+ }
+
+ @Override
+ public String getConfigurationValue(final String key, final String defaultValue) {
+ if (StringUtils.isNotEmpty(getConfigurationValue(key))) {
+ return getConfigurationValue(key);
+ } else {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ public boolean isConfigurationValue(final String key) {
+ if (StringUtils.isNotEmpty(getConfigurationValue(key))) {
+ return Boolean.parseBoolean(getConfigurationValue(key));
+ } else {
+ return false;
+ }
+
+ }
+
+ @Override
+ public boolean isConfigurationValue(final String key, final boolean defaultValue) {
+ return Boolean.parseBoolean(getConfigurationValue(key, String.valueOf(defaultValue)));
+
+ }
+
+ @Override
+ public boolean containsConfigurationKey(final String key) {
+ return this.config.containsKey(key);
+ }
+
+ @Override
+ public String getUniqueIdentifier() {
+ return this.uniqueAppId;
+ }
+
+ @Override
+ public String getUniqueApplicationRegisterIdentifier() {
+ return this.bmiUniqueIdentifier;
+
+ }
+
+ @Override
+ public String getFriendlyName() {
+ return this.friendlyName;
+ }
+
+ @Override
+ public boolean hasBaseIdInternalProcessingRestriction() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public boolean hasBaseIdTransferRestriction() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Set<String> getTargetsWithNoBaseIdInternalProcessingRestriction() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Set<String> getTargetsWithNoBaseIdTransferRestriction() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<String> getRequiredLoA() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getLoAMatchingMode() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public String getAreaSpecificTargetIdentifier() {
+ return this.targetIdentifier;
+ }
+
+ @Override
+ public boolean isTestCredentialEnabled() {
+ return this.testCredentialEnabled;
+ }
+
+ @Override
+ public List<String> getTestCredentialOids() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<Pair<String, String>> getRequiredAttributes() {
+ return this.reqAttributes;
+
+ }
+
+ public void setUniqueAppId(final String uniqueAppId) {
+ this.uniqueAppId = uniqueAppId;
+ }
+
+ @Override
+ public String getCountryCode() {
+ return cc;
+ }
+
+ @Override
+ public void setCountryCode(final String cc) {
+ this.cc = cc;
+
+ }
+
+ public void setTargetIdentifier(final String targetIdentifier) {
+ this.targetIdentifier = BpkBuilder.normalizeBpkTargetIdentifierToCommonFormat(targetIdentifier);
+
+ }
+
+ public void setFriendlyName(final String friendlyName) {
+ this.friendlyName = friendlyName;
+ }
+
+ public void putGenericConfigurationKey(final String key, final String value) {
+ this.config.put(key, value);
+
+ }
+
+ public void addRequiredAttribute(final String attrUri) {
+ this.reqAttributes.add(Pair.newInstance(attrUri, null));
+
+ }
+
+ public void removeRequiredAttribute(final String attrUri) {
+ for (final Pair<String, String> el : reqAttributes) {
+ if (el.getFirst().equals(attrUri)) {
+ reqAttributes.remove(el);
+ break;
+
+ }
+
+
+ }
+ }
+
+ public void addRequiredAttribute(final String attrUri, String param) {
+ this.reqAttributes.add(Pair.newInstance(attrUri, param));
+
+ }
+
+ @Override
+ public boolean isMandateEnabled() {
+ return this.mandateEnabled;
+ }
+
+ @Override
+ public boolean isOnlyMandateEnabled() {
+ return this.onlyMandateEnabled;
+
+ }
+
+ @Override
+ public List<String> getMandateProfiles() {
+ return KeyValueUtils.getListOfCsvValues(mandateProfilesCsv);
+ }
+
+ @Override
+ public List<String> getAdditionalBpkTargets() {
+ return KeyValueUtils.getListOfCsvValues(additionalBpkTargetCsv);
+
+ }
+
+ @Override
+ public List<Pair<String, String>> getAdditionalForeignBpkTargets() {
+ if (additionalEncBpkTargets == null) {
+ return Collections.emptyList();
+
+ } else {
+ return additionalEncBpkTargets;
+
+ }
+ }
+
+ @Override
+ public long lastVdaAuthenticationDelay() {
+ return latestVdaAuthentication;
+
+ }
+
+ @Override
+ public boolean isRestrictedServiceProvider() {
+ return this.restricted;
+ }
+
+
+ public void setMandateEnabled(final boolean mandateEnabled) {
+ this.mandateEnabled = mandateEnabled;
+ }
+
+ public void setOnlyMandateEnabled(final boolean onlyMandateEnabled) {
+ this.onlyMandateEnabled = onlyMandateEnabled;
+ }
+
+ public void setMandateProfilesCsv(final String mandateProfilesCsv) {
+ this.mandateProfilesCsv = mandateProfilesCsv;
+ }
+
+ public void setTestCredentialEnabled(final boolean testCredentialEnabled) {
+ this.testCredentialEnabled = testCredentialEnabled;
+ }
+
+ public void setAdditionalBpkTargetCsv(String additionalBpkTargetCsv) {
+ this.additionalBpkTargetCsv = additionalBpkTargetCsv;
+ }
+
+ public void setAdditionalEncBpkTargets(List<Pair<String, String>> additionalEncBpkTargets) {
+ this.additionalEncBpkTargets = additionalEncBpkTargets;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+
+ @Override
+ public boolean isEidasEnabled() {
+ return this.eidasEnabled;
+
+ }
+
+ public void setEidasEnabled(boolean eidasEnabled) {
+ this.eidasEnabled = eidasEnabled;
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyPendingRequest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyPendingRequest.java
new file mode 100644
index 00000000..9a91ecbd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/DummyPendingRequest.java
@@ -0,0 +1,8 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy;
+
+import at.gv.egiz.eaaf.core.impl.idp.controller.protocols.RequestImpl;
+
+public class DummyPendingRequest extends RequestImpl {
+ private static final long serialVersionUID = 8136280395622411505L;
+}
+
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/IAhSpConfiguration.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/IAhSpConfiguration.java
new file mode 100644
index 00000000..13d61f15
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/dummy/IAhSpConfiguration.java
@@ -0,0 +1,152 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import at.gv.egiz.eaaf.core.api.idp.ISpConfiguration;
+import at.gv.egiz.eaaf.core.impl.data.Pair;
+
+public interface IAhSpConfiguration extends ISpConfiguration {
+
+
+ /**
+ * Flag if this Service Provider is enabled.
+ *
+ * @return true if the SP is enabled, otherwise false
+ */
+ boolean isEnabled();
+
+ /**
+ * Get unique identifier that is used in Application-Register from BM.I.
+ *
+ * <p>If no BM.I specific identifier is available then this method returns
+ * the same identifier as <code>getUniqueIdentifier()</code></p>
+ *
+ * @return unique identifier from BM.I AppReg, or generic uniqueId of no specific exists
+ */
+ String getUniqueApplicationRegisterIdentifier();
+
+ /**
+ * Flag that marks this Service-Provider as <i>public</i> or <i>private</i>.
+ *
+ * <p><b>Default:</b> If it is not set or has an unknown value, its <i>private</i> by default</p>
+ *
+ * @return <code>true</code> if it is from <i>public</i>, otherwise <code>false</code>
+ */
+ boolean isPublicServiceProvider();
+
+ /**
+ * Enable test identities for this Service Provider.
+ *
+ * @return true if test identities are allowed, otherwise false
+ */
+ boolean isTestCredentialEnabled();
+
+ /**
+ * Get a List of OID's that refine the set of allowed test identities.
+ *
+ * @return @link {@link List} of test-identity OID's
+ */
+ @Nullable
+ List<String> getTestCredentialOids();
+
+
+ /**
+ * Get a List of unique attribute URI's that are required by this SP.
+ *
+ * @return {@link List} of attribute URI's / parameter {@link Pair}s
+ */
+ List<Pair<String, String>> getRequiredAttributes();
+
+
+ /**
+ * Get the CountryCode for this service. <br>
+ * <br>
+ * <b>Default:</b> AT
+ *
+ * @return
+ */
+ String getCountryCode();
+
+ /**
+ * Set the CountryCode for this service. If not countryCode is set, AT is used as default.
+ *
+ * @param cc Service-Provider country-code
+ */
+ void setCountryCode(String cc);
+
+ /**
+ * Enable mandates for this service provider.
+ *
+ * @return <code>true</code> if mandates are enabled, otherwise <code>false</code>
+ */
+ boolean isMandateEnabled();
+
+ /**
+ * Enables multi-mandates for this service-provider.
+ *
+ * @return <code>true</code> if multi-mandates are enabled, otherwise <code>false</code>
+ */
+ boolean isMultiMandateEnabled();
+
+ /**
+ * Only mandates are allowed for this service provider.
+ *
+ * @return <code>true</code> if only mandates are allowed, otherwise <code>false</code>
+ */
+ boolean isOnlyMandateEnabled();
+
+ /**
+ * Get a {@link List} of mandate profiles that are supported by this Service provider.
+ *
+ * @return
+ */
+ @Nonnull List<String> getMandateProfiles();
+
+
+ /**
+ * eIDAS authentication allowed flag.
+ *
+ * @return <code>true</code> if eIDAS authentication is enabled, otherwise <code>false</code>
+ */
+ boolean isEidasEnabled();
+
+ /**
+ * Get a List of targets for additional bPKs that are required by this service provider.
+ *
+ * @return List of prefixed bPK targets
+ */
+ @Nonnull List<String> getAdditionalBpkTargets();
+
+ /**
+ * Get a list of foreign bPK targets that are required by this service provider.
+ *
+ * @return List of pairs with prefixed bPK targets as first element and VKZ as second element
+ */
+ @Nonnull List<Pair<String, String>> getAdditionalForeignBpkTargets();
+
+ /**
+ * Flag that indicates that service-provider as restricted or unrestricted.
+ *
+ * <p>A restricted service-provider can only used by test-identities that contains a
+ * valid application-restriction in User-Certificate Pinning</p>
+ *
+ * <p><b>Default:</b> true</p>
+ *
+ * @return <code>true</code> if it is restricted, otherwise <code>false</code>
+ */
+ boolean isRestrictedServiceProvider();
+
+
+/**
+ * Defines the time in minutes how long the last VDA registration h@Override
+ ave passed as maximum.
+ *
+ * @return time in minutes
+ */
+long lastVdaAuthenticationDelay();
+
+}
+
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/DeSpecificDetailSearchProcessorTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/DeSpecificDetailSearchProcessorTest.java
new file mode 100644
index 00000000..21c9fd80
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/DeSpecificDetailSearchProcessorTest.java
@@ -0,0 +1,105 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+@RunWith(BlockJUnit4ClassRunner.class)
+public class DeSpecificDetailSearchProcessorTest {
+
+ private DeSpecificDetailSearchProcessor handler = new DeSpecificDetailSearchProcessor();
+
+ @Test
+ public void checkName() {
+ assertEquals("wrong handler name", "DeSpecificDetailSearchProcessor", handler.getName());
+
+ }
+
+ @Test
+ public void canHandlerCheck_1() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertFalse("wrong 'canHandle' flag", handler.canHandle("XX", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_2() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertTrue("wrong 'canHandle' flag", handler.canHandle("DE", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_3() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertTrue("wrong 'canHandle' flag", handler.canHandle("de", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_4() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .birthName(null)
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertFalse("wrong 'canHandle' flag", handler.canHandle("DE", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_5() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(null)
+ .build();
+ assertFalse("wrong 'canHandle' flag", handler.canHandle("DE", eidData));
+
+ }
+
+ @Test
+ public void generateZmrSearchRequest() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .citizenCountryCode("DE")
+ .givenName(RandomStringUtils.randomAlphabetic(5))
+ .familyName(RandomStringUtils.randomAlphabetic(5))
+ .dateOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .birthName(RandomStringUtils.randomAlphabetic(5))
+ .placeOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .build();
+
+ // perform operation
+ PersonSuchenRequest req = handler.generateSearchRequest(eidData);
+
+ //validate response
+ assertNotNull("no search request", req);
+ assertNotNull("no MDS", req.getNatuerlichePerson());
+ assertNotNull("no MDS PersonName", req.getNatuerlichePerson().getPersonenName());
+ assertEquals("familyName", eidData.getFamilyName(), req.getNatuerlichePerson().getPersonenName().getFamilienname());
+ assertEquals("givenName", eidData.getGivenName(), req.getNatuerlichePerson().getPersonenName().getVorname());
+ assertEquals("birthday", eidData.getDateOfBirth(), req.getNatuerlichePerson().getGeburtsdatum());
+
+ assertNotNull("no eIDAS documenst", req.getEidasSuchdaten());
+ //TODO: add validation if we can add more than one eIDAS document
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/ItSpecificDetailSearchProcessorTes.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/ItSpecificDetailSearchProcessorTes.java
new file mode 100644
index 00000000..9b638ee5
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/handler/ItSpecificDetailSearchProcessorTes.java
@@ -0,0 +1,84 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.handler;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.ItSpecificDetailSearchProcessor;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+
+@RunWith(BlockJUnit4ClassRunner.class)
+public class ItSpecificDetailSearchProcessorTes {
+
+ private ItSpecificDetailSearchProcessor handler = new ItSpecificDetailSearchProcessor();
+
+ @Test
+ public void checkName() {
+ assertEquals("wrong handler name", "ItSpecificDetailSearchProcessor", handler.getName());
+
+ }
+
+ @Test
+ public void canHandlerCheck_1() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .taxNumber(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertFalse("wrong 'canHandle' flag", handler.canHandle("XX", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_2() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .taxNumber(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertTrue("wrong 'canHandle' flag", handler.canHandle("IT", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_3() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .taxNumber(RandomStringUtils.randomAlphabetic(5))
+ .build();
+ assertTrue("wrong 'canHandle' flag", handler.canHandle("it", eidData));
+
+ }
+
+ @Test
+ public void canHandlerCheck_4() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .taxNumber("")
+ .build();
+ assertFalse("wrong 'canHandle' flag", handler.canHandle("IT", eidData));
+
+ }
+
+ @Test
+ public void generateZmrSearchRequest() {
+ SimpleEidasData eidData = SimpleEidasData.builder()
+ .citizenCountryCode("IT")
+ .givenName(RandomStringUtils.randomAlphabetic(5))
+ .familyName(RandomStringUtils.randomAlphabetic(5))
+ .dateOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .taxNumber(RandomStringUtils.randomAlphabetic(5))
+ .build();
+
+ // perform operation
+ PersonSuchenRequest req = handler.generateSearchRequest(eidData);
+
+ //validate response
+ assertNotNull("no search request", req);
+
+ //TODO: add validation if we can add more information about taxNumber from Italy
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaAuthSignalControllerTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaAuthSignalControllerTest.java
new file mode 100644
index 00000000..cddcd11c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaAuthSignalControllerTest.java
@@ -0,0 +1,197 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.util.SerializationUtils;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller.IdAustriaClientAuthSignalController;
+import at.gv.egiz.eaaf.core.api.IRequestStorage;
+import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
+import at.gv.egiz.eaaf.core.api.data.ExceptionContainer;
+import at.gv.egiz.eaaf.core.api.idp.IConfiguration;
+import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;
+import at.gv.egiz.eaaf.core.api.utils.IPendingRequestIdGenerationStrategy;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.DummyProtocolAuthService;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.DummySpConfiguration;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.spring.test.DummyTransactionStorage.DummyDbEntry;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class IdAustriaAuthSignalControllerTest {
+
+ @Autowired(required = true)
+ private IdAustriaClientAuthSignalController controller;
+ @Autowired(required = true)
+ private ITransactionStorage cache;
+ @Autowired(required = true)
+ private IPendingRequestIdGenerationStrategy pendingReqGeneration;
+ @Autowired(required = true)
+ private IRequestStorage reqStorage;
+ @Autowired(required = true)
+ private IConfiguration basicConfig;
+ @Autowired private ITransactionStorage transactionStorage;
+
+ @Autowired private DummyProtocolAuthService protAuthService;
+
+ @Test
+ public void noRelayState() throws IOException, EaafException {
+ final MockHttpServletRequest httpReq =
+ new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ final MockHttpServletResponse httpResp = new MockHttpServletResponse();
+
+ controller.performAuthentication(httpReq, httpResp);
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+
+ final String errorId = protAuthService.getErrorKey();
+ final Object error = cache.get(errorId);
+ Assert.assertNotNull("Error is null", error);
+ org.springframework.util.Assert.isInstanceOf(byte[].class,
+ ((DummyDbEntry) error).getObj());
+ final Object errorObj = SerializationUtils.deserialize((byte[]) ((DummyDbEntry) error).getObj());
+ org.springframework.util.Assert.isInstanceOf(ExceptionContainer.class, errorObj);
+ org.springframework.util.Assert.isInstanceOf(EaafException.class,
+ ((ExceptionContainer) errorObj).getExceptionThrown());
+
+ }
+
+ @Test
+ public void validRelayStateNoPendingReqId() throws EaafException, IOException {
+ final String pendingReqId = pendingReqGeneration.generateExternalPendingRequestId();
+ final MockHttpServletRequest httpReq =
+ new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpReq.addParameter(IdAustriaClientAuthSignalController.HTTP_PARAM_RELAYSTATE, pendingReqId);
+ final MockHttpServletResponse httpResp = new MockHttpServletResponse();
+
+ controller.performAuthentication(httpReq, httpResp);
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+
+ final String errorId = protAuthService.getErrorKey();
+ final Object error = cache.get(errorId);
+ Assert.assertNotNull("Error is null", error);
+ org.springframework.util.Assert.isInstanceOf(byte[].class,
+ ((DummyDbEntry) error).getObj());
+ final Object errorObj = SerializationUtils.deserialize((byte[]) ((DummyDbEntry) error).getObj());
+ org.springframework.util.Assert.isInstanceOf(ExceptionContainer.class, errorObj);
+ org.springframework.util.Assert.isInstanceOf(EaafException.class,
+ ((ExceptionContainer) errorObj).getExceptionThrown());
+ //TODO:
+ Assert.assertEquals("ErrorCode not match", "auth.26",
+ ((EaafException) ((ExceptionContainer) errorObj).getExceptionThrown()).getErrorId());
+
+ }
+
+ @Test
+ public void validRelayStateSuspectPendingReqId() throws EaafException, IOException {
+ String relayState = RandomStringUtils.randomAlphanumeric(10);
+ transactionStorage.put(relayState, false, -1);
+
+ final MockHttpServletRequest httpReq =
+ new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpReq.addParameter(IdAustriaClientAuthSignalController.HTTP_PARAM_RELAYSTATE, relayState);
+ final MockHttpServletResponse httpResp = new MockHttpServletResponse();
+
+ controller.performAuthentication(httpReq, httpResp);
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+
+ final String errorId = protAuthService.getErrorKey();
+ final Object error = cache.get(errorId);
+ Assert.assertNotNull("Error is null", error);
+ org.springframework.util.Assert.isInstanceOf(byte[].class,
+ ((DummyDbEntry) error).getObj());
+ final Object errorObj = SerializationUtils.deserialize((byte[]) ((DummyDbEntry) error).getObj());
+ org.springframework.util.Assert.isInstanceOf(ExceptionContainer.class, errorObj);
+ org.springframework.util.Assert.isInstanceOf(EaafException.class,
+ ((ExceptionContainer) errorObj).getExceptionThrown());
+ //TODO:
+ Assert.assertEquals("ErrorCode not match", "auth.26",
+ ((EaafException) ((ExceptionContainer) errorObj).getExceptionThrown()).getErrorId());
+
+ Assert.assertNull("RelayState was not removed", transactionStorage.get(relayState));
+
+ }
+
+ @Test
+ public void validRelayStateNoPendingReq() throws EaafException, IOException {
+ final String pendingReqId = pendingReqGeneration.generateExternalPendingRequestId();
+ String relayState = RandomStringUtils.randomAlphanumeric(10);
+ transactionStorage.put(relayState, pendingReqId, -1);
+
+ final MockHttpServletRequest httpReq =
+ new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpReq.addParameter(IdAustriaClientAuthSignalController.HTTP_PARAM_RELAYSTATE, relayState);
+ final MockHttpServletResponse httpResp = new MockHttpServletResponse();
+
+ controller.performAuthentication(httpReq, httpResp);
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+
+ final String errorId = protAuthService.getErrorKey();
+ final Object error = cache.get(errorId);
+ Assert.assertNotNull("Error is null", error);
+ org.springframework.util.Assert.isInstanceOf(byte[].class,
+ ((DummyDbEntry) error).getObj());
+ final Object errorObj = SerializationUtils.deserialize((byte[]) ((DummyDbEntry) error).getObj());
+ org.springframework.util.Assert.isInstanceOf(ExceptionContainer.class, errorObj);
+ org.springframework.util.Assert.isInstanceOf(EaafException.class,
+ ((ExceptionContainer) errorObj).getExceptionThrown());
+ Assert.assertEquals("ErrorCode not match", "auth.28",
+ ((EaafException) ((ExceptionContainer) errorObj).getExceptionThrown()).getErrorId());
+
+ Assert.assertNull("RelayState was not removed", transactionStorage.get(relayState));
+
+ }
+
+ @Test
+ public void validRelayStateWithPendingReq() throws EaafException, IOException {
+ final String pendingReqId = pendingReqGeneration.generateExternalPendingRequestId();
+
+ String relayState = RandomStringUtils.randomAlphanumeric(10);
+ transactionStorage.put(relayState, pendingReqId, -1);
+
+ final TestRequestImpl pendingReq = new TestRequestImpl();
+ pendingReq.setPendingReqId(pendingReqId);
+ pendingReq.setAuthUrl("http://localhost/idp");
+ final Map<String, String> spConfigMap = new HashMap<>();
+ spConfigMap.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "http://test.sp");
+ final DummySpConfiguration spConfig = new DummySpConfiguration(spConfigMap, basicConfig);
+ pendingReq.setSpConfig(spConfig);
+ reqStorage.storePendingRequest(pendingReq);
+
+ final MockHttpServletRequest httpReq =
+ new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpReq.addParameter(IdAustriaClientAuthSignalController.HTTP_PARAM_RELAYSTATE, relayState);
+ final MockHttpServletResponse httpResp = new MockHttpServletResponse();
+
+ controller.performAuthentication(httpReq, httpResp);
+
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+
+ final String errorId = protAuthService.getErrorKey();
+ final Object error = cache.get(errorId);
+ Assert.assertNotNull("Error is null", error);
+ org.springframework.util.Assert.isInstanceOf(byte[].class,
+ ((DummyDbEntry) error).getObj());
+ final Object errorObj = SerializationUtils.deserialize((byte[]) ((DummyDbEntry) error).getObj());
+ org.springframework.util.Assert.isInstanceOf(ExceptionContainer.class, errorObj);
+ org.springframework.util.Assert.isInstanceOf(EaafException.class,
+ ((ExceptionContainer) errorObj).getExceptionThrown());
+ Assert.assertEquals("ErrorCode not match",
+ "PendingRequest object is not of type 'RequestImpl.class'",
+ ((EaafException) ((ExceptionContainer) errorObj).getExceptionThrown()).getErrorId());
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthHealthCheckTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthHealthCheckTest.java
new file mode 100644
index 00000000..a912f344
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthHealthCheckTest.java
@@ -0,0 +1,130 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.actuate.health.Health;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.w3c.dom.Element;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthHealthCheck;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.api.utils.IPvp2CredentialProvider;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SamlSigningException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+import net.shibboleth.utilities.java.support.xml.SerializeSupport;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class IdAustriaClientAuthHealthCheckTest {
+
+ @Autowired private IdAustriaClientAuthHealthCheck toCheck;
+ @Autowired protected MsConnectorDummyConfigMap config;
+ @Autowired private IPvp2CredentialProvider credentialProvider;
+ @Autowired IdAustriaClientAuthMetadataProvider provider;
+
+ private static MockWebServer mockWebServer;
+ private static HttpUrl mockServerUrl;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void classInitializer() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+
+ mockWebServer = new MockWebServer();
+ mockServerUrl = mockWebServer.url("/sp/metadata");
+
+ }
+
+ @Test
+ public void notActive() {
+ //set-up test
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ null);
+
+ //perform check
+ Health status = toCheck.health();
+
+ //evaluate status
+ Assert.assertEquals("wrong status", Health.unknown().build().getStatus(), status.getStatus());
+
+ }
+
+ @Test
+ public void success() throws SamlSigningException, CredentialsNotAvailableException,
+ XMLParserException, UnmarshallingException, MarshallingException {
+
+ //set-up test
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ mockServerUrl.url().toString());
+ injectValidHttpMetadata(mockServerUrl.url().toString());
+
+ //perform check
+ Health status = toCheck.health();
+
+ //evaluate status
+ Assert.assertEquals("wrong status", Health.up().build().getStatus(), status.getStatus());
+
+ }
+
+ @Test
+ public void invalid() throws SamlSigningException, CredentialsNotAvailableException,
+ XMLParserException, UnmarshallingException, MarshallingException, ResolverException {
+ //set-up test
+ provider.clear();
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ "http://localhost:1234/junit/metadata");
+
+ //perform check
+ Health status = toCheck.health();
+
+ //evaluate status
+ Assert.assertEquals("wrong status", Health.outOfService().build().getStatus(), status.getStatus());
+
+ }
+
+ private String injectValidHttpMetadata(String dynEntityId) throws XMLParserException,
+ UnmarshallingException, MarshallingException, SamlSigningException, CredentialsNotAvailableException {
+ final EntityDescriptor metadata = (EntityDescriptor) XMLObjectSupport.unmarshallFromInputStream(
+ XMLObjectProviderRegistrySupport.getParserPool(),
+ IdAustriaClientAuthHealthCheckTest.class.getResourceAsStream("/data/idp_metadata_no_sig.xml"));
+ metadata.setValidUntil(Instant.now().plus(1, ChronoUnit.DAYS));
+ metadata.setSignature(null);
+ metadata.setEntityID(dynEntityId);
+ Saml2Utils.signSamlObject(metadata, credentialProvider.getMetaDataSigningCredential(), true);
+ final Element metadataElement = XMLObjectSupport.marshall(metadata);
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(SerializeSupport.nodeToString(metadataElement))
+ .setHeader("Content-Type", "text/html;charset=utf-8"));
+ return dynEntityId;
+
+}
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataControllerTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataControllerTest.java
new file mode 100644
index 00000000..b7f27204
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataControllerTest.java
@@ -0,0 +1,136 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.common.xml.SAMLConstants;
+import org.opensaml.saml.metadata.resolver.filter.FilterException;
+import org.opensaml.saml.metadata.resolver.filter.MetadataFilterContext;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.opensaml.saml.saml2.metadata.SPSSODescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.controller.IdAustriaClientAuthMetadataController;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SchemaValidationFilter;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.metadata.SimpleMetadataSignatureVerificationFilter;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
+
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
+public class IdAustriaClientAuthMetadataControllerTest {
+
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+
+ @Autowired private IdAustriaClientAuthMetadataController controller;
+ @Autowired private IdAustriaClientAuthCredentialProvider credProvider;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void initialize() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+
+ }
+
+ /**
+ * Single jUnit-test set-up.
+ */
+ @Before
+ public void testSetup() {
+ httpReq = new MockHttpServletRequest("GET", "http://localhost/authhandler");
+ httpReq.setContextPath("/authhandler");
+ httpResp = new MockHttpServletResponse();
+
+ }
+
+ @Test
+ public void buildMetadataValidInEidMode() throws IOException, EaafException,
+ XMLParserException, UnmarshallingException, FilterException {
+
+ //build metdata
+ controller.getSpMetadata(httpReq, httpResp);
+
+ //check result
+ validateResponse(6);
+
+ }
+
+ private void validateResponse(int numberOfRequestedAttributes) throws UnsupportedEncodingException,
+ XMLParserException, UnmarshallingException, FilterException, CredentialsNotAvailableException {
+ Assert.assertEquals("HTTP Statuscode", 200, httpResp.getStatus());
+ Assert.assertEquals("ContentType", "text/xml; charset=utf-8", httpResp.getContentType());
+ Assert.assertEquals("ContentEncoding", "UTF-8", httpResp.getCharacterEncoding());
+
+ final String metadataXml = httpResp.getContentAsString();
+ Assert.assertNotNull("XML Metadata", metadataXml);
+
+ final EntityDescriptor metadata = (EntityDescriptor) XMLObjectSupport.unmarshallFromInputStream(
+ XMLObjectProviderRegistrySupport.getParserPool(), new ByteArrayInputStream(metadataXml.getBytes("UTF-8")));
+
+ Assert.assertEquals("EntityId",
+ "http://localhost/authhandler" + IdAustriaClientAuthConstants.ENDPOINT_METADATA,
+ metadata.getEntityID());
+
+ MetadataFilterContext filterContext = new MetadataFilterContext();
+
+ //check XML scheme
+ final SchemaValidationFilter schemaFilter = new SchemaValidationFilter();
+ schemaFilter.filter(metadata, filterContext);
+
+ //check signature
+ final SimpleMetadataSignatureVerificationFilter sigFilter =
+ new SimpleMetadataSignatureVerificationFilter(credProvider.getKeyStore().getFirst(),
+ metadata.getEntityID());
+ sigFilter.filter(metadata, filterContext);
+
+ //check content
+ final SPSSODescriptor spSsoDesc = metadata.getSPSSODescriptor(SAMLConstants.SAML20P_NS);
+ Assert.assertNotNull("SPSSODescr.", spSsoDesc);
+
+ Assert.assertFalse("AssertionConsumerServices",
+ spSsoDesc.getAssertionConsumerServices().isEmpty());
+
+ Assert.assertFalse("KeyDescriptors",
+ spSsoDesc.getKeyDescriptors().isEmpty());
+ Assert.assertEquals("#KeyDescriptors", 2, spSsoDesc.getKeyDescriptors().size());
+
+ Assert.assertFalse("NameIDFormats",
+ spSsoDesc.getNameIDFormats().isEmpty());
+ Assert.assertEquals("wrong NameIDFormats", "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
+ spSsoDesc.getNameIDFormats().get(0).getURI());
+
+ Assert.assertFalse("AttributeConsumingServices",
+ spSsoDesc.getAttributeConsumingServices().isEmpty());
+ Assert.assertEquals("#RequestAttributes", numberOfRequestedAttributes,
+ spSsoDesc.getAttributeConsumingServices().get(0).getRequestedAttributes().size());
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderFirstTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderFirstTest.java
new file mode 100644
index 00000000..c4dd5d2e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderFirstTest.java
@@ -0,0 +1,239 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.criterion.EntityIdCriterion;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.w3c.dom.Element;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.api.metadata.IPvp2MetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.api.utils.IPvp2CredentialProvider;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2MetadataException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.SamlSigningException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.PvpMetadataResolverFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
+import at.gv.egiz.eaaf.modules.pvp2.test.metadata.MetadataResolverTest;
+import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+import net.shibboleth.utilities.java.support.xml.SerializeSupport;
+import net.shibboleth.utilities.java.support.xml.XMLParserException;
+import okhttp3.HttpUrl;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class IdAustriaClientAuthMetadataProviderFirstTest {
+
+ @Autowired
+ IPvp2CredentialProvider credentialProvider;
+ @Autowired
+ IdAustriaClientAuthMetadataProvider provider;
+ @Autowired
+ PvpMetadataResolverFactory resolverFactory;
+
+ private static MockWebServer mockWebServer;
+ private static HttpUrl mockServerUrl;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void classInitializer() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+
+ mockWebServer = new MockWebServer();
+ mockServerUrl = mockWebServer.url("/sp/metadata");
+
+ }
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws ResolverException
+ *
+ */
+ @Before
+ public void testSetup() {
+ provider.fullyDestroy();
+
+ }
+
+ @Test
+ public void simpleManuelAddingTest() throws Pvp2MetadataException, ResolverException {
+ final IPvp2MetadataProvider resolver1 = resolverFactory.createMetadataProvider(
+ "classpath:/data/idp_metadata_sig_notvalid.xml",
+ null, "junit", null);
+ Assert.assertNotNull("Resolver 1 is null", resolver1);
+ provider.addMetadataResolverIntoChain(resolver1);
+
+ final IPvp2MetadataProvider resolver2 = resolverFactory.createMetadataProvider(
+ "classpath:/data/idp_metadata_sig_valid_wrong_alg.xml",
+ null, "junit", null);
+ Assert.assertNotNull("Resolver 2 is null", resolver2);
+ provider.addMetadataResolverIntoChain(resolver2);
+
+ final EntityDescriptor entity1 = provider.getEntityDescriptor("https://localEntity");
+ Assert.assertNotNull("Entity 1 not found", entity1);
+
+ final EntityDescriptor entity2 = provider.getEntityDescriptor(
+ "https://vidp.gv.at/ms_connector/pvp/metadata");
+ Assert.assertNotNull("Entity 2 not found", entity2);
+
+ final EntityDescriptor entity3 = provider.getEntityDescriptor("https://egiz.gv.at/abababa");
+ Assert.assertNull("Entity 3 found", entity3);
+
+ }
+
+ @Test
+ public void dynamicLoadingNoValidSignature() throws ResolverException {
+ final EntityDescriptor entity = provider.getEntityDescriptor("classpath:/data/idp_metadata_no_sig2.xml");
+ Assert.assertNull("Entity found", entity);
+
+ }
+
+ @Test
+ public void dynamicLoadingValidSignature() throws XMLParserException, UnmarshallingException,
+ SamlSigningException, CredentialsNotAvailableException, MarshallingException, ResolverException {
+
+ final String entityId = injectValidHttpMetadata();
+ final EntityDescriptor entity = provider.getEntityDescriptor(entityId);
+ Assert.assertNotNull("Entity not found", entity);
+
+ }
+
+ @Test
+ public void reloadNotPossible() throws XMLParserException, UnmarshallingException,
+ SamlSigningException, CredentialsNotAvailableException, MarshallingException, ResolverException {
+
+ final String entityId = injectValidHttpMetadata();
+ final EntityDescriptor entity = provider.getEntityDescriptor(entityId);
+ Assert.assertNotNull("Entity not found", entity);
+ Assert.assertNotNull("Entity not found",
+ provider.resolveSingle(generateEntityIdCreteria(entityId)));
+
+ Assert.assertFalse("Refresh should not be possible",
+ provider.refreshMetadataProvider(entityId));
+
+ final EntityDescriptor entity2 = provider.getEntityDescriptor(entityId);
+ Assert.assertNull("Entity not found", entity2);
+ Assert.assertNull("Entity not found",
+ provider.resolveSingle(generateEntityIdCreteria(entityId)));
+
+ Assert.assertFalse("Last refresh", provider.wasLastRefreshSuccess());
+
+ }
+
+ @Test
+ public void refeshTest() throws Pvp2MetadataException, ResolverException {
+ Assert.assertFalse("Last refresh", provider.wasLastRefreshSuccess());
+ Assert.assertNull("LastRefresh", provider.getLastRefresh());
+ Assert.assertNull("LastSuccessfulRefresh", provider.getLastSuccessfulRefresh());
+ Assert.assertNull("LastUpdate", provider.getLastUpdate());
+
+ final IPvp2MetadataProvider resolver1 = resolverFactory.createMetadataProvider(
+ "classpath:/data/idp_metadata_sig_notvalid.xml",
+ null, "junit", null);
+ Assert.assertNotNull("Resolver 1 is null", resolver1);
+ provider.addMetadataResolverIntoChain(resolver1);
+
+ final IPvp2MetadataProvider resolver2 = resolverFactory.createMetadataProvider(
+ "classpath:/data/idp_metadata_sig_valid_wrong_alg.xml",
+ null, "junit", null);
+ Assert.assertNotNull("Resolver 2 is null", resolver2);
+ provider.addMetadataResolverIntoChain(resolver2);
+
+ provider.refresh();
+
+ Assert.assertTrue("Last refresh", provider.wasLastRefreshSuccess());
+ Assert.assertNotNull("LastRefresh", provider.getLastRefresh());
+ Assert.assertNotNull("LastSuccessfulRefresh", provider.getLastSuccessfulRefresh());
+ Assert.assertNotNull("LastUpdate", provider.getLastUpdate());
+
+ }
+
+ @Test
+ public void reloadPossible() throws XMLParserException, UnmarshallingException,
+ SamlSigningException, CredentialsNotAvailableException, MarshallingException, ResolverException,
+ IOException {
+
+ mockWebServer.shutdown();
+ mockWebServer = new MockWebServer();
+ mockServerUrl = mockWebServer.url("/sp/metadata");
+
+ final String entityId = injectValidHttpMetadata();
+ final EntityDescriptor entity = provider.getEntityDescriptor(entityId);
+ Assert.assertNotNull("Entity not found", entity);
+ Assert.assertNotNull("Entity not found",
+ provider.resolveSingle(generateEntityIdCreteria(entityId)));
+
+ Assert.assertFalse("Last refresh", provider.wasLastRefreshSuccess());
+
+ injectValidHttpMetadata(entityId);
+ Assert.assertTrue("Refresh should not be possible",
+ provider.refreshMetadataProvider(entityId));
+
+ final EntityDescriptor entity2 = provider.getEntityDescriptor(entityId);
+ Assert.assertNotNull("Entity not found", entity2);
+ Assert.assertNotNull("Entity not found",
+ provider.resolveSingle(generateEntityIdCreteria(entityId)));
+
+ Assert.assertFalse("Last refresh", provider.wasLastRefreshSuccess());
+
+ }
+
+ private String injectValidHttpMetadata() throws SamlSigningException, CredentialsNotAvailableException,
+ XMLParserException, UnmarshallingException, MarshallingException {
+ return injectValidHttpMetadata(mockServerUrl.url().toString()
+ + "/" + RandomStringUtils.randomAlphabetic(5));
+ }
+
+ private String injectValidHttpMetadata(String dynEntityId) throws XMLParserException,
+ UnmarshallingException,
+ MarshallingException, SamlSigningException, CredentialsNotAvailableException {
+ final EntityDescriptor metadata = (EntityDescriptor) XMLObjectSupport.unmarshallFromInputStream(
+ XMLObjectProviderRegistrySupport.getParserPool(),
+ MetadataResolverTest.class.getResourceAsStream("/data/idp_metadata_no_sig.xml"));
+ metadata.setValidUntil(Instant.now().plus(1, ChronoUnit.DAYS));
+ metadata.setSignature(null);
+ metadata.setEntityID(dynEntityId);
+ Saml2Utils.signSamlObject(metadata, credentialProvider.getMetaDataSigningCredential(), true);
+ final Element metadataElement = XMLObjectSupport.marshall(metadata);
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody(SerializeSupport.nodeToString(metadataElement))
+ .setHeader("Content-Type", "text/html;charset=utf-8"));
+
+ return dynEntityId;
+
+ }
+
+ private CriteriaSet generateEntityIdCreteria(String entityId) {
+ final CriteriaSet result = new CriteriaSet();
+ result.add(new EntityIdCriterion(entityId));
+ return result;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderSecondTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderSecondTest.java
new file mode 100644
index 00000000..3ee6ddcd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientAuthMetadataProviderSecondTest.java
@@ -0,0 +1,66 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import net.shibboleth.utilities.java.support.resolver.ResolverException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class IdAustriaClientAuthMetadataProviderSecondTest {
+
+ @Autowired
+ IdAustriaClientAuthMetadataProvider provider;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void classInitializer() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+
+ }
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws ResolverException
+ *
+ */
+ @Before
+ public void testSetup() {
+ provider.fullyDestroy();
+
+ }
+
+ @Test
+ public void notTrustedX509CertsInTrustStore() throws ResolverException {
+ final EntityDescriptor entity = provider.getEntityDescriptor("classpath:/data/idp_metadata_no_sig2.xml");
+ Assert.assertNull("Entity found", entity);
+
+ }
+
+ @Test
+ public void readStaticInfos() {
+ Assert.assertEquals("wrong providerId",
+ IdAustriaClientAuthMetadataProvider.PROVIDER_ID, provider.getId());
+
+ provider.runGarbageCollector();
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientCredentialProviderTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientCredentialProviderTest.java
new file mode 100644
index 00000000..bdc0df15
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/idaustriaclient/IdAustriaClientCredentialProviderTest.java
@@ -0,0 +1,414 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.idaustriaclient;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.google.common.base.Optional;
+import com.google.common.base.Predicates;
+import com.google.common.base.Throwables;
+import com.google.common.collect.FluentIterable;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.EaafFactoryException;
+import at.gv.egiz.eaaf.modules.pvp2.api.credential.EaafX509Credential;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_basic_lazy.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+@DirtiesContext
+public class IdAustriaClientCredentialProviderTest {
+
+ private static final String PATH_JKS = "../keystore/junit_test.jks";
+ private static final String ALIAS_METADATA = "meta";
+ private static final String ALIAS_SIGN = "sig";
+ private static final String ALIAS_ENC = "enc";
+ private static final String PASSWORD = "password";
+
+ @Autowired
+ private ApplicationContext context;
+ @Autowired(required = true)
+ protected MsConnectorDummyConfigMap config;
+
+ /**
+ * jUnit test initializer.
+ */
+ @Before
+ public void initialize() {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH, PATH_JKS);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PASSWORD, PASSWORD);
+
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS);
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD);
+
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS);
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD);
+
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS);
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD);
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void noKeyStoreUrl() {
+ config.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH);
+ try {
+ context.getBean(IdAustriaClientAuthCredentialProvider.class);
+ Assert.fail("No KeyStore not detected");
+
+ } catch (final BeansException e) {
+ org.springframework.util.Assert.isInstanceOf(EaafConfigurationException.class,
+ e.getCause(), "Wrong exception");
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void noKeyStore() {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH,
+ "src/test/resources/config/notExist.p12");
+ try {
+ context.getBean(IdAustriaClientAuthCredentialProvider.class);
+ Assert.fail("No KeyStore not detected");
+
+ } catch (final BeansException e) {
+ final Optional<Throwable> eaafException = FluentIterable.from(
+ Throwables.getCausalChain(e)).filter(
+ Predicates.instanceOf(EaafConfigurationException.class)).first();
+ Assert.assertTrue("Wrong exception", eaafException.isPresent());
+ Assert.assertEquals("Wrong errorId", "internal.keystore.06",
+ ((EaafException) eaafException.get()).getErrorId());
+
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void noWrongKeyStorePassword() {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PASSWORD, "test");
+ try {
+ context.getBean(IdAustriaClientAuthCredentialProvider.class);
+ Assert.fail("No KeyStore not detected");
+
+ } catch (final BeansException e) {
+ final Optional<Throwable> eaafException = FluentIterable.from(
+ Throwables.getCausalChain(e)).filter(
+ Predicates.instanceOf(EaafFactoryException.class)).first();
+ Assert.assertTrue("Wrong exception", eaafException.isPresent());
+ Assert.assertEquals("Wrong errorId", "internal.keystore.06",
+ ((EaafException) eaafException.get()).getErrorId());
+
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfigurationWrongAlias() {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMessageSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMessageEncryptionCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfigurationWrongPassword() {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMessageSigningCredential();
+ Assert.fail("No message signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ final EaafX509Credential encCred = credential.getMessageEncryptionCredential();
+ Assert.assertNull("No encryption signing credentials not detected", encCred);
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfigurationValidAliasWrongPassword() {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS,
+ ALIAS_METADATA);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS,
+ ALIAS_SIGN);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMessageSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS,
+ ALIAS_ENC);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD,
+ RandomStringUtils.randomAlphabetic(5));
+ credential.getMessageEncryptionCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfigurationWrongAliasValidPassword() {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMessageSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS,
+ RandomStringUtils.randomAlphabetic(5));
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMessageEncryptionCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+ }
+
+ @Test
+ @DirtiesContext
+ public void validonfiguration() throws CredentialsNotAvailableException {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_ALIAS,
+ ALIAS_METADATA);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_METADATA_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMetaDataSigningCredential();
+
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS,
+ ALIAS_SIGN);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMessageSigningCredential();
+
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_ALIAS,
+ ALIAS_ENC);
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ENCRYPTION_KEY_PASSWORD,
+ PASSWORD);
+ credential.getMessageEncryptionCredential();
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfiguration() {
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ credential.getMessageSigningCredential();
+ Assert.fail("No message signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ final EaafX509Credential encCred = credential.getMessageEncryptionCredential();
+ Assert.assertNull("No encryption signing credentials not detected", encCred);
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ }
+
+ @Test
+ @DirtiesContext
+ public void notKeyConfigurationPkcs12() {
+ config.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_KEYSTORE_PATH,
+ "../keystore/pvp.p12");
+ final IdAustriaClientAuthCredentialProvider credential = context.getBean(
+ IdAustriaClientAuthCredentialProvider.class);
+
+ Assert.assertNotNull("Credetialprovider", credential);
+ Assert.assertNotNull("Friendlyname", credential.getFriendlyName());
+
+ try {
+ credential.getMetaDataSigningCredential();
+ Assert.fail("No Metadata signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ credential.getMessageSigningCredential();
+ Assert.fail("No message signing credentials not detected");
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+
+ try {
+ final EaafX509Credential encCred = credential.getMessageEncryptionCredential();
+ Assert.assertNull("No encryption signing credentials not detected", encCred);
+
+ } catch (final CredentialsNotAvailableException e) {
+ Assert.assertTrue("Wrong errorCode", e.getMessage().contains("internal.pvp.01"));
+
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java
new file mode 100644
index 00000000..3814c632
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java
@@ -0,0 +1,1042 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.github.skjolber.mockito.soap.SoapServiceRule;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.IZmrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.CountrySpecificDetailSearchProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.GenericEidProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.AlternativeSearchTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients.ZmrClientTest;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.bmi.namespace.zmr_su.base._20040201.RequestType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetAnlageType;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
+import eu.eidas.auth.commons.attribute.PersonType;
+import eu.eidas.auth.commons.light.impl.LightRequest;
+import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml",
+ "/SpringTest-context_ccSearchProcessor_test.xml"
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+public class AlternativeSearchTaskWithRegisterTest {
+
+ @Rule
+ public SoapServiceRule soap = SoapServiceRule.newInstance();
+
+ @Mock private IErnpClient ernpClient;
+
+ @Autowired private IZmrClient zmrClient;
+ @Autowired private List<CountrySpecificDetailSearchProcessor> handlers;
+ private RegisterSearchService registerSearchService;
+
+ private ServicePort zmrMock = null;
+
+ private final ICcSpecificEidProcessingService eidPostProcessor = createEidPostProcessor();
+ private AlternativeSearchTask task;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+ private static JAXBContext jaxbContext;
+
+
+ /**
+ * Initialize jUnit class.
+ */
+ @BeforeClass
+ @SneakyThrows
+ public static void classInitializer() {
+ jaxbContext = JAXBContext.newInstance(
+ at.gv.bmi.namespace.zmr_su.zmr._20040201.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.gis._20070725.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.base._20040201.ObjectFactory.class);
+ }
+
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void setUp() throws URISyntaxException, EaafStorageException {
+ if (zmrMock == null) {
+ zmrMock = soap.mock(ServicePort.class, "http://localhost:1234/demozmr");
+
+ }
+
+ registerSearchService = new RegisterSearchService(handlers, zmrClient, ernpClient);
+ task = new AlternativeSearchTask(registerSearchService, eidPostProcessor);
+
+ MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ MockHttpServletResponse httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void missingStateInfoFirstEidasData() {
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(null,
+ Arrays.asList(RegisterResult.builder()
+ .bpk("")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "step11", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+ assertEquals("wrong errorparam 1", "No initial eIDAS authn data",
+ ((EaafException) exception.getOriginalException()).getParams()[1]);
+
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void missingStateInfoIntermediateMatchingState() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .build());
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "step11", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+ assertEquals("wrong errorparam 1", "No intermediate matching-state",
+ ((EaafException) exception.getOriginalException()).getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void countryCodeNotMatch() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(null,
+ Arrays.asList(RegisterResult.builder()
+ .bpk("")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "EE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "step11", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+ assertEquals("wrong errorparam 1", "Country Code of alternative eIDAS authn not matching",
+ ((EaafException) exception.getOriginalException()).getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void mdsNoMatch() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(null,
+ Arrays.asList(RegisterResult.builder()
+ .bpk("")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXClaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1995-12-31"));
+
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "step11", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+ assertEquals("wrong errorparam 1", "MDS of alternative eIDAS authn does not match initial authn",
+ ((EaafException) exception.getOriginalException()).getParams()[1]);
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachPersonalIdMoreThanOneResult() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState);
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "searchWithPersonalIdentifier", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ checkBasicRequestParameters(zmrReq.getValue(), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkEidasDocumentResult(zmrReq.getValue().getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachPersonalIdNoBpkMatchWithIntermediateResults() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(null,
+ Arrays.asList(RegisterResult.builder()
+ .bpk("notExists")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "step7bKittProcess", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertFalse("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+ assertEquals("wrong errorparam 1", "Register result from alternativ authentication does not fit into intermediate state",
+ ((EaafException) exception.getOriginalException()).getParams()[1]);
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkEidasDocumentResult(zmrReq.getValue().getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachPersonalIdSuccess() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-6_kitt_update_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ //INFO: has to be the old givenName because ZMR allows no update of MDS information
+ checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg",
+ "XXXClaus - Maria", "1994-12-31", "DE");
+ assertNull("wrong executionContextFlag 'alternative eIDAS result'",
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+
+ // validate request
+ assertEquals("wrong number of req.", 4, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(0).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+
+ assertNotNull("Personensuche KITT req.", zmrReq.getAllValues().get(1).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ assertNotNull("PersonAender KITT req.", zmrReq.getAllValues().get(2).getPersonAendernRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_UPDATE,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ assertEquals("wrong number of eIDAS Docs to Add", 4,
+ zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size());
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/DateOfBirth", "DE", "1994-12-31");
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName", "DE", "XXXKlaus - Maria");
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName", "DE", "XXXvon Brandenburg");
+
+ assertNotNull("Personensuche KITT req.", zmrReq.getAllValues().get(3).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(3), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachCcSpecificSuccess() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-6_kitt_update_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-10_kitt_update_resp.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ //INFO: has to be the old givenName because ZMR allows no update of MDS information
+ checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg",
+ "XXXClaus - Maria", "1994-12-31", "DE");
+ assertNull("wrong executionContextFlag 'alternative eIDAS result'",
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+
+ // validate request
+ assertEquals("wrong number of req.", 6, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(0).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ assertNotNull("Personensuche CC-specific req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "DE", "Hintergigritzpotschn");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "DE", "XXXvon Heuburg");
+
+
+ assertNotNull("Personensuche KITT req.", zmrReq.getAllValues().get(2).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ assertNotNull("PersonAender KITT req.", zmrReq.getAllValues().get(3).getPersonAendernRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(3), ZmrClientTest.PROCESS_TASK_UPDATE,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ assertNotNull("Personensuche KITT req.", zmrReq.getAllValues().get(4).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(4), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ assertNotNull("PersonAender KITT req.", zmrReq.getAllValues().get(5).getPersonAendernRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(5), ZmrClientTest.PROCESS_TASK_UPDATE,
+ new BigInteger("367100000000079"), "jUnit123456");
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachCcSpecificNotPossible() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("EE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "EE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+ assertNull("final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+ assertEquals("wrong executionContextFlag 'alternative eIDAS result'", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+
+ // validate request
+ assertEquals("wrong number of req.", 1, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(0).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "EE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachCcSpecificMoreThanOneResult() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertEquals("wrong errorparam 1", "searchWithCountrySpecifics", ((EaafException) exception.getOriginalException()).getParams()[0]);
+ assertTrue("Wrong flag 'step11'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(0).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ assertNotNull("Personensuche CC-specific req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "DE", "Hintergigritzpotschn");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "DE", "XXXvon Heuburg");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void seachCcSpecificEmptyResult() {
+ //inject initial eIDAS data
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, SimpleEidasData.builder()
+ .personalIdentifier("DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .pseudonym("cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .citizenCountryCode("DE")
+ .build());
+
+ // inject matching intermediate state
+ RegisterStatusResults matchingState = new RegisterStatusResults(
+ new RegisterOperationStatus(new BigInteger(RandomStringUtils.randomNumeric(5))),
+ Arrays.asList(RegisterResult.builder()
+ .bpk("UgeknNsc26lVuB7U/uYGVmWtnnA=")
+ .givenName("XXXKlaus - Maria")
+ .familyName("XXXvon Brandenburg")
+ .dateOfBirth("1994-12-31")
+ .pseudonym(Arrays.asList("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"))
+ .build()),
+ Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, matchingState );
+
+ //inject alternative eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ // inject response
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier("7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "DE"))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), any()))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+ assertNull("final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+ assertEquals("wrong executionContextFlag 'alternative eIDAS result'", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.25", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+
+
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH,
+ matchingState.getOperationStatus().getZmrProcessId(), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(0).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "DE", "7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit");
+
+ assertNotNull("Personensuche CC-specific req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "DE", "Hintergigritzpotschn");
+ checkEidasDocumentResult(zmrReq.getAllValues().get(1).getPersonSuchenRequest().getEidasSuchdaten(),
+ "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "DE", "XXXvon Heuburg");
+
+ }
+
+ @NotNull
+ private ICcSpecificEidProcessingService createEidPostProcessor() {
+ return new ICcSpecificEidProcessingService() {
+
+ private final GenericEidProcessor genericEidProcessor = new GenericEidProcessor();
+
+ @Override
+ public SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException, EidasAttributeException {
+ return genericEidProcessor.postProcess(eidasAttrMap);
+ }
+
+ @Override
+ public void preProcess(String selectedCC, IRequest pendingReq, LightRequest.Builder authnRequestBuilder) {
+ genericEidProcessor.preProcess(pendingReq, authnRequestBuilder);
+ }
+ };
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult, BigInteger processId) {
+ return new ZmrRegisterResult(Collections.singletonList(registerResult), processId);
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult) {
+ return zmrRegisterResult(registerResult, generateRandomProcessId());
+ }
+
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ private void checkMatchingSuccessState(IRequest pendingReq, String bpk, String familyName, String givenName,
+ String birhday, String countryCode) {
+ assertNull("Find intermediate matching data but matching should be finished",
+ MatchingTaskUtils.getIntermediateMatchingResult(pendingReq));
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+
+ MatchedPersonResult personInfo = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", personInfo);
+ assertEquals("wrong bpk", bpk, personInfo.getBpk());
+ assertEquals("wrong givenName", givenName, personInfo.getGivenName());
+ assertEquals("wrong familyName", familyName, personInfo.getFamilyName());
+ assertEquals("wrong dateOfBirth", birhday, personInfo.getDateOfBirth());
+ assertEquals("wrong countryCode", countryCode, personInfo.getCountryCode());
+
+ }
+
+ private void checkIntermediateResult(int resultSize) {
+ Boolean transitionGUI = (Boolean) executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK);
+ Assert.assertTrue("Wrong transition", transitionGUI);
+ Boolean transitionErnb = (Boolean) executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+ Assert.assertNull("Wrong transition", transitionErnb);
+
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+ assertNull("Find final matching data but no match sould be found",
+ MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ RegisterStatusResults result = MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+ assertNotNull("Find no intermediate matching data", result);
+ assertEquals("wrong intermediate result size", resultSize, result.getResultCount());
+
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, null, null);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponseDE(String givenName, String familyName, String identifier,
+ String dateOfBirth, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, placeOfBirth, birthName);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth, String taxNumber, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ ImmutableAttributeMap.Builder builder = ImmutableAttributeMap.builder()
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_PERSONALIDENTIFIER,
+ randomAlphabetic(2), randomAlphabetic(2)), identifier)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTFAMILYNAME,
+ randomAlphabetic(3), randomAlphabetic(3)), familyName)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTGIVENNAME,
+ randomAlphabetic(4), randomAlphabetic(4)), givenName)
+ .put(generateDateTimeAttribute(Constants.eIDAS_ATTR_DATEOFBIRTH,
+ randomAlphabetic(5), randomAlphabetic(5)), dateOfBirth);
+ if (taxNumber != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_TAXREFERENCE,
+ randomAlphabetic(6), randomAlphabetic(6)), taxNumber);
+ }
+ if (birthName != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_BIRTHNAME,
+ randomAlphabetic(7), randomAlphabetic(7)), birthName);
+ }
+ if (placeOfBirth != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_PLACEOFBIRTH,
+ randomAlphabetic(8), randomAlphabetic(8)), placeOfBirth);
+ }
+ final ImmutableAttributeMap attributeMap = builder.build();
+
+ return new AuthenticationResponse.Builder().id(randomAlphabetic(5))
+ .issuer(randomAlphabetic(5)).subject(randomAlphabetic(5)).statusCode("200")
+ .inResponseTo(randomAlphabetic(5)).subjectNameIdFormat(randomAlphabetic(5))
+ .attributes(attributeMap).build();
+ }
+
+ private AttributeDefinition<Object> generateStringAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".LiteralStringAttributeValueMarshaller");
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private AttributeDefinition<Object> generateDateTimeAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".DateTimeAttributeValueMarshaller");
+ }
+
+ private AttributeDefinition<Object> generateAttribute(String friendlyName, String fragment, String prefix,
+ String marshaller) throws URISyntaxException {
+ return AttributeDefinition.builder()
+ .friendlyName(friendlyName).nameUri(new URI("ad", "sd", fragment))
+ .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", prefix))
+ .attributeValueMarshaller(marshaller).build();
+ }
+
+ private ResponseType loadResponseFromFile(String filepath) throws JAXBException {
+ final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ JAXBElement<?> resp = (JAXBElement<?>) unmarshaller.unmarshal(ZmrClientTest.class.getResourceAsStream(
+ filepath));
+ return (ResponseType) resp.getValue();
+
+ }
+
+ private void checkBasicRequestParameters(RequestType requestType, String vorgangName, BigInteger processId,
+ String behoerdennummer) {
+ assertNotNull("no workflow infos", requestType.getWorkflowInfoClient());
+ assertEquals("processName", ZmrClientTest.PROCESS_GENERAL, requestType.getWorkflowInfoClient().getProzessName());
+ assertEquals("vorgangsName", vorgangName, requestType.getWorkflowInfoClient().getVorgangName());
+
+ if (processId != null) {
+ assertEquals("processId", processId, requestType.getWorkflowInfoClient().getProzessInstanzID());
+ } else {
+ assertNull("processId", requestType.getWorkflowInfoClient().getProzessInstanzID());
+ }
+
+ assertNotNull("no client infos", requestType.getClientInfo());
+ assertEquals("behoerdennummer", behoerdennummer, requestType.getClientInfo().getOrganisation()
+ .getBehoerdenNr());
+ }
+
+ private void checkEidasDocumentResult(List<EidasSuchdatenType> list, String type, String cc, String value) {
+ Optional<EidasSuchdatenType> eidasDoc = list.stream()
+ .filter(el -> type.equals(el.getEidasArt()))
+ .findFirst();
+
+ assertTrue("eidas doc: " + type, eidasDoc.isPresent());
+ assertEquals("eIDAS docType", type, eidasDoc.get().getEidasArt());
+ assertEquals("eIDAS docValue", value, eidasDoc.get().getEidasWert());
+ assertEquals("eIDAS docCC", cc, eidasDoc.get().getStaatscode2());
+
+ }
+
+
+ private void checkEidasDocumentAdd(List<EidasIdentitaetAnlageType> list, String type, String cc, String value) {
+ Optional<EidasIdentitaetAnlageType> eidasDoc = list.stream()
+ .filter(el -> type.equals(el.getEidasArt()))
+ .findFirst();
+
+ assertTrue("eidas doc: " + type, eidasDoc.isPresent());
+ assertEquals("eIDAS docType", type, eidasDoc.get().getEidasArt());
+ assertEquals("eIDAS docValue", value, eidasDoc.get().getEidasWert());
+ assertEquals("eIDAS docCC", cc, eidasDoc.get().getStaatscode2());
+ }
+
+ @NotNull
+ private ErnpRegisterResult emptyErnpRegisterResult() {
+ return new ErnpRegisterResult(Collections.emptyList());
+ }
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java
index f8971705..023c196c 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskEidNewTest.java
@@ -4,7 +4,7 @@ import static at.asitplus.eidas.specific.core.MsEidasNodeConstants.PROP_CONFIG_S
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.powermock.api.mockito.PowerMockito.when;
+import static org.mockito.Mockito.when;
import java.net.URISyntaxException;
import java.security.KeyStore;
@@ -23,6 +23,8 @@ import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
import org.jose4j.jwa.AlgorithmConstraints;
import org.jose4j.jwa.AlgorithmConstraints.ConstraintType;
import org.jose4j.jws.AlgorithmIdentifiers;
@@ -32,7 +34,6 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
@@ -45,15 +46,24 @@ import org.springframework.web.context.request.ServletRequestAttributes;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.skjolber.mockito.soap.SoapServiceRule;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.SzrCommunicationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils.JwsResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.IRequestStorage;
import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
@@ -73,8 +83,10 @@ import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
import at.gv.egiz.eaaf.core.impl.utils.Random;
import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.AttributeValue;
import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
import eu.eidas.auth.commons.attribute.ImmutableAttributeMap.Builder;
+import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
import lombok.val;
import szrservices.GetIdentityLinkEidasResponse;
@@ -86,7 +98,6 @@ import szrservices.SignContentEntry;
import szrservices.SignContentResponseType;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
@@ -105,6 +116,9 @@ public class CreateIdentityLinkTaskEidNewTest {
EaafKeyStoreFactory keyStoreFactory;
@Autowired
+ ICcSpecificEidProcessingService eidPostProcessor;
+
+ @Autowired
private IRequestStorage requestStorage;
final ExecutionContext executionContext = new ExecutionContextImpl();
@@ -123,25 +137,27 @@ public class CreateIdentityLinkTaskEidNewTest {
AlgorithmIdentifiers.RSA_PSS_USING_SHA512));
private static ObjectMapper mapper = new ObjectMapper();
-
+
private AuthenticationResponse response;
-
+ private MatchedPersonResult matchingInfos;
+
@Rule
public final SoapServiceRule soap = SoapServiceRule.newInstance();
/**
* jUnit test set-up.
+ * @throws EidasAttributeException
+ * @throws EidPostProcessingException
*/
@Before
- public void setUp() throws EaafStorageException, URISyntaxException {
+ public void setUp() throws EaafStorageException, URISyntaxException, EidPostProcessingException, EidasAttributeException {
httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
httpResp = new MockHttpServletResponse();
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
- basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.workarounds.use.getidentitylink.for.ida", "true");
final Map<String, String> spConfig = new HashMap<>();
spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");
@@ -153,14 +169,27 @@ public class CreateIdentityLinkTaskEidNewTest {
response = buildDummyAuthResponse(false);
pendingReq.getSessionData(AuthProcessDataWrapper.class)
.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
-
+
+ final Map<String, Object> eidasAttributes = convertEidasAttrToSimpleMap(
+ response.getAttributes().getAttributeMap());
+ final SimpleEidasData eidData = eidPostProcessor.postProcess(eidasAttributes);
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, eidData);
+
+ matchingInfos = MatchedPersonResult.builder()
+ .bpk(RandomStringUtils.randomAlphabetic(5))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .countryCode(eidData.getCitizenCountryCode())
+ .build();
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, matchingInfos);
pendingReq.setSpConfig(oaParam);
pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());
pendingReq.setAuthUrl("http://test.com/");
pendingReq.setTransactionId("avaasbav");
pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
-
+
executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "XX");
executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true);
@@ -173,27 +202,39 @@ public class CreateIdentityLinkTaskEidNewTest {
response = buildDummyAuthResponse(true);
pendingReq.getSessionData(AuthProcessDataWrapper.class)
.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
-
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
+
+ SimpleEidasData eidData = eidPostProcessor.postProcess(
+ convertEidasAttrToSimpleMap(response.getAttributes().getAttributeMap()));
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, eidData);
+
+ matchingInfos = MatchedPersonResult.builder()
+ .bpk(RandomStringUtils.randomAlphabetic(5))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .countryCode(eidData.getCitizenCountryCode())
+ .build();
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, matchingInfos);
+
String vsz = RandomStringUtils.randomNumeric(10);
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);
- val signContentResp = new SignContentResponseType();
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(vsz);
+ SignContentResponseType signContentResp = new SignContentResponseType();
final SignContentEntry signContentEntry = new SignContentEntry();
signContentEntry.setValue(RandomStringUtils.randomAlphanumeric(10));
signContentResp.getOut().add(signContentEntry);
- when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp);
+ when(szrMock.signContent(any(), any(), any())).thenReturn(signContentResp);
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
//perform test
task.execute(pendingReq, executionContext);
- //validate state
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -201,16 +242,12 @@ public class CreateIdentityLinkTaskEidNewTest {
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNotNull("AuthBlock", authBlock);
-
+
Assert.assertTrue("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
-
+
// check authblock signature
final AlgorithmConstraints constraints = new AlgorithmConstraints(ConstraintType.PERMIT,
BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.toArray(new String[BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.size()]));
@@ -218,52 +255,47 @@ public class CreateIdentityLinkTaskEidNewTest {
X509Certificate[] trustedCerts = EaafKeyStoreUtils
.getPrivateKeyAndCertificates(keyStore.getFirst(), ALIAS, PW.toCharArray(), true, "junit").getSecond();
JwsResult result = JoseUtils.validateSignature(authBlock, Arrays.asList(trustedCerts), constraints);
- Assert.assertTrue("AuthBlock not valid", result.isValid());
- JsonNode authBlockJson = mapper.readTree(result.getPayLoad());
+ Assert.assertTrue("AuthBlock not valid", result.isValid());
+ JsonNode authBlockJson = mapper.readTree(result.getPayLoad());
Assert.assertNotNull("deserialized AuthBlock", authBlockJson);
-
- Assert.assertNotNull("no piiTransactionId in pendingRequesdt",
+
+ Assert.assertNotNull("no piiTransactionId in pendingRequesdt",
storedPendingReq.getUniquePiiTransactionIdentifier());
- Assert.assertEquals("piiTransactionId", storedPendingReq.getUniquePiiTransactionIdentifier(),
+ Assert.assertEquals("piiTransactionId", storedPendingReq.getUniquePiiTransactionIdentifier(),
authBlockJson.get("piiTransactionId").asText());
- Assert.assertEquals("appId", randomTestSp, authBlockJson.get("appId").asText());
+ Assert.assertEquals("appId", randomTestSp, authBlockJson.get("appId").asText());
Assert.assertFalse("'challenge' is null", authBlockJson.get("challenge").asText().isEmpty());
Assert.assertFalse("'timestamp' is null", authBlockJson.get("timestamp").asText().isEmpty());
Assert.assertFalse("binding pubKey", authBlockJson.has("bindingPublicKey"));
+
// check vsz request
ArgumentCaptor<PersonInfoType> argument4 = ArgumentCaptor.forClass(PersonInfoType.class);
- ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
+ ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
verify(szrMock, times(1)).getStammzahlEncrypted(argument4.capture(), argument5.capture());
-
+
Boolean param5 = argument5.getValue();
- Assert.assertFalse("insertERnP flag", param5);
+ Assert.assertFalse("insertERnP flag", param5);
PersonInfoType person = argument4.getValue();
- Assert.assertEquals("FamilyName", "Mustermann", person.getPerson().getName().getFamilyName());
- Assert.assertEquals("GivenName", "Hans", person.getPerson().getName().getGivenName());
- Assert.assertEquals("DateOfBirth", "1989-05-05", person.getPerson().getDateOfBirth());
- Assert.assertEquals("bpk", "1NjpYBHFn6onfNp2pCM8nXrlyQc=", person.getPerson().getIdentification().getValue());
- Assert.assertEquals("bPKType", EaafConstants.URN_PREFIX_CDID + "ZP", person.getPerson().getIdentification().getType());
-
-// Assert.assertEquals("PlaceOfBirth",
-// response.getAttributes().getAttributeValuesByFriendlyName("PlaceOfBirth").getFirstValue(
-// response.getAttributes().getDefinitionsByFriendlyName("PlaceOfBirth").iterator().next()),
-// person.getPerson().getPlaceOfBirth());
-// Assert.assertEquals("BirthName",
-// response.getAttributes().getAttributeValuesByFriendlyName("BirthName").getFirstValue(
-// response.getAttributes().getDefinitionsByFriendlyName("BirthName").iterator().next()),
-// person.getPerson().getAlternativeName().getFamilyName());
-//
-// Assert.assertEquals("CitizenCountry", "LU", person.getTravelDocument().getIssuingCountry());
-// Assert.assertEquals("DocumentType", "ELEKTR_DOKUMENT", person.getTravelDocument().getDocumentType());
-//
-// Assert.assertEquals("Identifier",
-// response.getAttributes().getAttributeValuesByFriendlyName("PersonIdentifier").getFirstValue(
-// response.getAttributes().getDefinitionsByFriendlyName("PersonIdentifier").iterator().next())
-// .toString().split("/")[2],
-// person.getTravelDocument().getDocumentNumber());
-
+ Assert.assertEquals("FamilyName",
+ response.getAttributes().getAttributeValuesByFriendlyName("FamilyName").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("FamilyName").iterator().next()),
+ person.getPerson().getName().getFamilyName());
+ Assert.assertEquals("GivenName",
+ response.getAttributes().getAttributeValuesByFriendlyName("FirstName").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("FirstName").iterator().next()),
+ person.getPerson().getName().getGivenName());
+ Assert.assertEquals("DateOfBirth",
+ response.getAttributes().getAttributeValuesByFriendlyName("DateOfBirth").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("DateOfBirth").iterator().next())
+ .toString().split("T")[0],
+ person.getPerson().getDateOfBirth());
+
+ Assert.assertNull("PlaceOfBirth", person.getPerson().getPlaceOfBirth());
+ Assert.assertNull("BirthName", person.getPerson().getAlternativeName());
+ Assert.assertNull("TravelDocument", person.getTravelDocument());
+
// check bcBind singing request
ArgumentCaptor<Boolean> argument1 = ArgumentCaptor.forClass(Boolean.class);
ArgumentCaptor<List<JwsHeaderParam>> argument2 = ArgumentCaptor.forClass(List.class);
@@ -271,66 +303,67 @@ public class CreateIdentityLinkTaskEidNewTest {
verify(szrMock, times(1)).signContent(argument1.capture(), argument2.capture(), argument3.capture());
Boolean param1 = argument1.getValue();
Assert.assertFalse("addCert flag", param1);
-
+
List<JwsHeaderParam> param2 = argument2.getValue();
- Assert.assertNotNull("JWS Headers", param2);
+ Assert.assertNotNull("JWS Headers", param2);
Assert.assertFalse("JWS Headers empty", param2.isEmpty());
Assert.assertEquals("Wrong JWS header size", 1, param2.size());
Assert.assertEquals("Missing JWS header key", "urn:at.gv.eid:bindtype", param2.get(0).getKey());
Assert.assertEquals("Missing JWS header value", "urn:at.gv.eid:eidasBind", param2.get(0).getValue());
-
+
List<SignContentEntry> param3 = argument3.getValue();
Assert.assertNotNull("sign Payload", param3);
- Assert.assertEquals("wrong sign-payload size", 1, param3.size());
- Assert.assertNotNull("payload", param3.get(0).getValue().getBytes());
+ Assert.assertEquals("wrong sign-payload size", 1, param3.size());
+ Assert.assertNotNull("payload", param3.get(0).getValue().getBytes());
JsonNode bcBind = mapper.readTree(param3.get(0).getValue().getBytes());
Assert.assertNotNull("bcbind req", bcBind);
-
+
Assert.assertEquals("vsz", vsz, bcBind.get("urn:eidgvat:attributes.vsz.value").asText());
- Assert.assertEquals("eid status", "urn:eidgvat:eid.status.eidas",
+ Assert.assertEquals("eid status", "urn:eidgvat:eid.status.eidas",
bcBind.get("urn:eidgvat:attributes.eid.status").asText());
Assert.assertTrue("pubKeys", bcBind.has("urn:eidgvat:attributes.user.pubkeys"));
- Assert.assertTrue("pubKeys", bcBind.get("urn:eidgvat:attributes.user.pubkeys").isArray());
+ Assert.assertTrue("pubKeys", bcBind.get("urn:eidgvat:attributes.user.pubkeys").isArray());
Iterator<JsonNode> pubKeys = bcBind.get("urn:eidgvat:attributes.user.pubkeys").elements();
Assert.assertTrue("No PubKey", pubKeys.hasNext());
- Assert.assertEquals("Wrong pubKey",
+ Assert.assertEquals("Wrong pubKey",
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmxcB5jnrAwGn7xjgVFv1UBUv1pluwDRFQx7x5O6rSn7pblYfwaWeKa8y"
+ "jS5BDDaZ00mhhnSlm2XByNrkg5yBGetTgBGtQVAxV5apfuAWN8TS3uSXgdZol7Khd6kraUITtnulvLe8tNaboom5P0zN6UxbJN"
+ "NVLishVp80HiRXiDbplCTUk8b5cYtmivdb0+5JBTa7L5N/anRVnHHoJCXgNPTouO8daUHZbG1mPk0HgqD8rhZ+OBzE+APKH9No"
- + "agedSrGRDLdIgZxkrg0mxmfsZQIi2wdJSi3y0PAjEps/s4j0nmw9bPRgCMNLBqqjxtN5JKC8E1yyLm7YefXv/nPaMwIDAQAB",
+ + "agedSrGRDLdIgZxkrg0mxmfsZQIi2wdJSi3y0PAjEps/s4j0nmw9bPRgCMNLBqqjxtN5JKC8E1yyLm7YefXv/nPaMwIDAQAB",
pubKeys.next().asText());
Assert.assertFalse("More than one PubKey", pubKeys.hasNext());
-
+
}
@Test
- public void successfulProcessWithStandardInfosWithoutIdl() throws Exception {
+ public void successfulProcessWithDataFromMatching() throws Exception {
//initialize test
- basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.workarounds.use.getidentitylink.for.ida", "false");
-
String vsz = RandomStringUtils.randomNumeric(10);
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);
- val signContentResp = new SignContentResponseType();
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(vsz);
+ SignContentResponseType signContentResp = new SignContentResponseType();
final SignContentEntry signContentEntry = new SignContentEntry();
signContentEntry.setValue(RandomStringUtils.randomAlphanumeric(10));
signContentResp.getOut().add(signContentEntry);
- when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp);
-
+
+ when(szrMock.signContent(any(), any(), any())).thenReturn(signContentResp);
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
String bindingPubKey = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, bindingPubKey);
+
//perform test
task.execute(pendingReq, executionContext);
-
- //validate state
+
+
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -339,6 +372,7 @@ public class CreateIdentityLinkTaskEidNewTest {
// check authblock signature
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNotNull("AuthBlock", authBlock);
+
final AlgorithmConstraints constraints = new AlgorithmConstraints(ConstraintType.PERMIT,
BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.toArray(new String[BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.size()]));
Pair<KeyStore, Provider> keyStore = getKeyStore();
@@ -361,122 +395,108 @@ public class CreateIdentityLinkTaskEidNewTest {
Assert.assertTrue("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
// check vsz request
ArgumentCaptor<PersonInfoType> argument4 = ArgumentCaptor.forClass(PersonInfoType.class);
- ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
+ ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
verify(szrMock, times(1)).getStammzahlEncrypted(argument4.capture(), argument5.capture());
-
+
Boolean param5 = argument5.getValue();
- Assert.assertTrue("insertERnP flag", param5);
+ Assert.assertFalse("insertERnP flag", param5);
PersonInfoType person = argument4.getValue();
- Assert.assertEquals("FamilyName",
- response.getAttributes().getAttributeValuesByFriendlyName("FamilyName").getFirstValue(
- response.getAttributes().getDefinitionsByFriendlyName("FamilyName").iterator().next()),
+ Assert.assertEquals("FamilyName",
+ matchingInfos.getFamilyName(),
person.getPerson().getName().getFamilyName());
- Assert.assertEquals("GivenName",
- response.getAttributes().getAttributeValuesByFriendlyName("FirstName").getFirstValue(
- response.getAttributes().getDefinitionsByFriendlyName("FirstName").iterator().next()),
+ Assert.assertEquals("GivenName",
+ matchingInfos.getGivenName(),
person.getPerson().getName().getGivenName());
- Assert.assertEquals("DateOfBirth",
- response.getAttributes().getAttributeValuesByFriendlyName("DateOfBirth").getFirstValue(
- response.getAttributes().getDefinitionsByFriendlyName("DateOfBirth").iterator().next())
- .toString().split("T")[0],
+ Assert.assertEquals("DateOfBirth",
+ matchingInfos.getDateOfBirth(),
person.getPerson().getDateOfBirth());
+ Assert.assertEquals("bPK",
+ matchingInfos.getBpk(),
+ person.getPerson().getIdentification().getValue());
+ Assert.assertEquals("bPKType",
+ EaafConstants.URN_PREFIX_CDID + "ZP",
+ person.getPerson().getIdentification().getType());
- Assert.assertNull("PlaceOfBirth", person.getPerson().getPlaceOfBirth());
- Assert.assertNull("BirthName", person.getPerson().getAlternativeName());
-
- Assert.assertEquals("CitizenCountry", "LU", person.getTravelDocument().getIssuingCountry());
- Assert.assertEquals("DocumentType", "ELEKTR_DOKUMENT", person.getTravelDocument().getDocumentType());
-
- Assert.assertEquals("Identifier",
- response.getAttributes().getAttributeValuesByFriendlyName("PersonIdentifier").getFirstValue(
- response.getAttributes().getDefinitionsByFriendlyName("PersonIdentifier").iterator().next())
- .toString().split("/")[2],
- person.getTravelDocument().getDocumentNumber());
+ Assert.assertNull("PlaceOfBirth", person.getPerson().getPlaceOfBirth());
+ Assert.assertNull("BirthName", person.getPerson().getAlternativeName());
+
}
@Test
public void successfulProcessWithStandardInfos() throws Exception {
- //initialize test
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
+ //initialize test
String vsz = RandomStringUtils.randomNumeric(10);
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(vsz);
val signContentResp = new SignContentResponseType();
final SignContentEntry signContentEntry = new SignContentEntry();
signContentEntry.setValue(RandomStringUtils.randomAlphanumeric(10));
signContentResp.getOut().add(signContentEntry);
- when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp);
-
+ when(szrMock.signContent(any(), any(), any())).thenReturn(signContentResp);
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
- String bindingPubKey = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
- pendingReq.setRawDataToTransaction(MsEidasNodeConstants.EID_BINDING_PUBLIC_KEY_NAME, bindingPubKey);
-
+
//perform test
task.execute(pendingReq, executionContext);
- //validate state
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
Assert.assertNotNull("eidasBind", authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, String.class));
- // check authblock signature
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNotNull("AuthBlock", authBlock);
- final AlgorithmConstraints constraints = new AlgorithmConstraints(ConstraintType.PERMIT,
- BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.toArray(new String[BINDING_AUTH_ALGORITHM_WHITELIST_SIGNING.size()]));
- Pair<KeyStore, Provider> keyStore = getKeyStore();
- X509Certificate[] trustedCerts = EaafKeyStoreUtils
- .getPrivateKeyAndCertificates(keyStore.getFirst(), ALIAS, PW.toCharArray(), true, "junit").getSecond();
- JwsResult result = JoseUtils.validateSignature(authBlock, Arrays.asList(trustedCerts), constraints);
- Assert.assertTrue("AuthBlock not valid", result.isValid());
- JsonNode authBlockJson = mapper.readTree(result.getPayLoad());
- Assert.assertNotNull("deserialized AuthBlock", authBlockJson);
-
- Assert.assertNotNull("no piiTransactionId in pendingRequesdt",
- storedPendingReq.getUniquePiiTransactionIdentifier());
- Assert.assertEquals("piiTransactionId", storedPendingReq.getUniquePiiTransactionIdentifier(),
- authBlockJson.get("piiTransactionId").asText());
- Assert.assertEquals("appId", randomTestSp, authBlockJson.get("appId").asText());
- Assert.assertFalse("'challenge' is null", authBlockJson.get("challenge").asText().isEmpty());
- Assert.assertFalse("'timestamp' is null", authBlockJson.get("timestamp").asText().isEmpty());
- Assert.assertTrue("binding pubKey", authBlockJson.has("bindingPublicKey"));
- Assert.assertEquals("binding PubKey", bindingPubKey, authBlockJson.get("bindingPublicKey").asText());
-
+
Assert.assertTrue("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
// check vsz request
ArgumentCaptor<PersonInfoType> argument4 = ArgumentCaptor.forClass(PersonInfoType.class);
- ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
+ ArgumentCaptor<Boolean> argument5 = ArgumentCaptor.forClass(Boolean.class);
verify(szrMock, times(1)).getStammzahlEncrypted(argument4.capture(), argument5.capture());
-
+
+ Boolean param5 = argument5.getValue();
+ Assert.assertFalse("insertERnP flag", param5);
+ PersonInfoType person = argument4.getValue();
+ Assert.assertEquals("FamilyName",
+ response.getAttributes().getAttributeValuesByFriendlyName("FamilyName").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("FamilyName").iterator().next()),
+ person.getPerson().getName().getFamilyName());
+ Assert.assertEquals("GivenName",
+ response.getAttributes().getAttributeValuesByFriendlyName("FirstName").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("FirstName").iterator().next()),
+ person.getPerson().getName().getGivenName());
+ Assert.assertEquals("DateOfBirth",
+ response.getAttributes().getAttributeValuesByFriendlyName("DateOfBirth").getFirstValue(
+ response.getAttributes().getDefinitionsByFriendlyName("DateOfBirth").iterator().next())
+ .toString().split("T")[0],
+ person.getPerson().getDateOfBirth());
+
+ Assert.assertNull("PlaceOfBirth", person.getPerson().getPlaceOfBirth());
+ Assert.assertNull("BirthName", person.getPerson().getAlternativeName());
+ Assert.assertNull("TravelDocument", person.getTravelDocument());
+
}
@Test
public void getStammzahlEncryptedExceptionTest() throws Exception {
try {
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(null);
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(null);
task.execute(pendingReq, executionContext);
+
} catch (TaskExecutionException e) {
Assert.assertEquals("Incorrect exception thrown", e.getMessage(),
"IdentityLink generation for foreign person " + "FAILED.");
@@ -489,10 +509,10 @@ public class CreateIdentityLinkTaskEidNewTest {
@Test
public void signContentExceptionTest() throws Exception {
try {
- setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(RandomStringUtils.randomNumeric(10));
- when(szrMock, "signContent", any(), any(), any()).thenReturn(null);
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(RandomStringUtils.randomNumeric(10));
+ when(szrMock.signContent(any(), any(), any())).thenReturn(null);
task.execute(pendingReq, executionContext);
+
} catch (TaskExecutionException e) {
Assert.assertEquals("Incorrect exception thrown", e.getMessage(),
"IdentityLink generation for foreign person " + "FAILED.");
@@ -507,12 +527,12 @@ public class CreateIdentityLinkTaskEidNewTest {
//initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
String vsz = RandomStringUtils.randomNumeric(10);
- when(szrMock, "getStammzahlEncrypted", any(), any()).thenReturn(vsz);
+ when(szrMock.getStammzahlEncrypted(any(), any())).thenReturn(vsz);
val signContentResp = new SignContentResponseType();
final SignContentEntry signContentEntry = new SignContentEntry();
signContentEntry.setValue(RandomStringUtils.randomAlphanumeric(10));
signContentResp.getOut().add(signContentEntry);
- when(szrMock, "signContent", any(), any(), any()).thenReturn(signContentResp);
+ when(szrMock.signContent(any(), any(), any())).thenReturn(signContentResp);
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
String bindingPubKey = RandomStringUtils.randomAlphabetic(10);
@@ -596,7 +616,7 @@ public class CreateIdentityLinkTaskEidNewTest {
Constants.eIDAS_ATTR_PLACEOFBIRTH).first();
final AttributeDefinition attributeDef6 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_BIRTHNAME).first();
-
+
final Builder attributeMap = ImmutableAttributeMap.builder();
attributeMap.put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64));
attributeMap.put(attributeDef2, RandomStringUtils.randomAlphabetic(10));
@@ -611,7 +631,7 @@ public class CreateIdentityLinkTaskEidNewTest {
}
attributeMap.put(attributeDef6, RandomStringUtils.randomAlphabetic(10));
-
+
}
val b = new AuthenticationResponse.Builder();
@@ -625,4 +645,53 @@ public class CreateIdentityLinkTaskEidNewTest {
.attributes(attributeMap.build())
.build();
}
+
+ private Map<String, Object> convertEidasAttrToSimpleMap(
+ ImmutableMap<AttributeDefinition<?>, ImmutableSet<? extends AttributeValue<?>>> attributeMap) {
+ final Map<String, Object> result = new HashMap<>();
+ for (final AttributeDefinition<?> el : attributeMap.keySet()) {
+ final Class<?> parameterizedType = el.getParameterizedType();
+ if (DateTime.class.equals(parameterizedType)) {
+ convertDateTime(attributeMap, result, el);
+ } else if (PostalAddress.class.equals(parameterizedType)) {
+ convertPostalAddress(attributeMap, result, el);
+ } else {
+ convertString(attributeMap, result, el);
+ }
+ }
+ return result;
+ }
+
+ private void convertString(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final List<String> natPersonIdObj = EidasResponseUtils
+ .translateStringListAttribute(el, attributeMap.get(el));
+ final String stringAttr = natPersonIdObj.get(0);
+ if (StringUtils.isNotEmpty(stringAttr)) {
+ result.put(el.getFriendlyName(), stringAttr);
+
+ }
+ }
+
+ private void convertPostalAddress(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final PostalAddress addressAttribute = EidasResponseUtils
+ .translateAddressAttribute(el, attributeMap.get(el).asList());
+ if (addressAttribute != null) {
+ result.put(el.getFriendlyName(), addressAttribute);
+
+ }
+ }
+
+ private void convertDateTime(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final DateTime attribute = EidasResponseUtils.translateDateAttribute(el, attributeMap.get(el).asList());
+ if (attribute != null) {
+ result.put(el.getFriendlyName(), attribute);
+
+ }
+ }
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java
index a9d2f332..5c528532 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateIdentityLinkTaskTest.java
@@ -5,20 +5,22 @@ import static org.mockito.ArgumentMatchers.any;
import java.net.URISyntaxException;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
-import javax.annotation.Nonnull;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.joda.time.DateTime;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
@@ -29,12 +31,21 @@ import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.github.skjolber.mockito.soap.SoapServiceRule;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.EidasResponseUtils;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.IRequestStorage;
import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
@@ -51,7 +62,9 @@ import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
import at.gv.egiz.eaaf.core.impl.utils.Random;
import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.AttributeValue;
import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
+import eu.eidas.auth.commons.protocol.eidas.impl.PostalAddress;
import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
import lombok.val;
import szrservices.GetBPK;
@@ -62,7 +75,6 @@ import szrservices.SZR;
import szrservices.SZRException_Exception;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
@@ -81,7 +93,10 @@ public class CreateIdentityLinkTaskTest {
EaafKeyStoreFactory keyStoreFactory;
@Autowired
- private IRequestStorage requestStorage;
+ ICcSpecificEidProcessingService eidPostProcessor;
+
+ @Autowired
+ IRequestStorage requestStorage;
final ExecutionContext executionContext = new ExecutionContextImpl();
private MockHttpServletRequest httpReq;
@@ -89,18 +104,21 @@ public class CreateIdentityLinkTaskTest {
private TestRequestImpl pendingReq;
private DummySpConfiguration oaParam;
private SZR szrMock;
-
+
+ private MatchedPersonResult matchingInfos;
private AuthenticationResponse response;
private Map<String, String> spConfig;
-
+
@Rule
public final SoapServiceRule soap = SoapServiceRule.newInstance();
/**
* jUnit test set-up.
+ * @throws EidasAttributeException
+ * @throws EidPostProcessingException
*/
@Before
- public void setUp() throws EaafStorageException, URISyntaxException {
+ public void setUp() throws EaafStorageException, URISyntaxException, EidPostProcessingException, EidasAttributeException {
httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
httpResp = new MockHttpServletResponse();
@@ -110,7 +128,7 @@ public class CreateIdentityLinkTaskTest {
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "false");
-
+
spConfig = new HashMap<>();
spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");
spConfig.put("target", "urn:publicid:gv.at:cdid+XX");
@@ -119,42 +137,55 @@ public class CreateIdentityLinkTaskTest {
pendingReq = new TestRequestImpl();
response = buildDummyAuthResponse();
-
+ final Map<String, Object> eidasAttributes = convertEidasAttrToSimpleMap(
+ response.getAttributes().getAttributeMap());
+ final SimpleEidasData eidData = eidPostProcessor.postProcess(eidasAttributes);
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, eidData);
pendingReq.getSessionData(AuthProcessDataWrapper.class)
.setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+
+ matchingInfos = MatchedPersonResult.builder()
+ .bpk(RandomStringUtils.randomAlphabetic(5))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .countryCode(eidData.getCitizenCountryCode())
+ .build();
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, matchingInfos);
+
pendingReq.setSpConfig(oaParam);
pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());
pendingReq.setAuthUrl("http://test.com/");
pendingReq.setTransactionId("avaasbav");
pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
-
+
executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "XX");
executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true);
szrMock = soap.mock(SZR.class, "http://localhost:1234/demoszr");
}
-
+
@Test
public void buildIdentityLink() throws Exception {
- //initialize test
+ //initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
-
-
+
+
//perform test
task.execute(pendingReq, executionContext);
-
- //validate state
+
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -162,15 +193,12 @@ public class CreateIdentityLinkTaskTest {
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNull("AuthBlock", authBlock);
-
+
Assert.assertFalse("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
Assert.assertNotNull("IDL", authProcessData.getIdentityLink());
checkElement("Mustermann", authProcessData.getIdentityLink().getFamilyName());
checkElement("Hans", authProcessData.getIdentityLink().getGivenName());
@@ -178,12 +206,69 @@ public class CreateIdentityLinkTaskTest {
checkElement("urn:publicid:gv.at:baseid", authProcessData.getIdentityLink().getIdentificationType());
checkElement("k+zDM1BVpN1WJO4x7ZQ3ng==", authProcessData.getIdentityLink().getIdentificationValue());
Assert.assertNotNull(authProcessData.getIdentityLink().getSerializedSamlAssertion());
- Assert.assertNotNull(authProcessData.getIdentityLink().getSamlAssertion());
-
+ Assert.assertNotNull(authProcessData.getIdentityLink().getSamlAssertion());
+
Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
- Assert.assertEquals("wrong bPK", "XX:FkXtOaSSeR3elyL9KLLvijIYDMU=",
+ Assert.assertEquals("wrong bPK", "XX:FkXtOaSSeR3elyL9KLLvijIYDMU=",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
+
+ }
+
+ @Test
+ public void successfulProcessWithDataFromMatching() throws Exception {
+ //initialize test
+ setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
+
+ String randomTestSp = RandomStringUtils.randomAlphabetic(10);
+ pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
+
+ basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
+
+ MatchedPersonResult matchingInfos = MatchedPersonResult.builder()
+ .bpk(RandomStringUtils.randomAlphabetic(5))
+ .givenName(RandomStringUtils.randomAlphabetic(5))
+ .familyName(RandomStringUtils.randomAlphabetic(5))
+ .dateOfBirth(RandomStringUtils.randomAlphabetic(5))
+ .countryCode(RandomStringUtils.randomAlphabetic(2).toUpperCase())
+ .build();
+
+ MatchingTaskUtils.storeFinalMatchingResult(pendingReq, matchingInfos);
+ //perform test
+ task.execute(pendingReq, executionContext);
+
+
+ //validate state
+ // check if pendingRequest was stored
+ IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
+ Assert.assertNotNull("pendingReq not stored", storedPendingReq);
+
+ //check data in session
+ final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
+ Assert.assertNotNull("AuthProcessData", authProcessData);
+ Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, String.class));
+
+ String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
+ Assert.assertNull("AuthBlock", authBlock);
+
+ Assert.assertFalse("EID process", authProcessData.isEidProcess());
+ Assert.assertTrue("foreigner process", authProcessData.isForeigner());
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
+
+ Assert.assertNotNull("IDL", authProcessData.getIdentityLink());
+ checkElement("Mustermann", authProcessData.getIdentityLink().getFamilyName());
+ checkElement("Hans", authProcessData.getIdentityLink().getGivenName());
+ checkElement("1989-05-05", authProcessData.getIdentityLink().getDateOfBirth());
+ checkElement("urn:publicid:gv.at:baseid", authProcessData.getIdentityLink().getIdentificationType());
+ checkElement("k+zDM1BVpN1WJO4x7ZQ3ng==", authProcessData.getIdentityLink().getIdentificationValue());
+ Assert.assertNotNull(authProcessData.getIdentityLink().getSerializedSamlAssertion());
+ Assert.assertNotNull(authProcessData.getIdentityLink().getSamlAssertion());
+
+ Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
+ Assert.assertEquals("wrong bPK", "XX:FkXtOaSSeR3elyL9KLLvijIYDMU=",
+ authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
+
}
@Test
@@ -191,22 +276,22 @@ public class CreateIdentityLinkTaskTest {
//initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
spConfig.put("target", EaafConstants.URN_PREFIX_WBPK + "FN+123456i");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true");
-
+
//perform test
task.execute(pendingReq, executionContext);
-
- //validate state
+
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -214,42 +299,39 @@ public class CreateIdentityLinkTaskTest {
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNull("AuthBlock", authBlock);
-
+
Assert.assertFalse("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
- Assert.assertEquals("wrong bPK", "FN+123456i:D26vJncPS2W790RH/LP04V+vNOQ=",
+ Assert.assertEquals("wrong bPK", "FN+123456i:D26vJncPS2W790RH/LP04V+vNOQ=",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
-
+
}
-
+
@Test
public void buildIdentityLinkWithEidasBpk() throws Exception {
//initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_2.xml");
spConfig.put("target", EaafConstants.URN_PREFIX_EIDAS + "AT+EU");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true");
-
+
//perform test
task.execute(pendingReq, executionContext);
-
- //validate state
+
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -257,80 +339,77 @@ public class CreateIdentityLinkTaskTest {
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNull("AuthBlock", authBlock);
-
+
Assert.assertFalse("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
Assert.assertNotNull("IDL", authProcessData.getIdentityLink());
checkElement("Musterfrau", authProcessData.getIdentityLink().getFamilyName());
checkElement("Martina", authProcessData.getIdentityLink().getGivenName());
checkElement("1991-04-15", authProcessData.getIdentityLink().getDateOfBirth());
checkElement("urn:publicid:gv.at:baseid", authProcessData.getIdentityLink().getIdentificationType());
checkElement("k+zDM1BV1312312332x7ZQ3ng==", authProcessData.getIdentityLink().getIdentificationValue());
-
+
Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
- Assert.assertEquals("wrong bPK", "AT+EU:AT/EU/1+wqDl059/02Ptny0g+LyuLDJV0=",
+ Assert.assertEquals("wrong bPK", "AT+EU:AT/EU/1+wqDl059/02Ptny0g+LyuLDJV0=",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
-
+
}
-
+
@Test
public void buildIdentityLinkWithUnknownBpk() throws Exception {
//initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
spConfig.put("target", "urn:notextis:1234");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true");
-
+
try {
task.execute(pendingReq, executionContext);
Assert.fail("unknown bPKType not detected");
-
+
} catch (TaskExecutionException e) {
- Assert.assertEquals("ErrorId", "builder.33",
+ Assert.assertEquals("ErrorId", "builder.33",
((EaafException) e.getOriginalException()).getErrorId());
Assert.assertEquals("wrong parameter size", 1, ((EaafException) e.getOriginalException())
.getParams().length);
- }
+ }
}
-
+
@Test
public void noBpkResult() throws Exception {
//initialize test
setSzrResponseIdentityLink("/data/szr/szr_resp_valid_1.xml");
GetBPKResponse getBpkResp = new GetBPKResponse();
org.mockito.Mockito.when(szrMock.getBPK(any(GetBPK.class))).thenReturn(getBpkResp );
-
+
spConfig.put("target", "urn:notextis:1234");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "true");
-
+
try {
task.execute(pendingReq, executionContext);
Assert.fail("unknown bPKType not detected");
-
+
} catch (TaskExecutionException e) {
- Assert.assertEquals("ErrorId", "ernb.01",
+ Assert.assertEquals("ErrorId", "ernb.01",
((EaafException) e.getOriginalException()).getErrorId());
-
- }
+
+ }
}
-
+
@Test
public void bPKFromSzr() throws Exception {
//initialize test
@@ -339,25 +418,25 @@ public class CreateIdentityLinkTaskTest {
GetBPKResponse getBpkResp = new GetBPKResponse();
getBpkResp.getGetBPKReturn().add(bpk);
org.mockito.Mockito.when(szrMock.getBPK(any(GetBPK.class))).thenReturn(getBpkResp );
-
+
spConfig.put("target", "urn:notextis:1234");
-
+
String randomTestSp = RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
+
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.revisionlog.eidmapping.active", "true");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.params.useSZRForbPKCalculation", "true");
-
+
//execute test
task.execute(pendingReq, executionContext);
-
-
- //validate state
+
+
+ //validate state
// check if pendingRequest was stored
IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
+
//check data in session
final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
Assert.assertNotNull("AuthProcessData", authProcessData);
@@ -365,58 +444,17 @@ public class CreateIdentityLinkTaskTest {
String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
Assert.assertNull("AuthBlock", authBlock);
-
+
Assert.assertFalse("EID process", authProcessData.isEidProcess());
Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
+ Assert.assertEquals("EID-ISSUING_NATION", "LU",
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
+
Assert.assertNotNull("no bPK", authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
- Assert.assertEquals("wrong bPK", bpk,
+ Assert.assertEquals("wrong bPK", bpk,
authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.BPK_NAME));
}
- @Test
- public void buildDummyIdl() throws Exception {
- //initialize test
- String randomTestSp = RandomStringUtils.randomAlphabetic(10);
- pendingReq.setRawDataToTransaction(MsEidasNodeConstants.DATA_REQUESTERID, randomTestSp);
-
- basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "true");
-
-
- //perform test
- task.execute(pendingReq, executionContext);
-
-
- //validate state
- // check if pendingRequest was stored
- IRequest storedPendingReq = requestStorage.getPendingRequest(pendingReq.getPendingRequestId());
- Assert.assertNotNull("pendingReq not stored", storedPendingReq);
-
- //check data in session
- final AuthProcessDataWrapper authProcessData = storedPendingReq.getSessionData(AuthProcessDataWrapper.class);
- Assert.assertNotNull("AuthProcessData", authProcessData);
- Assert.assertNull("eidasBind", authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_EIDAS_BIND, String.class));
-
- String authBlock = authProcessData.getGenericDataFromSession(MsEidasNodeConstants.AUTH_DATA_SZR_AUTHBLOCK, String.class);
- Assert.assertNull("AuthBlock", authBlock);
-
- Assert.assertFalse("EID process", authProcessData.isEidProcess());
- Assert.assertTrue("foreigner process", authProcessData.isForeigner());
- Assert.assertEquals("EID-ISSUING_NATION", "LU",
- authProcessData.getGenericDataFromSession(PvpAttributeDefinitions.EID_ISSUING_NATION_NAME, String.class));
- Assert.assertNotNull("LoA is null", authProcessData.getQaaLevel());
- Assert.assertEquals("LoA", response.getLevelOfAssurance(),
- authProcessData.getQaaLevel());
-
- Assert.assertNotNull("IDL", authProcessData.getIdentityLink());
-
- }
-
private void setSzrResponseIdentityLink(String responseXmlPath) throws JAXBException, SZRException_Exception {
final JAXBContext jaxbContext = JAXBContext
.newInstance(szrservices.ObjectFactory.class, org.w3._2001._04.xmldsig_more.ObjectFactory.class,
@@ -433,8 +471,8 @@ public class CreateIdentityLinkTaskTest {
Assert.assertEquals(expected, value);
}
-
- @Nonnull
+
+ @NotNull
private AuthenticationResponse buildDummyAuthResponse() throws URISyntaxException {
final AttributeDefinition attributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first();
@@ -444,7 +482,7 @@ public class CreateIdentityLinkTaskTest {
Constants.eIDAS_ATTR_CURRENTGIVENNAME).first();
final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_DATEOFBIRTH).first();
-
+
final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder()
.put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64))
.put(attributeDef2, RandomStringUtils.randomAlphabetic(10))
@@ -461,4 +499,54 @@ public class CreateIdentityLinkTaskTest {
.attributes(attributeMap)
.build();
}
+
+ private Map<String, Object> convertEidasAttrToSimpleMap(
+ ImmutableMap<AttributeDefinition<?>, ImmutableSet<? extends AttributeValue<?>>> attributeMap) {
+ final Map<String, Object> result = new HashMap<>();
+ for (final AttributeDefinition<?> el : attributeMap.keySet()) {
+ final Class<?> parameterizedType = el.getParameterizedType();
+ if (DateTime.class.equals(parameterizedType)) {
+ convertDateTime(attributeMap, result, el);
+ } else if (PostalAddress.class.equals(parameterizedType)) {
+ convertPostalAddress(attributeMap, result, el);
+ } else {
+ convertString(attributeMap, result, el);
+ }
+ }
+ return result;
+ }
+
+ private void convertString(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final List<String> natPersonIdObj = EidasResponseUtils
+ .translateStringListAttribute(el, attributeMap.get(el));
+ final String stringAttr = natPersonIdObj.get(0);
+ if (StringUtils.isNotEmpty(stringAttr)) {
+ result.put(el.getFriendlyName(), stringAttr);
+
+ }
+ }
+
+ private void convertPostalAddress(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final PostalAddress addressAttribute = EidasResponseUtils
+ .translateAddressAttribute(el, attributeMap.get(el).asList());
+ if (addressAttribute != null) {
+ result.put(el.getFriendlyName(), addressAttribute);
+
+ }
+ }
+
+ private void convertDateTime(ImmutableMap<AttributeDefinition<?>,
+ ImmutableSet<? extends AttributeValue<?>>> attributeMap,
+ Map<String, Object> result, AttributeDefinition<?> el) {
+ final DateTime attribute = EidasResponseUtils.translateDateAttribute(el, attributeMap.get(el).asList());
+ if (attribute != null) {
+ result.put(el.getFriendlyName(), attribute);
+
+ }
+ }
+
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateNewErnpEntryTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateNewErnpEntryTaskTest.java
new file mode 100644
index 00000000..985a5e14
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/CreateNewErnpEntryTaskTest.java
@@ -0,0 +1,198 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateNewErnpEntryTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+public class CreateNewErnpEntryTaskTest {
+
+ CreateNewErnpEntryTask task;
+
+ @Mock ErnpRestClient ernpClient;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void setUp() throws URISyntaxException, EaafStorageException {
+ task = new CreateNewErnpEntryTask(ernpClient);
+
+ MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ MockHttpServletResponse httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void missingEidasData() {
+ Mockito.when(ernpClient.add(any()))
+ .thenThrow(new IllegalStateException("add ERnP entry should not be neccessary"));
+
+ TaskExecutionException error = assertThrows("wrong exception", TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals("wrong pendingRequestId", pendingReq.getPendingRequestId(), error.getPendingRequestID());
+ assertTrue("Wrong exception", (error.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) error.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void noErnpResponse() {
+ SimpleEidasData input = buildInputData();
+ Mockito.when(ernpClient.add(input))
+ .thenReturn(ernpRegisterResult(Arrays.asList()));
+
+ TaskExecutionException error = assertThrows("wrong exception", TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals("wrong pendingRequestId", pendingReq.getPendingRequestId(), error.getPendingRequestID());
+ assertTrue("Wrong exception", (error.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) error.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void moreThanOneErnpResponse() {
+ String bpk = RandomStringUtils.randomAlphabetic(5);
+ SimpleEidasData input = buildInputData();
+ Mockito.when(ernpClient.add(input))
+ .thenReturn(ernpRegisterResult(Arrays.asList(buildErnpResultEntry(input, bpk), buildRandomResultEntry())));
+
+ TaskExecutionException error = assertThrows("wrong exception", TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals("wrong pendingRequestId", pendingReq.getPendingRequestId(), error.getPendingRequestID());
+ assertTrue("Wrong exception", (error.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) error.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void insertErnpSuccess() {
+ String bpk = RandomStringUtils.randomAlphabetic(5);
+ SimpleEidasData input = buildInputData();
+ Mockito.when(ernpClient.add(input))
+ .thenReturn(ernpRegisterResult(Arrays.asList(buildErnpResultEntry(input, bpk))));
+
+ // perform test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ MatchedPersonResult result = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no matching result", result);
+ assertEquals("familyname", input.getFamilyName(), result.getFamilyName());
+ assertEquals("givenyname", input.getGivenName(), result.getGivenName());
+ assertEquals("dateOfBirth", input.getDateOfBirth(), result.getDateOfBirth());
+ assertEquals("bpk", bpk, result.getBpk());
+ assertEquals("countryCode", input.getCitizenCountryCode(), result.getCountryCode());
+
+ }
+
+
+ @NotNull
+ private ErnpRegisterResult ernpRegisterResult(List<RegisterResult> registerResult) {
+ return new ErnpRegisterResult(registerResult);
+
+ }
+
+ private RegisterResult buildErnpResultEntry(SimpleEidasData input, String bpk) {
+ return buildErnpResultEntry(input.getFamilyName(), input.getGivenName(), input.getDateOfBirth(), bpk);
+
+ }
+
+ private RegisterResult buildRandomResultEntry() {
+ return buildErnpResultEntry(RandomStringUtils.randomAlphabetic(5), RandomStringUtils.randomAlphabetic(5),
+ RandomStringUtils.randomAlphabetic(5), RandomStringUtils.randomAlphabetic(5));
+
+ }
+
+ private RegisterResult buildErnpResultEntry(String familyName, String givenName, String birthday, String bpk) {
+ return RegisterResult.builder()
+ .bpk(bpk)
+ .dateOfBirth(birthday)
+ .givenName(givenName)
+ .familyName(familyName)
+ .build();
+
+ }
+
+ private SimpleEidasData buildInputData() throws EaafStorageException {
+ String cc = RandomStringUtils.randomAlphabetic(5).toUpperCase();
+ String pseudonym = RandomStringUtils.randomAlphabetic(5);
+ String familyName = RandomStringUtils.randomAlphabetic(5);
+ String givenName = RandomStringUtils.randomAlphabetic(5);
+ String birthday = RandomStringUtils.randomNumeric(4) + "-"
+ + RandomStringUtils.randomNumeric(2) + "-" + RandomStringUtils.randomNumeric(2);
+
+ SimpleEidasData input = SimpleEidasData.builder()
+ .familyName(familyName)
+ .givenName(givenName)
+ .dateOfBirth(birthday)
+ .personalIdentifier(cc + "/AT/" + pseudonym)
+ .pseudonym(pseudonym)
+ .citizenCountryCode(cc)
+ .build();
+ MatchingTaskUtils.storeInitialEidasData(pendingReq, input);
+ return input;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAustrianResidenceGuiTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAustrianResidenceGuiTaskTest.java
new file mode 100644
index 00000000..1fc96e10
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateAustrianResidenceGuiTaskTest.java
@@ -0,0 +1,172 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Locale;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAustrianResidenceGuiTask;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml",
+ "/common_gui.beans.xml"
+})
+@WebAppConfiguration
+public class GenerateAustrianResidenceGuiTaskTest {
+
+
+ @Autowired
+ GenerateAustrianResidenceGuiTask task;
+
+ private ExecutionContextImpl executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+
+ @BeforeClass
+ public static void classInitializer() {
+ Locale.setDefault(Locale.ENGLISH);
+
+ }
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void initialize() {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setAuthUrl("https://localhost/ms_connector");
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+
+ LocaleContextHolder.resetLocaleContext();
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void jsonResponse() throws TaskExecutionException, UnsupportedEncodingException {
+ httpReq.addHeader("Accept", "application/json");
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "application/json;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ final JsonNode json = new JsonMapper().readTree(content);
+ assertNotNull("response body is null", json);
+ checkJsonElement(json, "wizardEndpoint", "https://localhost/ms_connector/residency/search");
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void jsonResponseWithError() throws TaskExecutionException, UnsupportedEncodingException {
+ httpReq.addHeader("Accept", "application/json");
+
+ String reason = RandomStringUtils.randomAlphabetic(5);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, reason);
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "application/json;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ final JsonNode json = new JsonMapper().readTree(content);
+ assertNotNull("response body is null", json);
+ checkJsonElement(json, "wizardEndpoint", "https://localhost/ms_connector/residency/search");
+
+ assertNotNull("advancedMatchFailed", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED));
+ assertTrue("advancedMatchFailed", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED).asBoolean());
+ assertNotNull("advancedMatchingFailedReason", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON));
+ assertEquals("advancedMatchingFailedReason", reason,
+ json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON).asText());
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void htmlResponse() throws TaskExecutionException, UnsupportedEncodingException {
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ assertTrue("no wizard endpoint", content.contains("https://localhost/ms_connector/residency/search"));
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void htmlResponseWithError() throws TaskExecutionException, UnsupportedEncodingException {
+
+ String reason = RandomStringUtils.randomAlphabetic(5);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, reason);
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ assertTrue("no wizard endpoint", content.contains("https://localhost/ms_connector/residency/search"));
+
+ Assert.assertTrue("missing errorfield", content.contains("<div id=\"matchingError\""));
+ Assert.assertTrue("missing errorfield", content.contains(reason));
+
+ }
+
+ private void checkJsonElement(JsonNode json, String key, String expected) {
+ assertTrue("no element: " + key, json.has(key));
+ assertEquals("wrong element:" + key, expected, json.get(key).asText());
+
+ }
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateMobilePhoneSignatureRequestTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateMobilePhoneSignatureRequestTaskTest.java
new file mode 100644
index 00000000..ffa02ccd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateMobilePhoneSignatureRequestTaskTest.java
@@ -0,0 +1,282 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.springframework.util.Assert.isInstanceOf;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Base64;
+import java.util.Map;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.common.xml.SAMLConstants;
+import org.opensaml.saml.saml2.core.AuthnRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateMobilePhoneSignatureRequestTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummyOA;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.gui.IVelocityGuiBuilderConfiguration;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.api.storage.ITransactionStorage;
+import at.gv.egiz.eaaf.core.exceptions.EaafConfigurationException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.module.gui.DummyGuiBuilderConfigurationFactory;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import at.gv.egiz.eaaf.modules.pvp2.exception.CredentialsNotAvailableException;
+import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2MetadataException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.message.PvpSProfileRequest;
+import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.PvpMetadataResolverFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
+import at.gv.egiz.eaaf.modules.pvp2.impl.validation.TrustEngineFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.verification.SamlVerificationEngine;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml",
+ "classpath:/eaaf_pvp_sp.beans.xml"
+})
+
+public class GenerateMobilePhoneSignatureRequestTaskTest {
+
+ private static final String METADATA_PATH = "classpath:/data/idp_metadata_classpath_entity.xml";
+ private static final String METADATA_SP_PATH = "classpath:/data/sp_metadata_junit.xml";
+
+ @Autowired(required = true)
+ private ApplicationContext context;
+ @Autowired(required = true)
+ protected MsConnectorDummyConfigMap authConfig;
+ @Autowired
+ private IdAustriaClientAuthMetadataProvider metadataProvider;
+ @Autowired
+ private PvpMetadataResolverFactory metadataFactory;
+ @Autowired
+ private DummyGuiBuilderConfigurationFactory guiBuilderConfigFactory;
+ @Autowired
+ private SamlVerificationEngine samlVerifyEngine;
+ @Autowired
+ private ITransactionStorage transactionStorage;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private TestRequestImpl pendingReq;
+ private DummyOA oaParam;
+
+ private GenerateMobilePhoneSignatureRequestTask task;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void initialize() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+
+ }
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws Exception In case of an set-up error
+ */
+ @Before
+ public void setUp() throws Exception {
+ task = (GenerateMobilePhoneSignatureRequestTask) context.getBean(
+ "GenerateMobilePhoneSignatureRequestTask");
+
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ authConfig.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ METADATA_PATH);
+ authConfig.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS,
+ "sig");
+
+ oaParam = new DummyOA();
+ oaParam.setUniqueAppId("http://test.com/test");
+ oaParam.setBmiUniqueIdentifier(oaParam.getUniqueIdentifier() + "#" + RandomStringUtils.randomAlphanumeric(
+ 5));
+ oaParam.setTargetIdentifier(
+ EaafConstants.URN_PREFIX_CDID + RandomStringUtils.randomAlphabetic(2));
+ oaParam.setEidasEnabled(true);
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+ pendingReq.setSpConfig(oaParam);
+ pendingReq.setAuthUrl("https://localhost/authhandler");
+
+ metadataProvider.fullyDestroy();
+ guiBuilderConfigFactory.setVelocityBuilderConfig(createDummyGuiConfig());
+
+ }
+
+ @Test
+ public void noMetadataAvailableOnGlobalConfig() {
+ authConfig.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID);
+
+ final TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ assertNotNull(e.getOriginalException());
+ isInstanceOf(EaafConfigurationException.class, e.getOriginalException());
+ assertEquals("module.eidasauth.00", ((EaafConfigurationException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void wrongMetadataAvailableOnGlobalConfig() {
+ authConfig.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ "http://wrong.path/" + RandomStringUtils.randomAlphabetic(5));
+
+ final TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+ assertNotNull(e.getPendingRequestID());
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ assertNotNull(e.getOriginalException());
+ isInstanceOf(EaafConfigurationException.class, e.getOriginalException());
+ assertEquals("module.eidasauth.idaustria.02",
+ ((EaafConfigurationException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void noMetadataSigningKeyStore() throws Pvp2MetadataException {
+ authConfig.removeConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_SIGN_SIGNING_ALIAS);
+
+ metadataProvider.addMetadataResolverIntoChain(
+ metadataFactory.createMetadataProvider(METADATA_PATH, null, "jUnitTest", null));
+
+ final TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+ assertNotNull(e.getPendingRequestID());
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ assertNotNull(e.getOriginalException());
+ isInstanceOf(CredentialsNotAvailableException.class, e.getOriginalException());
+ assertEquals("internal.pvp.01",
+ ((CredentialsNotAvailableException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void success() throws Exception {
+ metadataProvider.addMetadataResolverIntoChain(
+ metadataFactory.createMetadataProvider(METADATA_PATH, null, "jUnitTest", null));
+ pendingReq.setTransactionId(RandomStringUtils.randomAlphanumeric(10));
+
+ task.execute(pendingReq, executionContext);
+
+ validate();
+
+ }
+
+ private void validate() throws Exception {
+ assertEquals("HTTP Statuscode", 200, httpResp.getStatus());
+ assertEquals("ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
+ assertEquals("ContentEncoding", "UTF-8", httpResp.getCharacterEncoding());
+
+ final String html = httpResp.getContentAsString();
+ assertNotNull("XML Metadata", html);
+
+ final int startIndex = html.indexOf("SAMLRequest=");
+ assertTrue("No SAMLRequest in html", startIndex >= 0);
+ final String authnXml = html.substring(startIndex + "SAMLRequest=".length());
+
+ // check if relaystate was stored
+ final int startIndexRelayState = html.indexOf("RelayState=");
+ assertTrue("wrong RelayState in HTML",
+ startIndexRelayState >= 0);
+ final String relayState = html.substring(startIndexRelayState + "RelayState=".length(), startIndex);
+ final String storedPendingReqId = transactionStorage.get(relayState, String.class);
+ assertEquals("relayStore not map to pendingRequestId",
+ pendingReq.getPendingRequestId(), storedPendingReqId);
+
+ final AuthnRequest authnRequest = (AuthnRequest) XMLObjectSupport.unmarshallFromInputStream(
+ XMLObjectProviderRegistrySupport.getParserPool(), new ByteArrayInputStream(
+ Base64.getDecoder().decode(authnXml)));
+
+ assertNotNull("AuthnReq", authnRequest);
+ assertNotNull("Issuer", authnRequest.getIssuer());
+ assertEquals("EntityId",
+ "https://localhost/authhandler" + IdAustriaClientAuthConstants.ENDPOINT_METADATA,
+ authnRequest.getIssuer().getValue());
+
+ // check XML scheme
+ Saml2Utils.schemeValidation(authnRequest);
+
+ // check signature
+ final PvpSProfileRequest msg = new PvpSProfileRequest(
+ authnRequest,
+ SAMLConstants.SAML2_POST_BINDING_URI);
+ msg.setEntityID(authnRequest.getIssuer().getValue());
+ metadataProvider.addMetadataResolverIntoChain(
+ metadataFactory.createMetadataProvider(METADATA_SP_PATH, null, "jUnit SP", null));
+ samlVerifyEngine.verify(msg, TrustEngineFactory.getSignatureKnownKeysTrustEngine(metadataProvider));
+
+ assertNull("RequestedAuthnContext", authnRequest.getRequestedAuthnContext());
+
+ }
+
+ private IVelocityGuiBuilderConfiguration createDummyGuiConfig() {
+ return new IVelocityGuiBuilderConfiguration() {
+
+ @Override
+ public Map<String, Object> getViewParameters() {
+ return null;
+ }
+
+ @Override
+ public String getViewName() {
+ return "SAML2 Post-Binding";
+ }
+
+ @Override
+ public String getDefaultContentType() {
+ return null;
+ }
+
+ @Override
+ public InputStream getTemplate(String viewName) {
+ return GenerateMobilePhoneSignatureRequestTaskTest.class.getResourceAsStream(
+ "/data/pvp_postbinding_template.html");
+ }
+
+ @Override
+ public String getClasspathTemplateDir() {
+ return null;
+
+ }
+
+ @Override
+ public boolean isWriteAsynch() {
+ return false;
+
+ }
+ };
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateOtherLoginMethodGuiTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateOtherLoginMethodGuiTaskTest.java
new file mode 100644
index 00000000..496158fa
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/GenerateOtherLoginMethodGuiTaskTest.java
@@ -0,0 +1,293 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.UnsupportedEncodingException;
+import java.text.MessageFormat;
+import java.util.Locale;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.json.JsonMapper;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SelectedLoginMethod;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateOtherLoginMethodGuiTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveOtherLoginMethodGuiResponseTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummyOA;
+import at.gv.egiz.eaaf.core.api.IRequestStorage;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml",
+ "/common_gui.beans.xml"
+})
+@WebAppConfiguration
+public class GenerateOtherLoginMethodGuiTaskTest {
+
+ private static final String TEST_PATTER_REQ_PARAM =
+ "<input type=\"hidden\" name=\"loginSelection\" value=\"{0}\">";
+
+ @Autowired
+ GenerateOtherLoginMethodGuiTask task;
+
+ @Autowired IRequestStorage storage;
+
+ private ExecutionContextImpl executionContext;
+ private TestRequestImpl pendingReq;
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+
+ @BeforeClass
+ public static void classInitializer() {
+ Locale.setDefault(Locale.ENGLISH);
+
+ }
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void initialize() {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setAuthUrl("https://localhost/ms_connector");
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+ pendingReq.setSpConfig(new DummyOA());
+
+ executionContext = new ExecutionContextImpl();
+
+ LocaleContextHolder.resetLocaleContext();
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void unsetExecutionContextParameters() throws TaskExecutionException, UnsupportedEncodingException {
+ httpReq.addHeader("Accept", "application/json");
+ ReceiveOtherLoginMethodGuiResponseTask.ALL_EXECUTIONCONTEXT_PARAMETERS.forEach(
+ el -> executionContext.put(el, RandomStringUtils.randomAlphabetic(5)));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "application/json;charset=UTF-8", httpResp.getContentType());
+
+ ReceiveOtherLoginMethodGuiResponseTask.ALL_EXECUTIONCONTEXT_PARAMETERS.forEach(
+ el -> assertNull("executionContext parameter: " + el, executionContext.get(el)));
+
+ // remove pendingRequestId and changeLanguage because it's added by default
+ executionContext.remove(EaafConstants.PROCESS_ENGINE_PENDINGREQUESTID);
+ executionContext.remove("changeLanguage");
+
+ // in case of 'ReceiveOtherLoginMethodGuiResponseTask.ALL_EXECUTIONCONTEXT_PARAMETERS' does not include all parameters
+ assertTrue("ExecutionContext is not empty", executionContext.keySet().isEmpty());
+
+ }
+
+
+ @Test
+ @SneakyThrows
+ public void jsonResponseInsertErnp() throws TaskExecutionException, UnsupportedEncodingException {
+ String reason = RandomStringUtils.randomAlphabetic(5);
+ executionContext.put(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK, true);
+ httpReq.addHeader("Accept", "application/json");
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "application/json;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ final JsonNode json = new JsonMapper().readTree(content);
+ assertNotNull("response body is null", json);
+ assertNull("advancedMatchFailed", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED));
+ assertNotNull("createNewErnpEntry", json.get(Constants.HTML_FORM_CREATE_NEW_ERNP_ENTRY));
+ assertTrue("createNewErnpEntry", json.get(Constants.HTML_FORM_CREATE_NEW_ERNP_ENTRY).asBoolean());
+
+ assertNull("advancedMatchingFailedReason", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON));
+
+ assertNotNull("pendingRequest not stored",
+ storage.getPendingRequest(pendingReq.getPendingRequestId()));
+
+ }
+
+ @Test
+ @SneakyThrows
+ public void jsonResponseMathingFailed() throws TaskExecutionException, UnsupportedEncodingException {
+ String reason = RandomStringUtils.randomAlphabetic(5);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, reason);
+ httpReq.addHeader("Accept", "application/json");
+
+ task.execute(pendingReq, executionContext);
+
+ //result validation
+ Assert.assertEquals("httpStausCode", 200, httpResp.getStatus());
+ Assert.assertEquals("http ContentType", "application/json;charset=UTF-8", httpResp.getContentType());
+ final String content = httpResp.getContentAsString();
+ assertNotNull("response body is null", content);
+ Assert.assertFalse("response body is empty", content.isEmpty());
+ final JsonNode json = new JsonMapper().readTree(content);
+ assertNotNull("response body is null", json);
+ assertNotNull("advancedMatchFailed", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED));
+ assertTrue("advancedMatchFailed", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED).asBoolean());
+ assertNotNull("advancedMatchingFailedReason", json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON));
+ assertEquals("advancedMatchingFailedReason", reason,
+ json.get(Constants.HTML_FORM_ADVANCED_MATCHING_FAILED_REASON).asText());
+
+ assertNotNull("createNewErnpEntry", json.get(Constants.HTML_FORM_CREATE_NEW_ERNP_ENTRY));
+ assertFalse("createNewErnpEntry", json.get(Constants.HTML_FORM_CREATE_NEW_ERNP_ENTRY).asBoolean());
+
+ assertNotNull("pendingRequest not stored",
+ storage.getPendingRequest(pendingReq.getPendingRequestId()));
+
+ }
+
+ @Test
+ public void insertErnpRequested() throws TaskExecutionException, UnsupportedEncodingException {
+ executionContext.put(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK, true);
+
+ task.execute(pendingReq, executionContext);
+
+ Assert.assertEquals("Wrong http StatusCode", 200, httpResp.getStatus());
+ Assert.assertEquals("Wrong http ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
+
+ String html = httpResp.getContentAsString();
+ Assert.assertNotNull("html result is null", html);
+ Assert.assertFalse("html result is empty", html.isEmpty());
+ Assert.assertTrue("No language selector with pendingRequestId",
+ html.contains("/otherLoginMethod?lang=en&amp;pendingid=" + pendingReq.getPendingRequestId()));
+ Assert.assertTrue("Missing eIDAS infos",
+ html.contains(MessageFormat.format(TEST_PATTER_REQ_PARAM, SelectedLoginMethod.ADD_ME_AS_NEW)));
+
+ }
+
+ @Test
+ public void advancedMatchingFailedMsg() throws TaskExecutionException, UnsupportedEncodingException {
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+
+ task.execute(pendingReq, executionContext);
+
+ String html = doBasicValidation();
+ Assert.assertFalse("Missing eIDAS infos",
+ html.contains(MessageFormat.format(TEST_PATTER_REQ_PARAM, SelectedLoginMethod.ADD_ME_AS_NEW)));
+ Assert.assertTrue("missing errorfield",
+ html.contains("<div id=\"matchingError\""));
+
+ }
+
+ @Test
+ public void advancedMatchingFailedMsgWithDetails() throws TaskExecutionException, UnsupportedEncodingException {
+ String reason = RandomStringUtils.randomAlphabetic(5);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON, reason);
+
+ task.execute(pendingReq, executionContext);
+
+ String html = doBasicValidation();
+ Assert.assertTrue("missing errorfield",
+ html.contains("<div id=\"matchingError\""));
+ Assert.assertTrue("missing errorfield",
+ html.contains(reason));
+
+ }
+
+ @Test
+ public void validHtmlResponseWithOutLocale() throws TaskExecutionException, UnsupportedEncodingException {
+
+ task.execute(pendingReq, executionContext);
+
+ doBasicValidation();
+
+ }
+
+ @Test
+ public void validHtmlResponseWithDE() throws TaskExecutionException, UnsupportedEncodingException {
+ LocaleContextHolder.setLocale(Locale.GERMAN);
+ httpReq.addHeader("Accept-Language", "de");
+
+ task.execute(pendingReq, executionContext);
+
+ doBasicValidation();
+
+ }
+
+ @Test
+ public void validHtmlResponseWithEN() throws TaskExecutionException, UnsupportedEncodingException {
+ LocaleContextHolder.setLocale(Locale.ENGLISH);
+
+ task.execute(pendingReq, executionContext);
+
+ doBasicValidation();
+
+ }
+
+ @Test
+ public void validHtmlResponseWithFR() throws TaskExecutionException, UnsupportedEncodingException {
+ LocaleContextHolder.setLocale(Locale.FRANCE);
+ httpReq.addHeader("Accept-Language", "fr");
+
+ task.execute(pendingReq, executionContext);
+
+ doBasicValidation();
+
+ }
+
+ private String doBasicValidation() throws UnsupportedEncodingException {
+ Assert.assertEquals("Wrong http StatusCode", 200, httpResp.getStatus());
+ Assert.assertEquals("Wrong http ContentType", "text/html;charset=UTF-8", httpResp.getContentType());
+
+ String html = httpResp.getContentAsString();
+ Assert.assertNotNull("html result is null", html);
+ Assert.assertFalse("html result is empty", html.isEmpty());
+
+ Assert.assertTrue("Missing IDA Login",
+ html.contains(MessageFormat.format(TEST_PATTER_REQ_PARAM, SelectedLoginMethod.MOBILE_PHONE_SIGNATURE_LOGIN)));
+ Assert.assertTrue("Missing residence infos",
+ html.contains(MessageFormat.format(TEST_PATTER_REQ_PARAM, SelectedLoginMethod.NO_OTHER_LOGIN)));
+ Assert.assertTrue("Missing eIDAS infos",
+ html.contains(MessageFormat.format(TEST_PATTER_REQ_PARAM, SelectedLoginMethod.EIDAS_LOGIN)));
+
+ Assert.assertTrue("No language selector with pendingRequestId",
+ html.contains("/otherLoginMethod?lang=en&amp;pendingid=" + pendingReq.getPendingRequestId()));
+ Assert.assertTrue("No country-selection form",
+ html.contains("<form method=\"post\" action=\"/otherLoginMethod\">"));
+
+ return html;
+
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java
new file mode 100644
index 00000000..74ac065e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskTest.java
@@ -0,0 +1,939 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+
+import java.math.BigInteger;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import javax.xml.namespace.QName;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.ErnpRestClient.ErnpRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.IZmrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ZmrCommunicationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.CountrySpecificDetailSearchProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.GenericEidProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.InitialSearchTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.PersonSuchenRequest;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
+import eu.eidas.auth.commons.attribute.PersonType;
+import eu.eidas.auth.commons.light.impl.LightRequest;
+import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+public class InitialSearchTaskTest {
+
+
+ private static final String EE = "EE";
+ private static final String DE = "DE";
+
+ private static final String EE_ST = EE + "/ST/";
+ private static final String DE_ST = DE + "/ST/";
+
+ @Mock
+ private IZmrClient zmrClient;
+ @Mock
+ private IErnpClient ernpClient;
+
+ @Autowired
+ private List<CountrySpecificDetailSearchProcessor> handlers;
+ private RegisterSearchService registerSearchService;
+
+ private final ICcSpecificEidProcessingService eidPostProcessor = createEidPostProcessor();
+ private InitialSearchTask task;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+ private final String randomBpk = RandomStringUtils.randomNumeric(6);
+ private final String randomPseudonym = RandomStringUtils.randomNumeric(10);
+ private final String randomPersonalIdentifier_DE = DE_ST + randomPseudonym;
+ private final String randomPersonalIdentifier_EE = EE_ST + randomPseudonym;
+ private final String randomFamilyName = randomAlphabetic(10);
+ private final String randomGivenName = randomAlphabetic(10);
+ private final String randomPlaceOfBirth = randomAlphabetic(10);
+ private final String randomBirthName = randomAlphabetic(10);
+ private final String randomBirthDate = "2011-01-" + (10 + new Random().nextInt(18));
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void setUp() throws URISyntaxException, EaafStorageException {
+ registerSearchService = new RegisterSearchService(handlers, zmrClient, ernpClient);
+ task = new InitialSearchTask(registerSearchService, eidPostProcessor);
+
+ MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ MockHttpServletResponse httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ final AuthenticationResponse response = buildDummyAuthResponseRandomPerson();
+ pendingReq = new TestRequestImpl();
+ pendingReq.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+ }
+
+ @NotNull
+ private ICcSpecificEidProcessingService createEidPostProcessor() {
+ return new ICcSpecificEidProcessingService() {
+
+ private final GenericEidProcessor genericEidProcessor = new GenericEidProcessor();
+
+ @Override
+ public SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException, EidasAttributeException {
+ return genericEidProcessor.postProcess(eidasAttrMap);
+ }
+
+ @Override
+ public void preProcess(String selectedCC, IRequest pendingReq, LightRequest.Builder authnRequestBuilder) {
+ genericEidProcessor.preProcess(pendingReq, authnRequestBuilder);
+ }
+ };
+ }
+
+ /**
+ * One match, but register update needed
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchUpdateNecessary_Zmr() throws Exception {
+ String oldGivenName = randomAlphabetic(10);
+ String placeOfBirth = randomAlphabetic(10);
+ RegisterResult firstZmrResult = randomRegisterResult(oldGivenName, randomBpk, placeOfBirth);
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(zmrRegisterResult(firstZmrResult));
+
+ Mockito.when(zmrClient.searchCountrySpecific(any(), any(), any()))
+ .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary"));
+ Mockito.when(zmrClient.searchWithMds(any(), any(), any(), any(), any()))
+ .thenThrow(new IllegalStateException("MDS search should not be neccessary"));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenReturn(zmrRegisterResult(firstZmrResult));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any()))
+ .thenThrow(new IllegalStateException("MDS search should not be neccessary"));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ //INFO: has to be the old givenName because ZMR allows no update of MDS information
+ checkMatchingSuccessState(pendingReq, randomBpk, randomFamilyName, oldGivenName, randomBirthDate, DE);
+
+ }
+
+ /**
+ *
+ * One match, but register update needed.
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchUpdateNecessary_Ernp() throws TaskExecutionException, EidasSAuthenticationException {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(emptyZmrRegisterResult());
+ Mockito.when(zmrClient.searchCountrySpecific(any(), any(), any()))
+ .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary"));
+ Mockito.when(zmrClient.searchWithMds(any(), any(), any(), any(), any()))
+ .thenThrow(new IllegalStateException("MDS search should not be neccessary"));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ String oldRandomGivenName = randomAlphabetic(10);
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(ernpRegisterResult(randomRegisterResult(oldRandomGivenName, randomBpk)));
+ Mockito.when(ernpClient.searchCountrySpecific(any(), any()))
+ .thenThrow(new IllegalStateException("CountrySpecific search search should not be neccessary"));
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), any()))
+ .thenThrow(new IllegalStateException("MDS search should not be neccessary"));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenReturn(ernpRegisterResult(RegisterResult.builder()
+ .bpk(randomBpk)
+ .dateOfBirth(randomBirthDate)
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .build()));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq, randomBpk, randomFamilyName, randomGivenName, randomBirthDate, DE);
+ }
+
+
+
+ /**
+ * Two matches by PersonalId found in ZMR
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ public void multiPersonalIdMatch_Zmr() throws EidasSAuthenticationException {
+ String newRandomGivenName = randomAlphabetic(10);
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Arrays.asList(randomRegisterResult(), randomRegisterResult(newRandomGivenName, randomBpk)), generateRandomProcessId()));
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Two matches by PersonalId found in ZMR
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ public void withErrorFromZmr() throws EidasSAuthenticationException {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenThrow(new ZmrCommunicationException("jUnit ZMR error", null));
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertFalse("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Two matches by PersonalId found in ErnP
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ public void multiPersonalIdMatch_Ernp() throws EidasSAuthenticationException {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(emptyZmrRegisterResult());
+ String newRandomGivenName = randomAlphabetic(10);
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(ernpRegisterResult(
+ Arrays.asList(randomRegisterResult(), randomRegisterResult(newRandomGivenName, randomBpk))));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Two matches by PersonalId
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ public void multiPersonalIdMatch_ErnpAndZmr() throws EidasSAuthenticationException {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(zmrRegisterResult(randomRegisterResult()));
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(ernpRegisterResult(randomRegisterResult()));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * One match by PersonalId, no register update needed
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchNoUpdate_Ernp() throws Exception {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(emptyZmrRegisterResult());
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(ernpRegisterResult(randomRegisterResult()));
+
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq, randomBpk, randomFamilyName, randomGivenName, randomBirthDate, DE);
+ }
+
+ /**
+ * One match by PersonalId, no register update needed
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchNoUpdate_Zmr() throws Exception {
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(zmrRegisterResult(randomRegisterResult()));
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq, randomBpk, randomFamilyName, randomGivenName, randomBirthDate, DE);
+ }
+
+ /**
+ * Find single person in ZMR by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonFindWithCountySpecifics_Zmr() throws Exception {
+ final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName,
+ randomPersonalIdentifier_DE, randomBirthDate, randomPlaceOfBirth, randomBirthName);
+ TestRequestImpl pendingReq1 = new TestRequestImpl();
+ pendingReq1.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+
+ BigInteger zmrProcessId = generateRandomProcessId();
+ RegisterResult zmrResult = RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Collections.singletonList(randomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(randomPlaceOfBirth)
+ .birthName(randomBirthName)
+ .build();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchCountrySpecific(eq(zmrProcessId), any(PersonSuchenRequest.class), eq(DE)))
+ .thenReturn(zmrRegisterResult(zmrResult, zmrProcessId));
+ RegisterResult randomRegisterResult = RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Arrays.asList(randomPseudonym, RandomStringUtils.randomAlphanumeric(10)))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(randomPlaceOfBirth)
+ .birthName(randomBirthName)
+ .build();
+ Mockito.when(zmrClient.update(eq(zmrProcessId), eq(zmrResult), any()))
+ .thenReturn(zmrRegisterResult(randomRegisterResult, zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(any(), any(), any(), any(), any()))
+ .thenThrow(new IllegalStateException("MDS search should not be neccessary"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), eq(DE)))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(any(), any(), any(), eq(DE)))
+ .thenThrow(new IllegalStateException("ERnP MDS search should not be neccessary"));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+ Mockito.when(ernpClient.add(any()))
+ .thenThrow(new IllegalStateException("ERnP add-entity should not be neccessary"));
+
+ // execute test
+ task.execute(pendingReq1, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq1, randomBpk, randomFamilyName, randomGivenName, randomBirthDate, DE);
+
+ }
+
+ /**
+ * Multiple matches found in ZMR by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void multiplePersonFindWithCountySpecifics_Zmr() throws Exception {
+ String newRandomPseudonym = randomPersonalIdentifier_DE + RandomStringUtils.randomNumeric(2);
+ String newRandomBpk = randomBpk + RandomStringUtils.randomNumeric(6);
+ final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName,
+ randomPersonalIdentifier_DE,
+ randomBirthDate, randomPlaceOfBirth, randomBirthName);
+ TestRequestImpl pendingReq1 = new TestRequestImpl();
+ pendingReq1.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ RegisterResult randomResult1 = RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Collections.singletonList(randomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(randomPlaceOfBirth)
+ .birthName(randomBirthName)
+ .build();
+ RegisterResult randomResult2 = RegisterResult.builder()
+ .bpk(newRandomBpk)
+ .pseudonym(Collections.singletonList(newRandomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(randomPlaceOfBirth)
+ .birthName(randomBirthName)
+ .build();
+ Mockito.when(zmrClient.searchCountrySpecific(eq(zmrProcessId), any(PersonSuchenRequest.class), eq(DE)))
+ .thenReturn(new ZmrRegisterResult(Arrays.asList(randomResult1, randomResult2), zmrProcessId));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), eq(DE)))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq1, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Multiple matches found in ZMR and ERnP by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void multiplePersonFindWithCountySpecifics_ZmrAndErnp() throws Exception {
+ final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName,
+ randomPersonalIdentifier_DE,
+ randomBirthDate, randomPlaceOfBirth, randomBirthName);
+ TestRequestImpl pendingReq1 = new TestRequestImpl();
+ pendingReq1.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ RegisterResult randomResult1 = RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Collections.singletonList(randomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(randomPlaceOfBirth)
+ .birthName(randomBirthName)
+ .build();
+ Mockito.when(zmrClient.searchCountrySpecific(eq(zmrProcessId), any(PersonSuchenRequest.class), eq(DE)))
+ .thenReturn(new ZmrRegisterResult(Arrays.asList(randomResult1), zmrProcessId));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), eq(DE)))
+ .thenReturn(ernpRegisterResult(randomRegisterResult()));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq1, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Multiple matches found in ERnP by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void multiplePersonFindWithCountySpecifics_Ernp() throws Exception {
+ final AuthenticationResponse response = buildDummyAuthResponseDE(randomGivenName, randomFamilyName,
+ randomPersonalIdentifier_DE,
+ randomBirthDate, randomPlaceOfBirth, randomBirthName);
+ TestRequestImpl pendingReq1 = new TestRequestImpl();
+ pendingReq1.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE, response);
+
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchCountrySpecific(eq(zmrProcessId), any(PersonSuchenRequest.class), eq(DE)))
+ .thenReturn(new ZmrRegisterResult(Arrays.asList(), zmrProcessId));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchCountrySpecific(any(), eq(DE)))
+ .thenReturn(ernpRegisterResult(Arrays.asList(randomRegisterResult(), randomRegisterResult())));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq1, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * NO match found in ZMR and ErnP with Initial and MDS search
+ *
+ * @throws EidasSAuthenticationException
+ * @throws URISyntaxException
+ * @throws EaafStorageException
+ */
+ @Test
+ @DirtiesContext
+ public void noResultByAnySearch() throws TaskExecutionException, EidasSAuthenticationException, URISyntaxException, EaafStorageException {
+ BigInteger zmrProcessId = generateRandomProcessId();
+ pendingReq.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse(randomGivenName, randomFamilyName, randomPersonalIdentifier_EE, randomBirthDate));
+
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, EE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(zmrProcessId, randomGivenName, randomFamilyName, randomBirthDate, EE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, EE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, EE))
+ .thenReturn(new ErnpRegisterResult(Collections.emptyList()));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+
+ // validate state
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+
+ assertNull("Find intermediate matching data but matching should be finished",
+ MatchingTaskUtils.getIntermediateMatchingResult(pendingReq));
+ assertNull("Find final matching data but no match sould be found",
+ MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ Boolean transitionGUI = (Boolean) executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK);
+ Assert.assertNull("Wrong transition", transitionGUI);
+ Boolean transitionErnb = (Boolean) executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+ Assert.assertTrue("Wrong transition", transitionErnb);
+
+ }
+
+ /**
+ * Find one match with MDS search in ERnP.
+ */
+ @Test
+ @DirtiesContext
+ public void resultByMdsSearch_Ernb() throws TaskExecutionException, EidasSAuthenticationException, URISyntaxException, EaafStorageException {
+ BigInteger zmrProcessId = generateRandomProcessId();
+ pendingReq.getSessionData(AuthProcessDataWrapper.class)
+ .setGenericDataToSession(Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse(randomGivenName, randomFamilyName, randomPersonalIdentifier_EE, randomBirthDate));
+
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, EE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(zmrProcessId, randomGivenName, randomFamilyName, randomBirthDate, EE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, EE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, EE))
+ .thenReturn(ernpRegisterResult(randomRegisterResult()));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(1);
+
+ }
+
+ /**
+ * Find one match with MDS search in ZMR.
+ */
+ @Test
+ @DirtiesContext
+ public void resultByMdsSearch_Zmr() throws TaskExecutionException, EidasSAuthenticationException {
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(zmrProcessId, randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(zmrRegisterResult(randomRegisterResult(), zmrProcessId));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)).thenReturn(
+ emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(1);
+
+ }
+
+ /**
+ * Find matches with MDS search in ZMR and ERnP.
+ */
+ @Test
+ @DirtiesContext
+ public void resultByMdsSearch_ZmrAndErnp() throws TaskExecutionException, EidasSAuthenticationException {
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(zmrProcessId, randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(zmrRegisterResult(randomRegisterResult(), zmrProcessId));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE)).thenReturn(
+ emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(ernpRegisterResult(randomRegisterResult()));
+ Mockito.when(ernpClient.update(any(), any()))
+ .thenThrow(new IllegalStateException("ERnP update should not be neccessary"));
+
+
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(2);
+
+ }
+
+ /**
+ * resultByMdsSearch
+ */
+ @Test
+ @DirtiesContext
+ public void multipleResultsByMdsSearch() throws TaskExecutionException, EidasSAuthenticationException {
+ BigInteger zmrProcessId = generateRandomProcessId();
+ Mockito.when(zmrClient.searchWithPersonIdentifier(null, randomPseudonym, DE))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchCountrySpecific(eq(zmrProcessId), any(PersonSuchenRequest.class), any(String.class)))
+ .thenReturn(new ZmrRegisterResult(Collections.emptyList(), zmrProcessId));
+ Mockito.when(zmrClient.searchWithMds(zmrProcessId, randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(zmrRegisterResult(randomRegisterResult(randomBpk + "2"), zmrProcessId));
+ Mockito.when(zmrClient.update(any(), any(), any()))
+ .thenThrow(new IllegalStateException("ZMR update should not be neccessary"));
+
+ Mockito.when(ernpClient.searchWithPersonIdentifier(randomPseudonym, DE))
+ .thenReturn(emptyErnpRegisterResult());
+ Mockito.when(ernpClient.searchWithMds(randomGivenName, randomFamilyName, randomBirthDate, DE))
+ .thenReturn(ernpRegisterResult(Arrays.asList(randomRegisterResult(), randomRegisterResult(randomBpk + "1"))));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(3);
+
+ }
+
+ @NotNull
+ private ZmrSoapClient.ZmrRegisterResult emptyZmrRegisterResult() {
+ return new ZmrRegisterResult(Collections.emptyList(), generateRandomProcessId());
+ }
+
+ @NotNull
+ private ErnpRegisterResult emptyErnpRegisterResult() {
+ return new ErnpRegisterResult(Collections.emptyList());
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult, BigInteger processId) {
+ return new ZmrRegisterResult(Collections.singletonList(registerResult), processId);
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult) {
+ return zmrRegisterResult(registerResult, generateRandomProcessId());
+ }
+
+ @NotNull
+ private ErnpRegisterResult ernpRegisterResult(RegisterResult registerResult) {
+ return new ErnpRegisterResult(Collections.singletonList(registerResult));
+ }
+
+ @NotNull
+ private ErnpRegisterResult ernpRegisterResult(List<RegisterResult> registerResult) {
+ return new ErnpRegisterResult(registerResult);
+ }
+
+ @NotNull
+ private RegisterResult randomRegisterResult() {
+ return randomRegisterResult(randomGivenName, randomBpk);
+ }
+
+ @NotNull
+ private RegisterResult randomRegisterResult(String randomBpk) {
+ return randomRegisterResult(randomGivenName, randomBpk);
+ }
+
+ @NotNull
+ private RegisterResult randomRegisterResult(String randomGivenName, String randomBpk) {
+ return RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Collections.singletonList(randomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .build();
+ }
+
+ @NotNull
+ private RegisterResult randomRegisterResult(String randomGivenName, String randomBpk, String placeOfBirth) {
+ return RegisterResult.builder()
+ .bpk(randomBpk)
+ .pseudonym(Collections.singletonList(randomPseudonym))
+ .givenName(randomGivenName)
+ .familyName(randomFamilyName)
+ .dateOfBirth(randomBirthDate)
+ .placeOfBirth(placeOfBirth)
+ .build();
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponseRandomPerson() throws URISyntaxException {
+ return buildDummyAuthResponse(randomGivenName, randomFamilyName, DE_ST + randomPseudonym, randomBirthDate);
+ }
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ private void checkMatchingSuccessState(IRequest pendingReq, String bpk, String familyName, String givenName,
+ String birhday, String countryCode) {
+ assertNull("Find intermediate matching data but matching should be finished",
+ MatchingTaskUtils.getIntermediateMatchingResult(pendingReq));
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+
+ MatchedPersonResult personInfo = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", personInfo);
+ assertEquals("wrong bpk", bpk, personInfo.getBpk());
+ assertEquals("wrong givenName", givenName, personInfo.getGivenName());
+ assertEquals("wrong familyName", familyName, personInfo.getFamilyName());
+ assertEquals("wrong dateOfBirth", birhday, personInfo.getDateOfBirth());
+ assertEquals("wrong countryCode", countryCode, personInfo.getCountryCode());
+
+ }
+
+ private void checkIntermediateResult(int resultSize) {
+ Boolean transitionGUI = (Boolean) executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK);
+ Assert.assertTrue("Wrong transition", transitionGUI);
+ Boolean transitionErnb = (Boolean) executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+ Assert.assertNull("Wrong transition", transitionErnb);
+
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+ assertNull("Find final matching data but no match sould be found",
+ MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ RegisterStatusResults result = MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+ assertNotNull("Find no intermediate matching data", result);
+ assertEquals("wrong intermediate result size", resultSize, result.getResultCount());
+
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, null, null);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponseDE(String givenName, String familyName, String identifier,
+ String dateOfBirth, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, placeOfBirth, birthName);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth, String taxNumber, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ ImmutableAttributeMap.Builder builder = ImmutableAttributeMap.builder()
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_PERSONALIDENTIFIER,
+ randomAlphabetic(2), randomAlphabetic(2)), identifier)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTFAMILYNAME,
+ randomAlphabetic(3), randomAlphabetic(3)), familyName)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTGIVENNAME,
+ randomAlphabetic(4), randomAlphabetic(4)), givenName)
+ .put(generateDateTimeAttribute(Constants.eIDAS_ATTR_DATEOFBIRTH,
+ randomAlphabetic(5), randomAlphabetic(5)), dateOfBirth);
+ if (taxNumber != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_TAXREFERENCE,
+ randomAlphabetic(6), randomAlphabetic(6)), taxNumber);
+ }
+ if (birthName != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_BIRTHNAME,
+ randomAlphabetic(7), randomAlphabetic(7)), birthName);
+ }
+ if (placeOfBirth != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_PLACEOFBIRTH,
+ randomAlphabetic(8), randomAlphabetic(8)), placeOfBirth);
+ }
+ final ImmutableAttributeMap attributeMap = builder.build();
+
+ return new AuthenticationResponse.Builder().id(randomAlphabetic(5))
+ .issuer(randomAlphabetic(5)).subject(randomAlphabetic(5)).statusCode("200")
+ .inResponseTo(randomAlphabetic(5)).subjectNameIdFormat(randomAlphabetic(5))
+ .attributes(attributeMap).build();
+ }
+
+ private AttributeDefinition<Object> generateStringAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".LiteralStringAttributeValueMarshaller");
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private AttributeDefinition<Object> generateDateTimeAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".DateTimeAttributeValueMarshaller");
+ }
+
+ private AttributeDefinition<Object> generateAttribute(String friendlyName, String fragment, String prefix,
+ String marshaller) throws URISyntaxException {
+ return AttributeDefinition.builder()
+ .friendlyName(friendlyName).nameUri(new URI("ad", "sd", fragment))
+ .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", prefix))
+ .attributeValueMarshaller(marshaller).build();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java
new file mode 100644
index 00000000..6d0e7c31
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java
@@ -0,0 +1,683 @@
+/*
+ * Copyright 2020 A-SIT Plus GmbH
+ * AT-specific eIDAS Connector has been developed in a cooperation between EGIZ,
+ * A-SIT Plus GmbH, A-SIT, and Graz University of Technology.
+ *
+ * Licensed under the EUPL, Version 1.2 or - as soon they will be approved by
+ * the European Commission - subsequent versions of the EUPL (the "License");
+ * You may not use this work except in compliance with the License.
+ * You may obtain a copy of the License at:
+ * https://joinup.ec.europa.eu/news/understanding-eupl-v12
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This product combines work with different licenses. See the "NOTICE" text
+ * file for details on the various modules and licenses.
+ * The "NOTICE" text file is part of the distribution. Any derivative works
+ * that you distribute must include a readable copy of the "NOTICE" text file.
+ */
+
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+import javax.xml.namespace.QName;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.DirtiesContext.ClassMode;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.github.skjolber.mockito.soap.SoapServiceRule;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.ernp.IErnpClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.IZmrClient;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.clients.zmr.ZmrSoapClient.ZmrRegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidPostProcessingException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasAttributeException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasSAuthenticationException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.WorkflowException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.CountrySpecificDetailSearchProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.GenericEidProcessor;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.ICcSpecificEidProcessingService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.InitialSearchTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients.ErnpRestClientTest;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients.ZmrClientTest;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.bmi.namespace.zmr_su.base._20040201.RequestType;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
+import eu.eidas.auth.commons.attribute.PersonType;
+import eu.eidas.auth.commons.light.impl.LightRequest;
+import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
+import lombok.SneakyThrows;
+import okhttp3.mockwebserver.MockResponse;
+import okhttp3.mockwebserver.MockWebServer;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml",
+ "/SpringTest-context_ccSearchProcessor_test.xml"
+})
+@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
+public class InitialSearchTaskWithRegistersTest {
+
+ private static final String EE = "EE";
+ private static final String DE = "DE";
+
+ @Rule
+ public SoapServiceRule soap = SoapServiceRule.newInstance();
+
+ @Autowired IErnpClient ernpClient;
+ @Autowired IZmrClient zmrClient;
+ @Autowired List<CountrySpecificDetailSearchProcessor> handlers;
+
+ private RegisterSearchService registerSearchService;
+
+ private ServicePort zmrMock = null;
+
+ private static MockWebServer mockWebServer;
+
+ private final ICcSpecificEidProcessingService eidPostProcessor = createEidPostProcessor();
+ private InitialSearchTask task;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+ private static JAXBContext jaxbContext;
+
+ /**
+ * Initialize jUnit class.
+ */
+ @BeforeClass
+ @SneakyThrows
+ public static void classInitializer() {
+ jaxbContext = JAXBContext.newInstance(
+ at.gv.bmi.namespace.zmr_su.zmr._20040201.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.gis._20070725.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.base._20040201.ObjectFactory.class);
+
+ mockWebServer = new MockWebServer();
+ mockWebServer.start(1718);
+
+ }
+
+ @AfterClass
+ @SneakyThrows
+ public static void resetTestEnviroment() {
+ mockWebServer.shutdown();
+
+ }
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ @SneakyThrows
+ public void setUp() throws URISyntaxException, EaafStorageException {
+ if (zmrMock == null) {
+ zmrMock = soap.mock(ServicePort.class, "http://localhost:1234/demozmr");
+
+ }
+
+ registerSearchService = new RegisterSearchService(handlers, zmrClient, ernpClient);
+ task = new InitialSearchTask(registerSearchService, eidPostProcessor);
+
+ MockHttpServletRequest httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ MockHttpServletResponse httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+
+ }
+
+ /**
+ * One match, but register update needed
+ * <p>
+ * <b>Check if ZMR update request is NOT executed in case of MDS change!</b>
+ * </p>
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchUpdateNecessary_ZmrNotDone() throws Exception {
+
+ String oldGivenName = "XXXClaus - Maria";
+
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+
+ //perform prepair-update request
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml"))
+
+ //do not make an update because, MDS update is not allowed and no other data has been changed
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ //INFO: has to be the old givenName because ZMR allows no update of MDS information
+ checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg",
+ oldGivenName, "1994-12-31", DE);
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getValue().getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getValue(), ZmrClientTest.PROCESS_TASK_SEARCH,
+ new BigInteger("367100000000079"), "jUnit123456");
+
+ }
+
+ /**
+ * One match, but register update needed
+ * <p>
+ * <b>Check if ZMR update request is executed in case of other data than MDS change!</b>
+ * </p>
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonalIdMatchUpdateNecessary_ZmrDone() throws Exception {
+
+ String oldGivenName = "XXXClaus - Maria";
+ String placeOfBirth = RandomStringUtils.randomAlphabetic(5);
+
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse(oldGivenName, "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31", null, placeOfBirth, null));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml"))
+
+ //perform prepair-update request
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml"))
+
+ //do make an update because, MDS DOES NOT change, but additional attribute was available
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-6_kitt_update_resp.xml"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ //INFO: has to be the old givenName because ZMR allows no update of MDS information
+ checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg",
+ oldGivenName, "1994-12-31", DE);
+
+ // validate request
+ assertEquals("wrong number of req.", 3, zmrReq.getAllValues().size());
+ assertNotNull("Personensuche req.", zmrReq.getAllValues().get(0).getPersonSuchenRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456");
+
+ assertNotNull("Personenupdate req.", zmrReq.getAllValues().get(2).getPersonAendernRequest());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_UPDATE,
+ new BigInteger("367100000000079"), "jUnit123456");
+ assertEquals("eIDAS attribute to add", 4,
+ zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size());
+ assertNull("ZMR update MDS", zmrReq.getAllValues().get(2).getPersonAendernRequest().getPersonAenderung());
+
+ }
+
+
+ /**
+ * Two matches by PersonalId found in ZMR
+ *
+ * @throws EidasSAuthenticationException
+ */
+ @Test
+ @DirtiesContext
+ @SneakyThrows
+ public void multiPersonalIdMatch_Zmr() throws EidasSAuthenticationException {
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("XXXKlaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit", "1994-12-31"));
+
+ // inject response
+ when(zmrMock.service(any(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml"))
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ // execute task
+ TaskExecutionException exception = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ // validate state
+ assertTrue("Wrong exception", (exception.getOriginalException() instanceof WorkflowException));
+ assertTrue("Wrong flag 'manualFixNeeded'",
+ ((WorkflowException) exception.getOriginalException()).isRequiresManualFix());
+
+ }
+
+ /**
+ * Find single person in ZMR by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonFindWithCountySpecifics_Ernp() throws Exception {
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("vdqZZIaA", "mRjMKAQc",
+ "DE/AT/nj1m79jm9z", "1996-01-01",
+ null, "VRNCAylF", "miEklFHC"));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ BigInteger processId = new BigInteger("367100000000079");
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //personalId search
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //CC specific search
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //personalId search
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //CC specific search
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_search_with_cc_specific_resp.json"), "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //KITT search
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_kitt_search_latest_resp.json"), "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //KITT update
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/2_kitt_update_resp.json"), "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq, "TBGoMlirU881e2jMGETa9WLx1+A=", "mRjMKAQc",
+ "vdqZZIaA", "1996-01-01", DE);
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+
+ }
+
+
+ /**
+ * Find single person in ZMR by country specifics.
+ */
+ @Test
+ @DirtiesContext
+ public void singlePersonFindWithCountySpecifics_Zmr() throws Exception {
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("XXXClaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_with_New_ID", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ BigInteger processId = new BigInteger("367100000000079");
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //personalId search
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-8_search_with_personalId_only_resp.xml")) //CC specific search
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml")) //KITT latest version
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-6_kitt_update_resp.xml")) //KITT update
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //CC specific search
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkMatchingSuccessState(pendingReq, "UgeknNsc26lVuB7U/uYGVmWtnnA=", "XXXvon Brandenburg",
+ "XXXClaus - Maria", "1994-12-31", DE);
+
+ // validate request
+ assertEquals("wrong number of req.", 4, zmrReq.getAllValues().size());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(3), ZmrClientTest.PROCESS_TASK_UPDATE, processId, "jUnit123456");
+
+ }
+
+ /**
+ * Find one match with MDS search in ZMR.
+ */
+ @Test
+ @DirtiesContext
+ @SneakyThrows
+ public void resultByMdsSearch_Zmr() throws TaskExecutionException, EidasSAuthenticationException {
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("XXXClaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_with_New_ID", "1994-12-31"));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ BigInteger processId = new BigInteger("367100000000079");
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //personalId search
+ //CC-specific will be ignored because CC is DE but BirthName and PlaceOfBirth is 'null'
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_1-2_search_with_mds_resp.xml")) //MDS specific search
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //MDS specific search
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(1);
+
+ // validate request
+ assertEquals("wrong number of req.", 2, zmrReq.getAllValues().size());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+
+ }
+
+ /**
+ * Find one match with MDS search in ZMR.
+ */
+ @Test
+ @DirtiesContext
+ @SneakyThrows
+ public void resultByMdsSearch_Zmr_Second() throws TaskExecutionException, EidasSAuthenticationException {
+ //inject eIDAS data
+ pendingReq.getSessionData(AuthProcessDataWrapper.class).setGenericDataToSession(
+ Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse("XXXClaus - Maria", "XXXvon Brandenburg",
+ "DE/AT/7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_with_New_ID", "1994-12-31",
+ null, "Hintergigritzpotschn", "XXXvon Heuburg"));
+
+ final ArgumentCaptor<RequestType> zmrReq = ArgumentCaptor.forClass(RequestType.class);
+ BigInteger processId = new BigInteger("367100000000079");
+
+ // inject response
+ when(zmrMock.service(zmrReq.capture(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //personalId search
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml")) //CC-specific search
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp_moreThanOne.xml")) //MDS specific search
+ .thenThrow(new RuntimeException("This request is not needed any more"));
+
+
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200)
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //CC specific search
+ .setBody("{}")
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+ mockWebServer.enqueue(new MockResponse().setResponseCode(200) //MDS specific search
+ .setBody(IOUtils.toString(
+ ErnpRestClientTest.class.getResourceAsStream("/data/ernp/3_search_with_mds_resp.json"), "UTF-8"))
+ .setHeader("Content-Type", "application/json;charset=utf-8"));
+
+
+ // execute test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ checkIntermediateResult(3);
+
+ // validate request
+ assertEquals("wrong number of req.", 3, zmrReq.getAllValues().size());
+ checkBasicRequestParameters(zmrReq.getAllValues().get(0), ZmrClientTest.PROCESS_TASK_SEARCH, null, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(1), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+ checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_SEARCH, processId, "jUnit123456");
+
+ }
+
+
+
+ @NotNull
+ private ICcSpecificEidProcessingService createEidPostProcessor() {
+ return new ICcSpecificEidProcessingService() {
+
+ private final GenericEidProcessor genericEidProcessor = new GenericEidProcessor();
+
+ @Override
+ public SimpleEidasData postProcess(Map<String, Object> eidasAttrMap) throws EidPostProcessingException, EidasAttributeException {
+ return genericEidProcessor.postProcess(eidasAttrMap);
+ }
+
+ @Override
+ public void preProcess(String selectedCC, IRequest pendingReq, LightRequest.Builder authnRequestBuilder) {
+ genericEidProcessor.preProcess(pendingReq, authnRequestBuilder);
+ }
+ };
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult, BigInteger processId) {
+ return new ZmrRegisterResult(Collections.singletonList(registerResult), processId);
+ }
+
+ @NotNull
+ private ZmrRegisterResult zmrRegisterResult(RegisterResult registerResult) {
+ return zmrRegisterResult(registerResult, generateRandomProcessId());
+ }
+
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ private void checkMatchingSuccessState(IRequest pendingReq, String bpk, String familyName, String givenName,
+ String birhday, String countryCode) {
+ assertNull("Find intermediate matching data but matching should be finished",
+ MatchingTaskUtils.getIntermediateMatchingResult(pendingReq));
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+
+ MatchedPersonResult personInfo = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", personInfo);
+ assertEquals("wrong bpk", bpk, personInfo.getBpk());
+ assertEquals("wrong givenName", givenName, personInfo.getGivenName());
+ assertEquals("wrong familyName", familyName, personInfo.getFamilyName());
+ assertEquals("wrong dateOfBirth", birhday, personInfo.getDateOfBirth());
+ assertEquals("wrong countryCode", countryCode, personInfo.getCountryCode());
+
+ }
+
+ private void checkIntermediateResult(int resultSize) {
+ Boolean transitionGUI = (Boolean) executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK);
+ Assert.assertTrue("Wrong transition", transitionGUI);
+ Boolean transitionErnb = (Boolean) executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+ Assert.assertNull("Wrong transition", transitionErnb);
+
+ assertNotNull("find no eIDAS inbut data", MatchingTaskUtils.getInitialEidasData(pendingReq));
+ assertNull("Find final matching data but no match sould be found",
+ MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ RegisterStatusResults result = MatchingTaskUtils.getIntermediateMatchingResult(pendingReq);
+ assertNotNull("Find no intermediate matching data", result);
+ assertEquals("wrong intermediate result size", resultSize, result.getResultCount());
+
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, null, null);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponseDE(String givenName, String familyName, String identifier,
+ String dateOfBirth, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ return buildDummyAuthResponse(givenName, familyName, identifier, dateOfBirth, null, placeOfBirth, birthName);
+ }
+
+ @NotNull
+ private AuthenticationResponse buildDummyAuthResponse(String givenName, String familyName, String identifier,
+ String dateOfBirth, String taxNumber, String placeOfBirth,
+ String birthName) throws URISyntaxException {
+ ImmutableAttributeMap.Builder builder = ImmutableAttributeMap.builder()
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_PERSONALIDENTIFIER,
+ randomAlphabetic(2), randomAlphabetic(2)), identifier)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTFAMILYNAME,
+ randomAlphabetic(3), randomAlphabetic(3)), familyName)
+ .put(generateStringAttribute(Constants.eIDAS_ATTR_CURRENTGIVENNAME,
+ randomAlphabetic(4), randomAlphabetic(4)), givenName)
+ .put(generateDateTimeAttribute(Constants.eIDAS_ATTR_DATEOFBIRTH,
+ randomAlphabetic(5), randomAlphabetic(5)), dateOfBirth);
+ if (taxNumber != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_TAXREFERENCE,
+ randomAlphabetic(6), randomAlphabetic(6)), taxNumber);
+ }
+ if (birthName != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_BIRTHNAME,
+ randomAlphabetic(7), randomAlphabetic(7)), birthName);
+ }
+ if (placeOfBirth != null) {
+ builder.put(generateStringAttribute(Constants.eIDAS_ATTR_PLACEOFBIRTH,
+ randomAlphabetic(8), randomAlphabetic(8)), placeOfBirth);
+ }
+ final ImmutableAttributeMap attributeMap = builder.build();
+
+ return new AuthenticationResponse.Builder().id(randomAlphabetic(5))
+ .issuer(randomAlphabetic(5)).subject(randomAlphabetic(5)).statusCode("200")
+ .inResponseTo(randomAlphabetic(5)).subjectNameIdFormat(randomAlphabetic(5))
+ .attributes(attributeMap).build();
+ }
+
+ private AttributeDefinition<Object> generateStringAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".LiteralStringAttributeValueMarshaller");
+ }
+
+ @SuppressWarnings("SameParameterValue")
+ private AttributeDefinition<Object> generateDateTimeAttribute(String friendlyName, String fragment, String prefix)
+ throws URISyntaxException {
+ return generateAttribute(friendlyName, fragment, prefix, "eu.eidas.auth.commons.attribute.impl" +
+ ".DateTimeAttributeValueMarshaller");
+ }
+
+ private AttributeDefinition<Object> generateAttribute(String friendlyName, String fragment, String prefix,
+ String marshaller) throws URISyntaxException {
+ return AttributeDefinition.builder()
+ .friendlyName(friendlyName).nameUri(new URI("ad", "sd", fragment))
+ .personType(PersonType.LEGAL_PERSON).xmlType(new QName("http://saf", "as", prefix))
+ .attributeValueMarshaller(marshaller).build();
+ }
+
+ private ResponseType loadResponseFromFile(String filepath) throws JAXBException {
+ final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ JAXBElement<?> resp = (JAXBElement<?>) unmarshaller.unmarshal(ZmrClientTest.class.getResourceAsStream(
+ filepath));
+ return (ResponseType) resp.getValue();
+
+ }
+
+ private void checkBasicRequestParameters(RequestType requestType, String vorgangName, BigInteger processId,
+ String behoerdennummer) {
+ assertNotNull("no workflow infos", requestType.getWorkflowInfoClient());
+ assertEquals("processName", ZmrClientTest.PROCESS_GENERAL, requestType.getWorkflowInfoClient().getProzessName());
+ assertEquals("vorgangsName", vorgangName, requestType.getWorkflowInfoClient().getVorgangName());
+
+ if (processId != null) {
+ assertEquals("processId", processId, requestType.getWorkflowInfoClient().getProzessInstanzID());
+ } else {
+ assertNull("processId", requestType.getWorkflowInfoClient().getProzessInstanzID());
+ }
+
+ assertNotNull("no client infos", requestType.getClientInfo());
+ assertEquals("behoerdennummer", behoerdennummer, requestType.getClientInfo().getOrganisation()
+ .getBehoerdenNr());
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskRegisterTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskRegisterTest.java
new file mode 100644
index 00000000..8d52baf3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskRegisterTest.java
@@ -0,0 +1,339 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Unmarshaller;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.github.skjolber.mockito.soap.SoapServiceRule;
+import com.google.common.collect.Lists;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAustrianResidenceGuiResponseTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.clients.ZmrClientTest;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
+import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class ReceiveAustrianResidenceGuiResponseTaskRegisterTest {
+
+ @Autowired
+ protected MsConnectorDummyConfigMap authConfig;
+
+ @Autowired
+ private RegisterSearchService registerSearchService;
+
+ @Rule
+ public SoapServiceRule soap = SoapServiceRule.newInstance();
+ private ServicePort zmrMock = null;
+ private static JAXBContext jaxbContext;
+
+ private ReceiveAustrianResidenceGuiResponseTask task;
+ private ExecutionContext executionContext;
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private TestRequestImpl pendingReq;
+
+
+ /**
+ * Initialize jUnit class.
+ */
+ @BeforeClass
+ @SneakyThrows
+ public static void classInitializer() {
+ jaxbContext = JAXBContext.newInstance(
+ at.gv.bmi.namespace.zmr_su.zmr._20040201.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.gis._20070725.ObjectFactory.class,
+ at.gv.bmi.namespace.zmr_su.base._20040201.ObjectFactory.class);
+
+ }
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws Exception In case of an set-up error
+ */
+ @Before
+ public void setUp() throws Exception {
+ if (zmrMock == null) {
+ zmrMock = soap.mock(ServicePort.class, "http://localhost:1234/demozmr");
+
+ }
+
+ executionContext = new ExecutionContextImpl();
+ task = new ReceiveAustrianResidenceGuiResponseTask(registerSearchService);
+
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setAuthUrl("https://localhost/ms_connector");
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+
+ LocaleContextHolder.resetLocaleContext();
+ }
+
+ @Test
+ public void canceledByUser() throws Exception {
+ RegisterStatusResults registerSearchResult = buildEmptyResult();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+ httpReq.setParameter(ReceiveAustrianResidenceGuiResponseTask.HTTP_PARAM_NO_RESIDENCE, "true");
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To RequestInserErnp", true,
+ executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", false,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertNull("matching failed flag", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void noRegisterResult() throws Exception {
+ setupUserInput();
+ setupEidasData();
+ RegisterStatusResults registerSearchResult = buildEmptyResult();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ // inject ZMR response
+ when(zmrMock.service(any(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/empty_zmr_result.xml"));
+
+ // execute task
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertEquals("Transition To RequestInserErnp", false, executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.22", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void exactlyOneRegisterResult_Update() throws Exception {
+ setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch(buildMatchingRegisterResult(eidasData));
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ // inject ZMR response
+ when(zmrMock.service(any(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-6_kitt_update_resp.xml"));
+
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertNull("Transition To S9", executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK));
+ MatchedPersonResult matchingResult = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", matchingResult);
+
+ }
+
+ @Test
+ public void exactlyOneRegisterResult_UpdateFailedByZmrError() throws Exception {
+ setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch(buildMatchingRegisterResult(eidasData));
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ // inject ZMR response
+ when(zmrMock.service(any(), any()))
+ .thenReturn(loadResponseFromFile("/data/zmr/search_with_personalId_only_resp.xml"))
+ .thenReturn(loadResponseFromFile("/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml"))
+ .thenThrow(new RuntimeException("ZMR update should fail for that test"));
+
+ TaskExecutionException error = assertThrows("wrong exception", TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals("wrong errorId", "module.eidasauth.matching.04", ((EaafException) error.getOriginalException()).getErrorId());
+
+ }
+
+ @Test
+ public void zmrError() throws Exception {
+ setupUserInput();
+ setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithTwoMatches();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ TaskExecutionException error = assertThrows("wrong exception", TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals("wrong errorId", "module.eidasauth.matching.03", ((EaafException) error.getOriginalException()).getErrorId());
+
+ }
+
+ @SneakyThrows
+ private void validateMatchedPerson(MatchedPersonResult current,
+ RegisterStatusResults registerUpdateResult) {
+ RegisterResult expected = registerUpdateResult.getResult();
+ assertEquals("familyName", expected.getFamilyName(), current.getFamilyName());
+ assertEquals("givenName", expected.getGivenName(), current.getGivenName());
+ assertEquals("birthday", expected.getDateOfBirth(), current.getDateOfBirth());
+ assertEquals("bpk", expected.getBpk(), current.getBpk());
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildEmptyResult() {
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.emptyList(), Collections.emptyList());
+
+ }
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithOneMatch(RegisterResult registerResult) {
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.singletonList(registerResult), Collections.emptyList());
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithTwoMatches() {
+ List<RegisterResult> results = Lists.newArrayList(buildRandomRegisterResult(), buildRandomRegisterResult());
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ results, Collections.emptyList());
+
+ }
+
+ @NotNull
+ private RegisterResult buildRandomRegisterResult() {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(RandomStringUtils.randomAlphabetic(8)))
+ .givenName(RandomStringUtils.randomAlphabetic(8))
+ .familyName(RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth(RandomStringUtils.randomAlphabetic(8))
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private RegisterResult buildMatchingRegisterResult(SimpleEidasData eidData) {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(eidData.getPseudonym()))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private RegisterResult buildNotMatchingRegisterResult(SimpleEidasData eidData) {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(eidData.getPseudonym() + RandomStringUtils.randomAlphabetic(8)))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private void setHttpParameters(AdresssucheOutput input) {
+ httpReq.setParameter(AdresssucheController.PARAM_STREET, input.getStreet());
+ httpReq.setParameter(AdresssucheController.PARAM_MUNIPICALITY, input.getMunicipality());
+ httpReq.setParameter(AdresssucheController.PARAM_NUMBER, input.getNumber());
+ httpReq.setParameter(AdresssucheController.PARAM_VILLAGE, input.getVillage());
+ httpReq.setParameter(AdresssucheController.PARAM_POSTLEITZAHL, input.getPostleitzahl());
+
+ }
+
+ @NotNull
+ private SimpleEidasData setupEidasData() throws EaafStorageException {
+ SimpleEidasData result = SimpleEidasData.builder()
+ .pseudonym(RandomStringUtils.randomAlphabetic(8))
+ .familyName(RandomStringUtils.randomAlphabetic(8))
+ .givenName(RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1970-01-01")
+ .build();
+ AuthProcessDataWrapper authProcessDataWrapper = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ authProcessDataWrapper.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, result);
+ return result;
+ }
+
+ @NotNull
+ private AdresssucheOutput setupUserInput() {
+ AdresssucheOutput result = new AdresssucheOutput(
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8));
+ setHttpParameters(result);
+ return result;
+ }
+
+ private ResponseType loadResponseFromFile(String filepath) throws JAXBException {
+ final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
+ JAXBElement<?> resp = (JAXBElement<?>) unmarshaller.unmarshal(ZmrClientTest.class.getResourceAsStream(
+ filepath));
+ return (ResponseType) resp.getValue();
+
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskTest.java
new file mode 100644
index 00000000..d7c0acc4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAustrianResidenceGuiResponseTaskTest.java
@@ -0,0 +1,320 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.mockito.ArgumentMatchers.eq;
+
+import java.math.BigInteger;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.google.common.collect.Lists;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.controller.AdresssucheController.AdresssucheOutput;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.MatchedPersonResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAustrianResidenceGuiResponseTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import lombok.SneakyThrows;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class ReceiveAustrianResidenceGuiResponseTaskTest {
+
+ @Autowired
+ protected MsConnectorDummyConfigMap authConfig;
+
+ @MockBean
+ private RegisterSearchService registerSearchService;
+
+ private ReceiveAustrianResidenceGuiResponseTask task;
+
+ private ExecutionContext executionContext;
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private TestRequestImpl pendingReq;
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws Exception In case of an set-up error
+ */
+ @Before
+ public void setUp() throws Exception {
+ executionContext = new ExecutionContextImpl();
+ task = new ReceiveAustrianResidenceGuiResponseTask(registerSearchService);
+
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setAuthUrl("https://localhost/ms_connector");
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+
+ LocaleContextHolder.resetLocaleContext();
+ }
+
+ @Test
+ public void canceledByUser() throws Exception {
+ AdresssucheOutput userInput = setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildEmptyResult();
+ mockRegisterSearch(userInput, registerSearchResult, eidasData);
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+ httpReq.setParameter(ReceiveAustrianResidenceGuiResponseTask.HTTP_PARAM_NO_RESIDENCE, "true");
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To RequestInserErnp", true,
+ executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", false,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertNull("matching failed flag", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void noInputData() throws Exception {
+ RegisterStatusResults registerSearchResult = buildEmptyResult();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To RequestInserErnp", false, executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.21", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void noRegisterResult() throws Exception {
+ AdresssucheOutput userInput = setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildEmptyResult();
+ mockRegisterSearch(userInput, registerSearchResult, eidasData);
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To RequestInserErnp", false, executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.22", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void exactlyOneRegisterResult_NoUpdate() throws Exception {
+ AdresssucheOutput userInput = setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch(buildMatchingRegisterResult(eidasData));
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+ mockRegisterSearch(userInput, registerSearchResult, eidasData);
+
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertNull("Transition To S9", executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK));
+ MatchedPersonResult matchingResult = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", matchingResult);
+ validateMatchedPerson(matchingResult, registerSearchResult);
+
+ }
+
+ @Test
+ public void exactlyOneRegisterResult_UpdateRequired() throws Exception {
+ AdresssucheOutput userInput = setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch(buildNotMatchingRegisterResult(eidasData));
+ RegisterStatusResults registerUpdateResult = buildResultWithOneMatch(buildRandomRegisterResult());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+ mockRegisterSearch(userInput, registerSearchResult, eidasData);
+ Mockito.when(registerSearchService.step7aKittProcess(eq(registerSearchResult), eq(eidasData)))
+ .thenReturn(registerUpdateResult);
+
+ // perform test
+ task.execute(pendingReq, executionContext);
+
+ // validate state
+ assertNull("Transition To S9", executionContext.get(Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK));
+
+ MatchedPersonResult matchingResult = MatchingTaskUtils.getFinalMatchingResult(pendingReq);
+ assertNotNull("no final matching result", matchingResult);
+ validateMatchedPerson(matchingResult, registerUpdateResult);
+
+ }
+
+ @Test
+ public void moreThanOneRegisterResult() throws Exception {
+ AdresssucheOutput userInput = setupUserInput();
+ SimpleEidasData eidasData = setupEidasData();
+ RegisterStatusResults registerSearchResult = buildResultWithTwoMatches();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+ mockRegisterSearch(userInput, registerSearchResult, eidasData);
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To RequestInserErnp", false, executionContext.get(Constants.TRANSITION_TO_REQUESTING_NEW_ERNP_ENTRY_TASK));
+ assertEquals("Transition To AddressSearchForm", true,
+ executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.22", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @SneakyThrows
+ private void validateMatchedPerson(MatchedPersonResult current,
+ RegisterStatusResults registerUpdateResult) {
+ RegisterResult expected = registerUpdateResult.getResult();
+ assertEquals("familyName", expected.getFamilyName(), current.getFamilyName());
+ assertEquals("givenName", expected.getGivenName(), current.getGivenName());
+ assertEquals("birthday", expected.getDateOfBirth(), current.getDateOfBirth());
+ assertEquals("bpk", expected.getBpk(), current.getBpk());
+
+ }
+
+ @SneakyThrows
+ private void mockRegisterSearch(AdresssucheOutput userInput, RegisterStatusResults registerSearchResult, SimpleEidasData eidasData ) {
+ Mockito.when(registerSearchService.searchWithResidence(eq(registerSearchResult.getOperationStatus()), eq(eidasData),
+ eq(userInput))).thenReturn(registerSearchResult);
+ }
+
+ @NotNull
+ private RegisterStatusResults buildEmptyResult() {
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.emptyList(), Collections.emptyList());
+
+ }
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithOneMatch(RegisterResult registerResult) {
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.singletonList(registerResult), Collections.emptyList());
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithTwoMatches() {
+ List<RegisterResult> results = Lists.newArrayList(buildRandomRegisterResult(), buildRandomRegisterResult());
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ results, Collections.emptyList());
+
+ }
+
+ @NotNull
+ private RegisterResult buildRandomRegisterResult() {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(RandomStringUtils.randomAlphabetic(8)))
+ .givenName(RandomStringUtils.randomAlphabetic(8))
+ .familyName(RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth(RandomStringUtils.randomAlphabetic(8))
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private RegisterResult buildMatchingRegisterResult(SimpleEidasData eidData) {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(eidData.getPseudonym()))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private RegisterResult buildNotMatchingRegisterResult(SimpleEidasData eidData) {
+ return RegisterResult.builder()
+ .pseudonym(Arrays.asList(eidData.getPseudonym() + RandomStringUtils.randomAlphabetic(8)))
+ .givenName(eidData.getGivenName())
+ .familyName(eidData.getFamilyName())
+ .dateOfBirth(eidData.getDateOfBirth())
+ .bpk(RandomStringUtils.randomAlphabetic(8))
+ .build();
+
+ }
+
+ private void setHttpParameters(AdresssucheOutput input) {
+ httpReq.setParameter(AdresssucheController.PARAM_STREET, input.getStreet());
+ httpReq.setParameter(AdresssucheController.PARAM_MUNIPICALITY, input.getMunicipality());
+ httpReq.setParameter(AdresssucheController.PARAM_NUMBER, input.getNumber());
+ httpReq.setParameter(AdresssucheController.PARAM_VILLAGE, input.getVillage());
+ httpReq.setParameter(AdresssucheController.PARAM_POSTLEITZAHL, input.getPostleitzahl());
+
+ }
+
+ @NotNull
+ private SimpleEidasData setupEidasData() throws EaafStorageException {
+ SimpleEidasData result = SimpleEidasData.builder()
+ .pseudonym(RandomStringUtils.randomAlphabetic(8))
+ .familyName(RandomStringUtils.randomAlphabetic(8))
+ .givenName(RandomStringUtils.randomAlphabetic(8))
+ .dateOfBirth("1970-01-01")
+ .build();
+ AuthProcessDataWrapper authProcessDataWrapper = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ authProcessDataWrapper.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, result);
+ return result;
+ }
+
+ @NotNull
+ private AdresssucheOutput setupUserInput() {
+ AdresssucheOutput result = new AdresssucheOutput(
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8),
+ RandomStringUtils.randomAlphabetic(8));
+ setHttpParameters(result);
+ return result;
+ }
+
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAuthnResponseTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAuthnResponseTaskTest.java
new file mode 100644
index 00000000..842c8bf7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveAuthnResponseTaskTest.java
@@ -0,0 +1,254 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static at.asitplus.eidas.specific.core.MsEidasNodeConstants.PROP_CONFIG_SP_NEW_EID_MODE;
+
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import at.asitplus.eidas.specific.core.MsEidasNodeConstants;
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummySpConfiguration;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask;
+import at.gv.egiz.eaaf.core.api.IRequest;
+import at.gv.egiz.eaaf.core.api.IRequestStorage;
+import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.EaafStorageException;
+import at.gv.egiz.eaaf.core.exceptions.PendingReqIdValidationException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.EidAuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import at.gv.egiz.eaaf.core.impl.utils.Random;
+import eu.eidas.auth.commons.attribute.AttributeDefinition;
+import eu.eidas.auth.commons.attribute.ImmutableAttributeMap;
+import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
+import lombok.val;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"})
+public class ReceiveAuthnResponseTaskTest {
+
+ @Autowired(required = true)
+ private ReceiveAuthnResponseTask task;
+
+ @Autowired(required = true)
+ private MsConnectorDummyConfigMap basicConfig;
+ @Autowired
+ protected EidasAttributeRegistry attrRegistry;
+
+ @Autowired private IRequestStorage storage;
+
+ final ExecutionContext executionContext = new ExecutionContextImpl();
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private TestRequestImpl pendingReq;
+ private MsConnectorDummySpConfiguration oaParam;
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void setUp() throws EaafStorageException, URISyntaxException {
+
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
+ basicConfig.putConfigValue("eidas.ms.auth.eIDAS.eid.testidentity.default", "false");
+
+ final Map<String, String> spConfig = new HashMap<>();
+ spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");
+ spConfig.put("target", "urn:publicid:gv.at:cdid+XX");
+ spConfig.put(PROP_CONFIG_SP_NEW_EID_MODE, "true");
+ oaParam = new MsConnectorDummySpConfiguration(spConfig, basicConfig);
+ oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH));
+ pendingReq = new TestRequestImpl();
+
+ pendingReq.setSpConfig(oaParam);
+ pendingReq.setPendingReqId(at.gv.egiz.eaaf.core.impl.utils.Random.nextProcessReferenceValue());
+ pendingReq.setAuthUrl("http://test.com/");
+ pendingReq.setTransactionId("avaasbav");
+ pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
+
+ executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
+ executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true);
+
+ }
+
+ @Test
+ public void missingEidasResponse() {
+ try {
+ task.execute(pendingReq, executionContext);
+ Assert.fail("No eIDAS response not detected");
+
+ } catch (TaskExecutionException e) {
+ Assert.assertEquals("ErrorId", "eidas.01",
+ ((EaafException) e.getOriginalException()).getErrorId());
+
+ }
+ }
+
+ @Test
+ public void notSuccessEidasResponse() throws URISyntaxException {
+ String statusCode = RandomStringUtils.randomAlphabetic(10);
+ httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE,
+ buildDummyAuthResponse(statusCode));
+
+
+ try {
+ task.execute(pendingReq, executionContext);
+ Assert.fail("No eIDAS response not detected");
+
+ } catch (TaskExecutionException e) {
+ Assert.assertEquals("ErrorId", "eidas.02",
+ ((EaafException) e.getOriginalException()).getErrorId());
+ Assert.assertEquals("wrong parameter size", 2, ((EaafException) e.getOriginalException())
+ .getParams().length);
+ Assert.assertEquals("wrong errorMsg", statusCode, ((EaafException) e
+ .getOriginalException()).getParams()[0]);
+
+ }
+ }
+
+ @Test
+ public void successAndForward() throws URISyntaxException, TaskExecutionException,
+ PendingReqIdValidationException, EaafStorageException {
+
+ AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
+ httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
+
+ String alternativReturnEndpoint = "http://ms-connector.alternative/" + RandomStringUtils.randomAlphabetic(10);
+ pendingReq.setRawDataToTransaction(
+ MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, alternativReturnEndpoint);
+
+ //execute test
+ task.execute(pendingReq, executionContext);
+
+ //validate state
+ Assert.assertEquals("msConnectorStage", true,
+ (Boolean) executionContext.get(MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING));
+
+ IRequest storedReq = storage.getPendingRequest(pendingReq.getPendingRequestId());
+ Assert.assertNotNull("pendingReq not stored", storedReq);
+ Assert.assertNull("staging info is not null", storedReq.getRawData(
+ MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING, String.class));
+
+ //validate state
+ Assert.assertEquals("Wrong http statusCode", 302, httpResp.getStatus());
+ Assert.assertNotNull("No redirect header", httpResp.getHeaderValue("Location"));
+ Assert.assertTrue("Wrong redirect endpoint",
+ ((String) httpResp.getHeaderValue("Location")).startsWith(alternativReturnEndpoint));
+
+
+ }
+
+ public void success() throws URISyntaxException, TaskExecutionException, PendingReqIdValidationException {
+ @Nonnull
+ AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
+ httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
+ executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
+
+ //execute test
+ task.execute(pendingReq, executionContext);
+
+ //validate state
+ IRequest storedReq = storage.getPendingRequest(pendingReq.getPendingRequestId());
+ Assert.assertNotNull("pendingReq not stored", storedReq);
+ final EidAuthProcessDataWrapper authProcessData = storedReq.getSessionData(EidAuthProcessDataWrapper.class);
+ Assert.assertEquals("LoA", eidasResponse.getLevelOfAssurance(), authProcessData.getQaaLevel());
+ Assert.assertNotNull("eIDAS response",
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+ Assert.assertEquals("eIDAS response", eidasResponse,
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+
+ Assert.assertFalse("testIdentity flag", authProcessData.isTestIdentity());
+
+ Assert.assertEquals("msConnectorStage", false,
+ (Boolean) executionContext.get(MsEidasNodeConstants.EXECCONTEXT_PARAM_MSCONNECTOR_STAGING));
+ }
+
+ @Test
+ public void successWithTestIdentity() throws URISyntaxException, TaskExecutionException, PendingReqIdValidationException {
+ basicConfig.putConfigValue("eidas.ms.auth.eIDAS.eid.testidentity.default", "true");
+
+ @Nonnull
+ AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
+ httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
+ executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
+
+ //execute test
+ task.execute(pendingReq, executionContext);
+
+ //validate state
+ IRequest storedReq = storage.getPendingRequest(pendingReq.getPendingRequestId());
+ Assert.assertNotNull("pendingReq not stored", storedReq);
+
+ final EidAuthProcessDataWrapper authProcessData = storedReq.getSessionData(EidAuthProcessDataWrapper.class);
+ Assert.assertEquals("LoA", eidasResponse.getLevelOfAssurance(), authProcessData.getQaaLevel());
+ Assert.assertNotNull("eIDAS response",
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+ Assert.assertEquals("eIDAS response", eidasResponse,
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+ Assert.assertTrue("testIdentity flag", authProcessData.isTestIdentity());
+
+ }
+
+
+
+ @Nonnull
+ private AuthenticationResponse buildDummyAuthResponse(String statusCode) throws URISyntaxException {
+ final AttributeDefinition attributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
+ Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first();
+ final AttributeDefinition attributeDef2 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
+ Constants.eIDAS_ATTR_CURRENTFAMILYNAME).first();
+ final AttributeDefinition attributeDef3 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
+ Constants.eIDAS_ATTR_CURRENTGIVENNAME).first();
+ final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
+ Constants.eIDAS_ATTR_DATEOFBIRTH).first();
+
+ final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder()
+ .put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64))
+ .put(attributeDef2, RandomStringUtils.randomAlphabetic(10))
+ .put(attributeDef3, RandomStringUtils.randomAlphabetic(10)).put(attributeDef4, "2001-01-01").build();
+
+ val b = new AuthenticationResponse.Builder();
+ return b.id("_".concat(Random.nextHexRandom16()))
+ .issuer(RandomStringUtils.randomAlphabetic(10))
+ .subject(RandomStringUtils.randomAlphabetic(10))
+ .statusCode(statusCode)
+ .inResponseTo("_".concat(Random.nextHexRandom16()))
+ .subjectNameIdFormat("afaf")
+ .levelOfAssurance(EaafConstants.EIDAS_LOA_HIGH)
+ .attributes(attributeMap)
+ .build();
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java
index 3fa66aa8..4148b138 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveEidasResponseTaskTest.java
@@ -14,7 +14,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
@@ -29,8 +28,7 @@ import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigM
import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummySpConfiguration;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseAlternativeTask;
import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.IRequestStorage;
import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
@@ -50,7 +48,6 @@ import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
import lombok.val;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
@@ -58,21 +55,21 @@ import lombok.val;
public class ReceiveEidasResponseTaskTest {
@Autowired(required = true)
- private ReceiveAuthnResponseTask task;
+ private ReceiveAuthnResponseAlternativeTask task;
@Autowired(required = true)
private MsConnectorDummyConfigMap basicConfig;
@Autowired
protected EidasAttributeRegistry attrRegistry;
-
+
@Autowired private IRequestStorage storage;
-
+
final ExecutionContext executionContext = new ExecutionContextImpl();
private MockHttpServletRequest httpReq;
private MockHttpServletResponse httpResp;
private TestRequestImpl pendingReq;
private MsConnectorDummySpConfiguration oaParam;
-
+
/**
* jUnit test set-up.
*/
@@ -84,7 +81,6 @@ public class ReceiveEidasResponseTaskTest {
RequestContextHolder.resetRequestAttributes();
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
- basicConfig.putConfigValue("eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution", "false");
basicConfig.putConfigValue("eidas.ms.auth.eIDAS.eid.testidentity.default", "false");
final Map<String, String> spConfig = new HashMap<>();
@@ -100,54 +96,53 @@ public class ReceiveEidasResponseTaskTest {
pendingReq.setAuthUrl("http://test.com/");
pendingReq.setTransactionId("avaasbav");
pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
-
+
executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
executionContext.put(EaafConstants.PROCESS_ENGINE_REQUIRES_NO_POSTAUTH_REDIRECT, true);
}
-
+
@Test
- public void missingEidasResponse() {
+ public void missingEidasResponse() {
try {
task.execute(pendingReq, executionContext);
Assert.fail("No eIDAS response not detected");
-
+
} catch (TaskExecutionException e) {
- Assert.assertEquals("ErrorId", "eidas.01",
+ Assert.assertEquals("ErrorId", "eidas.01",
((EaafException) e.getOriginalException()).getErrorId());
-
- }
+
+ }
}
-
+
@Test
- public void notSuccessEidasResponse() throws URISyntaxException {
+ public void notSuccessEidasResponse() throws URISyntaxException {
String statusCode = RandomStringUtils.randomAlphabetic(10);
- httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE,
+ httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE,
buildDummyAuthResponse(statusCode));
-
-
+
+
try {
task.execute(pendingReq, executionContext);
Assert.fail("No eIDAS response not detected");
-
+
} catch (TaskExecutionException e) {
- Assert.assertEquals("ErrorId", "eidas.02",
+ Assert.assertEquals("ErrorId", "eidas.02",
((EaafException) e.getOriginalException()).getErrorId());
Assert.assertEquals("wrong parameter size", 2, ((EaafException) e.getOriginalException())
.getParams().length);
Assert.assertEquals("wrong errorMsg", statusCode, ((EaafException) e
.getOriginalException()).getParams()[0]);
- }
+ }
}
-
+
@Test
public void successAndForward() throws URISyntaxException, TaskExecutionException,
PendingReqIdValidationException, EaafStorageException {
AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
- executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
String alternativReturnEndpoint = "http://ms-connector.alternative/" + RandomStringUtils.randomAlphabetic(10);
pendingReq.setRawDataToTransaction(
@@ -174,25 +169,24 @@ public class ReceiveEidasResponseTaskTest {
}
- @Test
- public void success() throws URISyntaxException, TaskExecutionException, PendingReqIdValidationException {
+ public void success() throws URISyntaxException, TaskExecutionException, PendingReqIdValidationException {
@Nonnull
AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
-
+
//execute test
task.execute(pendingReq, executionContext);
-
+
//validate state
IRequest storedReq = storage.getPendingRequest(pendingReq.getPendingRequestId());
Assert.assertNotNull("pendingReq not stored", storedReq);
-
final EidAuthProcessDataWrapper authProcessData = storedReq.getSessionData(EidAuthProcessDataWrapper.class);
Assert.assertEquals("LoA", eidasResponse.getLevelOfAssurance(), authProcessData.getQaaLevel());
- Assert.assertNotNull("eIDAS response",
+ Assert.assertNotNull("eIDAS response",
authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
- Assert.assertEquals("eIDAS response", eidasResponse,
+ Assert.assertEquals("eIDAS response", eidasResponse,
authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+
Assert.assertFalse("testIdentity flag", authProcessData.isTestIdentity());
Assert.assertEquals("msConnectorStage", false,
@@ -206,7 +200,6 @@ public class ReceiveEidasResponseTaskTest {
@Nonnull
AuthenticationResponse eidasResponse = buildDummyAuthResponse(Constants.SUCCESS_URI);
httpReq.setAttribute(Constants.DATA_FULL_EIDAS_RESPONSE, eidasResponse);
- executionContext.put(MsEidasNodeConstants.REQ_PARAM_SELECTED_COUNTRY, "LU");
//execute test
task.execute(pendingReq, executionContext);
@@ -218,9 +211,9 @@ public class ReceiveEidasResponseTaskTest {
final EidAuthProcessDataWrapper authProcessData = storedReq.getSessionData(EidAuthProcessDataWrapper.class);
Assert.assertEquals("LoA", eidasResponse.getLevelOfAssurance(), authProcessData.getQaaLevel());
Assert.assertNotNull("eIDAS response",
- authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE));
Assert.assertEquals("eIDAS response", eidasResponse,
- authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE));
+ authProcessData.getGenericDataFromSession(Constants.DATA_FULL_EIDAS_RESPONSE_ALTERNATIVE));
Assert.assertTrue("testIdentity flag", authProcessData.isTestIdentity());
}
@@ -237,7 +230,7 @@ public class ReceiveEidasResponseTaskTest {
Constants.eIDAS_ATTR_CURRENTGIVENNAME).first();
final AttributeDefinition attributeDef4 = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_DATEOFBIRTH).first();
-
+
final ImmutableAttributeMap attributeMap = ImmutableAttributeMap.builder()
.put(attributeDef, "LU/AT/" + RandomStringUtils.randomNumeric(64))
.put(attributeDef2, RandomStringUtils.randomAlphabetic(10))
@@ -254,5 +247,5 @@ public class ReceiveEidasResponseTaskTest {
.attributes(attributeMap)
.build();
}
-
+
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveMobilePhoneSignatureResponseTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveMobilePhoneSignatureResponseTaskTest.java
new file mode 100644
index 00000000..034f06d1
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveMobilePhoneSignatureResponseTaskTest.java
@@ -0,0 +1,502 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThrows;
+import static org.springframework.util.Assert.isInstanceOf;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+
+import javax.xml.transform.TransformerException;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.saml2.core.Issuer;
+import org.opensaml.saml.saml2.core.Response;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.google.common.collect.Lists;
+
+import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummyConfigMap;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.RegisterResult;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.ManualFixNecessaryException;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.IdAustriaClientAuthConstants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthMetadataProvider;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterOperationStatus;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.RegisterSearchService.RegisterStatusResults;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveMobilePhoneSignatureResponseTask;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummyOA;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummyPendingRequest;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
+import at.gv.egiz.eaaf.core.api.data.EaafConstants;
+import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
+import at.gv.egiz.eaaf.core.exceptions.EaafException;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.auth.data.AuthProcessDataWrapper;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+import at.gv.egiz.eaaf.core.impl.utils.DomUtils;
+import at.gv.egiz.eaaf.modules.pvp2.exception.Pvp2MetadataException;
+import at.gv.egiz.eaaf.modules.pvp2.impl.metadata.PvpMetadataResolverFactory;
+import at.gv.egiz.eaaf.modules.pvp2.impl.opensaml.initialize.EaafOpenSaml3xInitializer;
+import at.gv.egiz.eaaf.modules.pvp2.impl.utils.Saml2Utils;
+import at.gv.egiz.eaaf.modules.pvp2.sp.exception.AuthnResponseValidationException;
+import net.shibboleth.utilities.java.support.xml.ParserPool;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+public class ReceiveMobilePhoneSignatureResponseTaskTest {
+
+ private static final String METADATA_PATH = "classpath:/data/idp_metadata_classpath_entity.xml";
+ private static final String BPK_FROM_ID_AUSTRIA = "QVGm48cqcM4UcyhDTNGYmVdrIoY=";
+
+ @Autowired
+ protected MsConnectorDummyConfigMap authConfig;
+ @Autowired
+ private IdAustriaClientAuthMetadataProvider metadataProvider;
+ @Autowired
+ private IdAustriaClientAuthCredentialProvider credentialProvider;
+ @Autowired
+ private PvpMetadataResolverFactory metadataFactory;
+ @Autowired
+ private ReceiveMobilePhoneSignatureResponseTask task;
+ @MockBean
+ private RegisterSearchService registerSearchService;
+
+ private final ExecutionContext executionContext = new ExecutionContextImpl();
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+ private DummyPendingRequest pendingReq;
+
+ /**
+ * JUnit class initializer.
+ *
+ * @throws Exception In case of an OpenSAML3 initialization error
+ */
+ @BeforeClass
+ public static void initialize() throws Exception {
+ EaafOpenSaml3xInitializer.eaafInitialize();
+ }
+
+ /**
+ * jUnit test set-up.
+ *
+ * @throws Exception In case of an set-up error
+ */
+ @Before
+ public void setUp() throws Exception {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ httpReq.setScheme("https");
+ httpReq.setServerPort(443);
+ httpReq.setContextPath("/authhandler");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ authConfig.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID, METADATA_PATH);
+
+ DummyOA oaParam = new DummyOA();
+ oaParam.setUniqueAppId("http://test.com/test");
+ oaParam.setTargetIdentifier(EaafConstants.URN_PREFIX_CDID + RandomStringUtils.randomAlphabetic(2));
+
+ pendingReq = new DummyPendingRequest();
+ pendingReq.initialize(httpReq, authConfig);
+ pendingReq.setPendingRequestId(RandomStringUtils.randomAlphanumeric(10));
+ pendingReq.setOnlineApplicationConfiguration(oaParam);
+
+ metadataProvider.fullyDestroy();
+ }
+
+ @Test
+ public void unsupportedHttpMethod() {
+ httpReq = new MockHttpServletRequest("PUT", "https://localhost/authhandler");
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.03", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpGetNoMessage() {
+ httpReq = new MockHttpServletRequest("GET", "https://localhost/authhandler");
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+
+ }
+
+ @Test
+ public void httpPostNoMessage() {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/authhandler");
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostMessageNotSigned() throws IOException {
+ byte[] bytes = IOUtils.toByteArray(ReceiveMobilePhoneSignatureResponseTask.class
+ .getResourceAsStream("/data/Response_without_sig_classpath_entityid.xml"));
+ httpReq.addParameter("SAMLResponse", Base64.getEncoder().encodeToString(bytes));
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+
+ }
+
+ @Test
+ public void httpPostMessageWrongDestinationEndpoint() throws Exception {
+ initResponse("/data/Response_with_wrong_destination_endpoint.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+
+ }
+
+ @Test
+ public void httpPostValidSignedNoMetadata() throws Exception {
+ initResponse("/data/Response_without_sig_classpath_entityid.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.11", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionOutDated() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_classpath_entityid.xml", false);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionFromWrongIdp() throws Exception {
+ authConfig.putConfigValue(IdAustriaClientAuthConstants.CONFIG_PROPS_ID_AUSTRIA_ENTITYID,
+ "http://wrong.idp/" + RandomStringUtils.randomAlphabetic(5));
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_classpath_entityid.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.08", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionMissingAttributes() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_classpath_entityid.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.12", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedWithError() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_with_error.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.05", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedWitUserStopErrorCode() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_with_error_userstop.xml", true);
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Transition To S16", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.23", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ @Test
+ public void httpPostValidSignedWithErrorAndNoSubCode() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_with_error_without_subcode.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.05", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedWithErrorAndEmptySubCode() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_without_sig_with_error_empty_subcode.xml", true);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ assertEquals("sp.pvp2.05", ((EaafException) e.getOriginalException()).getErrorId());
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionEidValidButNameMismatch() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_with_EID.xml", true);
+ AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ SimpleEidasData eidData = createEidasDataMatchingToSamlResponse()
+ .familyName("notmatching")
+ .build();
+ authProcessData.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidData);
+
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Next task", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("matching failed flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ assertEquals("failed reason", "module.eidasauth.matching.24", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED_REASON));
+ assertNull("no final matching result", MatchingTaskUtils.getFinalMatchingResult(pendingReq));
+
+ }
+
+ //TODO: implement new test that this test makes no sense any more
+ @Ignore
+ @Test
+ public void httpPostValidSignedAssertionEidValid_NoRegisterResult() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_with_EID.xml", true);
+ AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ SimpleEidasData eidData = createEidasDataMatchingToSamlResponse().build();
+ authProcessData.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidData);
+ RegisterStatusResults registerSearchResult = new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.emptyList(), Collections.emptyList());
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ task.execute(pendingReq, executionContext);
+
+ AuthProcessDataWrapper session = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ assertEquals("LoA", "http://eidas.europa.eu/LoA/low", session.getQaaLevel());
+ assertEquals("IssueInstant", "2014-03-05T06:39:51Z", session.getIssueInstantString());
+ assertEquals("Transition To S16", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionEidValid_ExactlyOneRegisterResult() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_with_EID.xml", true);
+ AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ SimpleEidasData eidData = createEidasDataMatchingToSamlResponse().build();
+ authProcessData.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidData);
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ task.execute(pendingReq, executionContext);
+
+ AuthProcessDataWrapper session = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ assertEquals("LoA", "http://eidas.europa.eu/LoA/low", session.getQaaLevel());
+ assertEquals("IssueInstant", "2014-03-05T06:39:51Z", session.getIssueInstantString());
+ assertNull("Transition To S16", executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+
+ //TODO: update this check because this task selects one result from MDS search result before and creates a new element
+ //Mockito.verify(registerSearchService).step7aKittProcess(eq(registerSearchResult), eq(eidData));
+ }
+
+ @Test
+ public void httpPostValidSignedAssertionEidValid_ExactlyOneRegisterResultDeprecadedBpkEnc() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_with_EID_deprecated_bpk_encoding.xml", true);
+ AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ SimpleEidasData eidData = createEidasDataMatchingToSamlResponse().build();
+ authProcessData.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidData);
+ RegisterStatusResults registerSearchResult = buildResultWithOneMatch();
+ MatchingTaskUtils.storeIntermediateMatchingResult(pendingReq, registerSearchResult);
+
+ task.execute(pendingReq, executionContext);
+
+ AuthProcessDataWrapper session = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ assertEquals("LoA", "http://eidas.europa.eu/LoA/low", session.getQaaLevel());
+ assertEquals("IssueInstant", "2014-03-05T06:39:51Z", session.getIssueInstantString());
+ assertNull("Transition To S16", executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+
+ //TODO: update this check because this task selects one result from MDS search result before and creates a new element
+ //Mockito.verify(registerSearchService).step7aKittProcess(eq(registerSearchResult), eq(eidData));
+ }
+
+
+
+ //TODO: implement new test that this test makes no sense any more
+ @Ignore
+ @Test
+ public void httpPostValidSignedAssertionEidValid_MoreThanOneRegisterResult() throws Exception {
+ setupMetadataResolver();
+ initResponse("/data/Response_with_EID.xml", true);
+ AuthProcessDataWrapper authProcessData = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ SimpleEidasData eidData = createEidasDataMatchingToSamlResponse().build();
+ authProcessData.setGenericDataToSession(Constants.DATA_SIMPLE_EIDAS, eidData);
+
+ TaskExecutionException e = assertThrows(TaskExecutionException.class,
+ () -> task.execute(pendingReq, executionContext));
+
+
+ assertEquals(pendingReq.getPendingRequestId(), e.getPendingRequestID());
+ isInstanceOf(AuthnResponseValidationException.class, e.getOriginalException());
+ isInstanceOf(ManualFixNecessaryException.class, e.getOriginalException().getCause());
+ assertEquals("sp.pvp2.12", ((AuthnResponseValidationException) e.getOriginalException()).getErrorId());
+
+
+ AuthProcessDataWrapper session = pendingReq.getSessionData(AuthProcessDataWrapper.class);
+ assertNull("Transition To S16", executionContext.get(Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK));
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithOneMatch() {
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ Collections.singletonList(RegisterResult.builder()
+ .bpk(BPK_FROM_ID_AUSTRIA)
+ .pseudonym(Arrays.asList("bar"))
+ .givenName("foo")
+ .familyName("foo")
+ .dateOfBirth("bar")
+ .build()),
+ Collections.emptyList());
+
+ }
+
+ @NotNull
+ private RegisterStatusResults buildResultWithTwoMatches() {
+ List<RegisterResult> results = Lists.newArrayList(
+ RegisterResult.builder()
+ .bpk(BPK_FROM_ID_AUSTRIA)
+ .pseudonym(Arrays.asList("bar"))
+ .givenName("foo")
+ .familyName("foo")
+ .dateOfBirth("bar")
+ .build(),
+ RegisterResult.builder()
+ .bpk("bpk")
+ .pseudonym(Arrays.asList("pseudonym"))
+ .givenName("givenName")
+ .familyName("familyName")
+ .dateOfBirth("dateOfBirth")
+ .build());
+
+ return new RegisterStatusResults(new RegisterOperationStatus(generateRandomProcessId()),
+ results, Collections.emptyList());
+ }
+
+ private BigInteger generateRandomProcessId() {
+ return new BigInteger(RandomStringUtils.randomNumeric(10));
+
+ }
+
+ private SimpleEidasData.SimpleEidasDataBuilder createEidasDataMatchingToSamlResponse() {
+ // data from "/data/Response_with_EID.xml"
+ return SimpleEidasData.builder()
+ .familyName("Mustermann")
+ .givenName("Max")
+ .dateOfBirth("1940-01-01");
+ }
+
+ private void addSamlResponseToHttpReq(Response response) throws TransformerException, IOException, MarshallingException {
+ String node = DomUtils.serializeNode(XMLObjectSupport.getMarshaller(response).marshall(response));
+ String base64encoded = Base64.getEncoder().encodeToString(node.getBytes(StandardCharsets.UTF_8));
+ httpReq.addParameter("SAMLResponse", base64encoded);
+ }
+
+ private void initResponse(String responsePath, boolean validConditions) throws Exception {
+ InputStream inputStream = ReceiveMobilePhoneSignatureResponseTaskTest.class.getResourceAsStream(responsePath);
+ ParserPool parserPool = Objects.requireNonNull(XMLObjectProviderRegistrySupport.getParserPool());
+ Response response = (Response) XMLObjectSupport.unmarshallFromInputStream(parserPool, inputStream);
+ response.setIssueInstant(Instant.now());
+ Issuer issuer = Saml2Utils.createSamlObject(Issuer.class);
+ issuer.setValue("classpath:/data/idp_metadata_classpath_entity.xml");
+ response.setIssuer(issuer);
+ if (validConditions) {
+ response.getAssertions().get(0).getConditions().setNotOnOrAfter(Instant.now().plusSeconds(5*60));
+ }
+ Response signedResponse = Saml2Utils.signSamlObject(response, credentialProvider.getMessageSigningCredential(), true);
+ addSamlResponseToHttpReq(signedResponse);
+ }
+
+ private void setupMetadataResolver() throws Pvp2MetadataException {
+ metadataProvider.addMetadataResolverIntoChain(metadataFactory.createMetadataProvider(
+ METADATA_PATH, null, "jUnit IDP", null));
+ }
+
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveOtherLoginMethodGuiResponseTaskTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveOtherLoginMethodGuiResponseTaskTest.java
new file mode 100644
index 00000000..750a17ce
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/ReceiveOtherLoginMethodGuiResponseTaskTest.java
@@ -0,0 +1,154 @@
+package at.asitplus.eidas.specific.modules.auth.eidas.v2.test.tasks;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.i18n.LocaleContextHolder;
+import org.springframework.mock.web.MockHttpServletRequest;
+import org.springframework.mock.web.MockHttpServletResponse;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SelectedLoginMethod;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveOtherLoginMethodGuiResponseTask;
+import at.gv.egiz.eaaf.core.exceptions.TaskExecutionException;
+import at.gv.egiz.eaaf.core.impl.idp.module.test.TestRequestImpl;
+import at.gv.egiz.eaaf.core.impl.idp.process.ExecutionContextImpl;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration(locations = {
+ "/SpringTest-context_tasks_test.xml",
+ "/SpringTest-context_basic_mapConfig.xml"
+})
+@ActiveProfiles(profiles = {"deprecatedConfig"})
+@WebAppConfiguration
+public class ReceiveOtherLoginMethodGuiResponseTaskTest {
+
+ @Autowired
+ private ReceiveOtherLoginMethodGuiResponseTask task;
+
+ private final ExecutionContextImpl executionContext = new ExecutionContextImpl();
+ private TestRequestImpl pendingReq;
+ private MockHttpServletRequest httpReq;
+ private MockHttpServletResponse httpResp;
+
+ /**
+ * jUnit class initializer.
+ */
+ @BeforeClass
+ public static void classInitializer() {
+ final String current = new java.io.File(".").toURI().toString();
+ System.setProperty("eidas.ms.configuration", current + "src/test/resources/config/junit_config_1.properties");
+ }
+
+ /**
+ * jUnit test set-up.
+ */
+ @Before
+ public void initialize() {
+ httpReq = new MockHttpServletRequest("POST", "https://localhost/ms_connector");
+ httpResp = new MockHttpServletResponse();
+ RequestContextHolder.resetRequestAttributes();
+ RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(httpReq, httpResp));
+
+ pendingReq = new TestRequestImpl();
+ pendingReq.setAuthUrl("https://localhost/ms_connector");
+ pendingReq.setPendingReqId(RandomStringUtils.randomAlphanumeric(10));
+
+ LocaleContextHolder.resetLocaleContext();
+ }
+
+ @Test
+ public void withMobileSignatureSelection() throws TaskExecutionException {
+ testTransition(SelectedLoginMethod.MOBILE_PHONE_SIGNATURE_LOGIN, Constants.TRANSITION_TO_GENERATE_MOBILE_PHONE_SIGNATURE_REQUEST_TASK);
+ assertEquals("return to selection", false, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+ }
+
+ @Test
+ public void withEidasSelection() throws TaskExecutionException {
+ testTransition(SelectedLoginMethod.EIDAS_LOGIN, Constants.TRANSITION_TO_GENERATE_EIDAS_LOGIN);
+ assertEquals("return to selection", false, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+ }
+
+ @Test
+ public void withNoOtherLoginSelection() throws TaskExecutionException {
+ testTransition(SelectedLoginMethod.NO_OTHER_LOGIN, Constants.TRANSITION_TO_GENERATE_GUI_QUERY_AUSTRIAN_RESIDENCE_TASK);
+ assertEquals("return to selection", false, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+ }
+
+ @Test
+ public void withAddMeAsNewSelection() throws TaskExecutionException {
+ testTransition(SelectedLoginMethod.ADD_ME_AS_NEW, Constants.TRANSITION_TO_CREATE_NEW_ERNP_ENTRY_TASK);
+ assertEquals("return to selection", false, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+
+ }
+
+ public void testTransition(SelectedLoginMethod loginMethod, String expectedTransition) throws TaskExecutionException {
+ httpReq.setParameter(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER, loginMethod.name());
+ executionContext.put(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED, true);
+
+ task.execute(pendingReq, executionContext);
+
+ assertFalse("wrong pendingReq auth flag", pendingReq.isAuthenticated());
+ assertFalse("wrong process-cancelled flag", executionContext.isProcessCancelled());
+ assertNotNull("no login-selection found", executionContext.get(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER));
+ assertEquals("Wrong login-selection found", loginMethod.name(), executionContext.get(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER));
+ assertEquals("Next task", true, executionContext.get(expectedTransition));
+ assertNull("find advancedMatchingError flag", executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+
+ }
+
+ public void withInvalidSelection() throws TaskExecutionException {
+ httpReq.setParameter(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER, RandomStringUtils.randomAlphabetic(2));
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Next task", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("advancedMatchingError flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ }
+
+ @Test
+ public void withNullSelection() throws TaskExecutionException {
+ httpReq.setParameter(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER, "null");
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Next task", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("advancedMatchingError flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ }
+
+ @Test
+ public void withEmptySelection() throws TaskExecutionException {
+ httpReq.setParameter(Constants.REQ_SELECTED_LOGIN_METHOD_PARAMETER, "");
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Next task", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("advancedMatchingError flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ }
+
+ @Test
+ public void withoutLoginMethodSelection() throws TaskExecutionException {
+
+ task.execute(pendingReq, executionContext);
+
+ assertEquals("Next task", true, executionContext.get(Constants.TRANSITION_TO_GENERATE_OTHER_LOGIN_METHOD_GUI_TASK));
+ assertEquals("advancedMatchingError flag", true, executionContext.get(Constants.CONTEXT_FLAG_ADVANCED_MATCHING_FAILED));
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java
index ad38e371..4da03622 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/utils/JoseUtilsTest.java
@@ -17,13 +17,11 @@ import org.jose4j.lang.JoseException;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.JoseUtils.JwsResult;
import at.gv.egiz.eaaf.core.exceptions.EaafException;
@@ -34,15 +32,14 @@ import at.gv.egiz.eaaf.core.impl.credential.KeyStoreConfiguration.KeyStoreType;
import at.gv.egiz.eaaf.core.impl.data.Pair;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
"/SpringTest-context_basic_mapConfig.xml"})
public class JoseUtilsTest {
-
+
@Autowired private EaafKeyStoreFactory keyStoreFactory;
-
+
private static final List<String> AUTH_ALGORITHM_WHITELIST_SIGNING = Collections.unmodifiableList(
Arrays.asList(
AlgorithmIdentifiers.ECDSA_USING_P256_CURVE_AND_SHA256,
@@ -50,48 +47,48 @@ public class JoseUtilsTest {
AlgorithmIdentifiers.RSA_PSS_USING_SHA256,
AlgorithmIdentifiers.RSA_PSS_USING_SHA512));
-
+
@Test
public void missingKey() throws EaafException, JoseException, KeyStoreException, IOException {
-
+
KeyStoreConfiguration config = new KeyStoreConfiguration();
config.setFriendlyName("jUnittest");
config.setKeyStoreType(KeyStoreType.JKS);
config.setSoftKeyStoreFilePath("../data/junit.jks");
config.setSoftKeyStorePassword("password");
-
+
Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config);
String payLoad = RandomStringUtils.randomAlphanumeric(100);
-
+
//check signing
try {
JoseUtils.createSignature(keyStore, "notExist", "password".toCharArray(), payLoad , true, "jUnitTest");
Assert.fail("missing Key not detected");
-
- } catch (EaafException e) {
+
+ } catch (EaafException e) {
Assert.assertEquals("ErrorId", "internal.keystore.09", e.getErrorId());
-
+
}
}
-
+
@Test
public void createRsaSignature() throws EaafException, JoseException, KeyStoreException, IOException {
-
+
KeyStoreConfiguration config = new KeyStoreConfiguration();
config.setFriendlyName("jUnittest");
config.setKeyStoreType(KeyStoreType.JKS);
config.setSoftKeyStoreFilePath("../data/junit.jks");
config.setSoftKeyStorePassword("password");
-
+
Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config);
String payLoad = RandomStringUtils.randomAlphanumeric(100);
-
+
//check signing
String result = JoseUtils.createSignature(keyStore, "meta", "password".toCharArray(), payLoad , true, "jUnitTest");
-
+
Assert.assertNotNull("signed message", result);
Assert.assertFalse("signed msg empty", result.isEmpty());
-
+
//validate
List<X509Certificate> trustedCerts = EaafKeyStoreUtils.readCertsFromKeyStore(keyStore.getFirst());
@@ -99,30 +96,30 @@ public class JoseUtilsTest {
AUTH_ALGORITHM_WHITELIST_SIGNING
.toArray(new String[AUTH_ALGORITHM_WHITELIST_SIGNING.size()]));
JwsResult verify = JoseUtils.validateSignature(result, trustedCerts, constraints);
-
+
Assert.assertTrue("sig. verify", verify.isValid());
Assert.assertEquals("payload", payLoad, verify.getPayLoad());
-
+
}
-
+
@Test
public void createEccSignature() throws EaafException, JoseException, KeyStoreException, IOException {
-
+
KeyStoreConfiguration config = new KeyStoreConfiguration();
config.setFriendlyName("jUnittest");
config.setKeyStoreType(KeyStoreType.JKS);
config.setSoftKeyStoreFilePath("../data/junit.jks");
config.setSoftKeyStorePassword("password");
-
+
Pair<KeyStore, Provider> keyStore = keyStoreFactory.buildNewKeyStore(config);
String payLoad = RandomStringUtils.randomAlphanumeric(100);
-
+
//check signing
String result = JoseUtils.createSignature(keyStore, "sig", "password".toCharArray(), payLoad , true, "jUnitTest");
-
+
Assert.assertNotNull("signed message", result);
Assert.assertFalse("signed msg empty", result.isEmpty());
-
+
//validate
List<X509Certificate> trustedCerts = EaafKeyStoreUtils.readCertsFromKeyStore(keyStore.getFirst());
@@ -130,10 +127,10 @@ public class JoseUtilsTest {
AUTH_ALGORITHM_WHITELIST_SIGNING
.toArray(new String[AUTH_ALGORITHM_WHITELIST_SIGNING.size()]));
JwsResult verify = JoseUtils.validateSignature(result, trustedCerts, constraints);
-
+
Assert.assertTrue("sig. verify", verify.isValid());
Assert.assertEquals("payload", payLoad, verify.getPayLoad());
-
+
}
-
+
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java
index 9bb51cd9..0a4ab851 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasAttributePostProcessingTest.java
@@ -30,7 +30,7 @@ import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
-import org.joda.time.DateTime;
+import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.SimpleEidasData;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -41,7 +41,6 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.dao.ErnbEidData;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.CcSpecificEidProcessingService;
@RunWith(SpringJUnit4ClassRunner.class)
@@ -59,7 +58,7 @@ public class EidasAttributePostProcessingTest {
"DE/AT/532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25";
private static final String P1_GIVENNAME = "Max";
private static final String P1_FAMILYNAME = "Mustermann";
- private static final DateTime P1_DATEOFBIRTH = DateTime.now();
+ private static final String P1_DATEOFBIRTH = "2020-01-04";
private static final String P1_PLACEOFBIRTH = "Nirgendwo";
private static final String P1_BIRTHNAME = "Musterkind";
@@ -68,7 +67,7 @@ public class EidasAttributePostProcessingTest {
"DE/AT/532eaabd9574880dbf76b9b8cc00832c20A6ec113d682299550d7a6e0f345e25";
private static final String P3_GIVENNAME = "Max";
private static final String P3_FAMILYNAME = "Mustermann";
- private static final DateTime P3_DATEOFBIRTH = DateTime.now();
+ private static final String P3_DATEOFBIRTH = "2020-01-03";
private static final String P3_PLACEOFBIRTH = "Nirgendwo";
private static final String P3_BIRTHNAME = "Musterkind";
@@ -77,7 +76,7 @@ public class EidasAttributePostProcessingTest {
"DE/AT/532EAABD9574880DBF76B9B8CC00832C20A6EC113D682299550D7A6E0F345E25";
private static final String P4_GIVENNAME = "Max";
private static final String P4_FAMILYNAME = "Mustermann";
- private static final DateTime P4_DATEOFBIRTH = DateTime.now();
+ private static final String P4_DATEOFBIRTH = "2020-01-05";
private static final String P4_PLACEOFBIRTH = "Nirgendwo";
private static final String P4_BIRTHNAME = "Musterkind";
@@ -86,7 +85,7 @@ public class EidasAttributePostProcessingTest {
"DE/AT/532EAABD9574880DBF76B9B8CC00832C20A6EC113D682299550D7A6E0F345E251";
private static final String P5_GIVENNAME = "Max";
private static final String P5_FAMILYNAME = "Mustermann";
- private static final DateTime P5_DATEOFBIRTH = DateTime.now();
+ private static final String P5_DATEOFBIRTH = "2020-01-06";
private static final String P5_PLACEOFBIRTH = "Nirgendwo";
private static final String P5_BIRTHNAME = "Musterkind";
@@ -94,7 +93,7 @@ public class EidasAttributePostProcessingTest {
private static final String P6_eIDASID = "DE/AT/532EAABD9574880DBF76B9B8CC00832C20A6EC113D682299550D7A6E0F";
private static final String P6_GIVENNAME = "Max";
private static final String P6_FAMILYNAME = "Mustermann";
- private static final DateTime P6_DATEOFBIRTH = DateTime.now();
+ private static final String P6_DATEOFBIRTH = "2020-01-08";
private static final String P6_PLACEOFBIRTH = "Nirgendwo";
private static final String P6_BIRTHNAME = "Musterkind";
@@ -102,7 +101,7 @@ public class EidasAttributePostProcessingTest {
private static final String P7_eIDASID = "DE/AT/532EAABD9574880DBF76B9B8CC00832C20A6EC113D682299550D7A6E0F";
private static final String P7_GIVENNAME = "Max";
private static final String P7_FAMILYNAME = "Mustermann";
- private static final DateTime P7_DATEOFBIRTH = DateTime.now();
+ private static final String P7_DATEOFBIRTH = "2020-01-09";
private static final String P7_PLACEOFBIRTH = "Nirgendwo";
private static final String P7_BIRTHNAME = "Musterkind";
@@ -110,13 +109,13 @@ public class EidasAttributePostProcessingTest {
"EE/AT/asfasfasdfasdfasdfasdfasdfasvafasdfasdfasdfasdfasdfasvascasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasd";
private static final String P2_GIVENNAME = "Max";
private static final String P2_FAMILYNAME = "Mustermann";
- private static final DateTime P2_DATEOFBIRTH = DateTime.now();
+ private static final String P2_DATEOFBIRTH = "2020-01-10";
private static final String P2_PLACEOFBIRTH = "Nirgendwo";
private static final String P2_BIRTHNAME = "Musterkind";
/**
* jUnit class initializer.
- *
+ *
* @throws IOException In case of an error
*/
@BeforeClass
@@ -129,7 +128,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void deWithHexLowerCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P1_eIDASID,
P1_FAMILYNAME,
@@ -156,7 +155,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void deWithHexMixedCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P3_eIDASID,
P3_FAMILYNAME,
@@ -183,7 +182,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void deWithHexUpperCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P4_eIDASID,
P4_FAMILYNAME,
@@ -270,7 +269,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void eeTestCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P2_eIDASID,
P2_FAMILYNAME,
@@ -297,7 +296,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void eeTestFamilyNameMissingCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P2_eIDASID,
null,
@@ -326,7 +325,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void eeTestGivenNameMissingCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P2_eIDASID,
P2_FAMILYNAME,
@@ -355,7 +354,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void eeTestDateOfBirthMissingCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
P2_eIDASID,
P2_FAMILYNAME,
@@ -384,7 +383,7 @@ public class EidasAttributePostProcessingTest {
@Test
public void eeTestIdMissingCase() throws Exception {
try {
- final ErnbEidData result = postProcessor.postProcess(
+ final SimpleEidasData result = postProcessor.postProcess(
generateInputData(
null,
P2_FAMILYNAME,
@@ -411,7 +410,7 @@ public class EidasAttributePostProcessingTest {
}
private Map<String, Object> generateInputData(String id, String familyName, String givenName,
- DateTime dateOfBirth, String placeOfBirth, String birthName) {
+ String dateOfBirth, String placeOfBirth, String birthName) {
final Map<String, Object> result = new HashMap<>();
result.put(Constants.eIDAS_ATTR_PERSONALIDENTIFIER, id);
result.put(Constants.eIDAS_ATTR_CURRENTGIVENNAME, givenName);
@@ -423,8 +422,8 @@ public class EidasAttributePostProcessingTest {
}
- private void validate(ErnbEidData result, String id, String familyName, String givenName,
- DateTime dateOfBirth, String placeOfBirth, String birthName) {
+ private void validate(SimpleEidasData result, String id, String familyName, String givenName,
+ String dateOfBirth, String placeOfBirth, String birthName) {
if (!result.getPseudonym().equals(id)) {
fail(result.getPseudonym() + "is not equal to " + id);
}
@@ -441,12 +440,6 @@ public class EidasAttributePostProcessingTest {
fail(result.getDateOfBirth() + "is not equal to " + dateOfBirth);
}
- if (!result.getFormatedDateOfBirth().equals(new SimpleDateFormat("yyyy-MM-dd").format(dateOfBirth
- .toDate()))) {
- fail(result.getDateOfBirth() + "is not equal to " + new SimpleDateFormat("yyyy-MM-dd").format(
- dateOfBirth.toDate()));
- }
-
if (!result.getPlaceOfBirth().equals(placeOfBirth)) {
fail(result.getPlaceOfBirth() + "is not equal to " + placeOfBirth);
}
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java
index 7ac41500..84da2344 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingFirstTest.java
@@ -54,8 +54,11 @@ import eu.eidas.auth.commons.light.impl.LightRequest.Builder;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
- "/SpringTest-context_basic_realConfig.xml"})
-@TestPropertySource(locations = {"classpath:/config/junit_config_de_attributes.properties"})
+ "/SpringTest-context_basic_realConfig.xml",
+ //"/SpringTest-context_basic_mapConfig.xml"
+ })
+@TestPropertySource(locations = {"classpath:/config/junit_config_de_attributes.properties", "classpath:/config" +
+ "/junit_config_1_springboot.properties"})
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class EidasRequestPreProcessingFirstTest {
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java
index 9ee38296..9b061b55 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasRequestPreProcessingSecondTest.java
@@ -103,7 +103,7 @@ public class EidasRequestPreProcessingSecondTest {
final LightRequest lightReq = authnRequestBuilder.build();
- Assert.assertEquals("ProviderName is not Static", "myNode", lightReq.getProviderName());
+ Assert.assertEquals("ProviderName is not Static", "myNode", lightReq.getProviderName());//Fixme "myNode"
Assert.assertEquals("no PublicSP", "public", lightReq.getSpType());
Assert.assertEquals("Requested attribute size not match", 8, lightReq.getRequestedAttributes().size());
diff --git a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java
index b1f1b164..bbba56e2 100644
--- a/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java
+++ b/modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/validation/EidasResponseValidatorTest.java
@@ -12,7 +12,6 @@ import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
@@ -25,7 +24,6 @@ import at.asitplus.eidas.specific.core.test.config.dummy.MsConnectorDummySpConfi
import at.asitplus.eidas.specific.modules.auth.eidas.v2.Constants;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.exception.EidasValidationException;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry;
-import at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask;
import at.asitplus.eidas.specific.modules.auth.eidas.v2.validator.EidasResponseValidator;
import at.gv.egiz.eaaf.core.api.data.EaafConfigConstants;
import at.gv.egiz.eaaf.core.api.data.EaafConstants;
@@ -41,7 +39,6 @@ import eu.eidas.auth.commons.protocol.impl.AuthenticationResponse;
import lombok.val;
@RunWith(SpringJUnit4ClassRunner.class)
-@PrepareForTest(CreateIdentityLinkTask.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
@ContextConfiguration(locations = {
"/SpringTest-context_tasks_test.xml",
@@ -50,17 +47,17 @@ public class EidasResponseValidatorTest {
@Autowired private MsConnectorDummyConfigMap basicConfig;
@Autowired protected EidasAttributeRegistry attrRegistry;
-
+
private TestRequestImpl pendingReq;
private MsConnectorDummySpConfiguration oaParam;
-
-
+
+
/**
* jUnit test set-up.
*/
@Before
public void setUp() throws EaafStorageException, URISyntaxException {
-
+
final Map<String, String> spConfig = new HashMap<>();
spConfig.put(EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER, "testSp");
spConfig.put("target", "urn:publicid:gv.at:cdid+XX");
@@ -74,250 +71,250 @@ public class EidasResponseValidatorTest {
pendingReq.setAuthUrl("http://test.com/");
pendingReq.setTransactionId("avaasbav");
pendingReq.setPiiTransactionId(RandomStringUtils.randomAlphanumeric(10));
-
+
}
-
-
+
+
@Test
public void loaFromResponseToLow() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- "LU/AT/" + RandomStringUtils.randomNumeric(10),
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ "LU/AT/" + RandomStringUtils.randomNumeric(10),
EaafConstants.EIDAS_LOA_LOW,
false);
String spCountry = "AT";
String citizenCountryCode = "XX";
-
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.06", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.06", e.getErrorId());
Assert.assertEquals("wrong parameter size", 1, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "http://eidas.europa.eu/LoA/low",
+ Assert.assertEquals("wrong errorMsg", "http://eidas.europa.eu/LoA/low",
e.getParams()[0]);
-
- }
+
+ }
}
-
+
@Test
public void noEidasSpCountry() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- "LU/AT/" + RandomStringUtils.randomNumeric(10),
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ "LU/AT/" + RandomStringUtils.randomNumeric(10),
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
String spCountry = null;
String citizenCountryCode = "LU";
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
Assert.assertEquals("wrong parameter size", 2, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
+ Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
e.getParams()[0]);
- Assert.assertEquals("wrong errorMsg",
- "Destination country does not match to SP country",
+ Assert.assertEquals("wrong errorMsg",
+ "Destination country does not match to SP country",
e.getParams()[1]);
-
- }
+
+ }
}
-
+
@Test
public void noEidasResponseCountry() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- "LU/AT/" + RandomStringUtils.randomNumeric(10),
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ "LU/AT/" + RandomStringUtils.randomNumeric(10),
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
String spCountry = "AT";
String citizenCountryCode = null;
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
Assert.assertEquals("wrong parameter size", 2, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
+ Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
e.getParams()[0]);
- Assert.assertEquals("wrong errorMsg",
- "Citizen country does not match to eIDAS-node country that generates the response",
+ Assert.assertEquals("wrong errorMsg",
+ "Citizen country does not match to eIDAS-node country that generates the response",
e.getParams()[1]);
-
- }
+
+ }
}
-
+
@Test
public void wrongEidasResponseCountry() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- "LU/AT/" + RandomStringUtils.randomNumeric(10),
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ "LU/AT/" + RandomStringUtils.randomNumeric(10),
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
String spCountry = "AT";
String citizenCountryCode = "XX";
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
Assert.assertEquals("wrong parameter size", 2, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
+ Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
e.getParams()[0]);
- Assert.assertEquals("wrong errorMsg",
- "Citizen country does not match to eIDAS-node country that generates the response",
+ Assert.assertEquals("wrong errorMsg",
+ "Citizen country does not match to eIDAS-node country that generates the response",
e.getParams()[1]);
-
- }
+
+ }
}
-
+
@Test
public void missingPersonalIdentifier() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- null,
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ null,
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
String spCountry = "AT";
String citizenCountryCode = "LU";
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());
Assert.assertEquals("wrong parameter size", 1, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",
+ Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",
e.getParams()[0]);
-
- }
+
+ }
}
-
+
@Test
public void moreThanOnePersonalIdentifier() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- null,
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ null,
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
true);
String spCountry = "AT";
String citizenCountryCode = "LU";
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.05", e.getErrorId());
Assert.assertEquals("wrong parameter size", 1, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",
+ Assert.assertEquals("wrong errorMsg", "NO 'PersonalIdentifier' attriubte",
e.getParams()[0]);
-
- }
+
+ }
}
-
+
@Test
public void emptyPersonalIdentifier() throws URISyntaxException {
//set-up
- ILightResponse eidasResponse = buildDummyAuthResponse(
- "",
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ "",
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
String spCountry = "AT";
String citizenCountryCode = "LU";
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
try {
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, citizenCountryCode, attrRegistry);
Assert.fail("Wrong eIDAS response not detected");
-
+
} catch (EidasValidationException e) {
- Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
+ Assert.assertEquals("ErrorId", "eidas.07", e.getErrorId());
Assert.assertEquals("wrong parameter size", 2, e.getParams().length);
- Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
+ Assert.assertEquals("wrong errorMsg", "PersonIdentifier",
e.getParams()[0]);
- Assert.assertEquals("wrong errorMsg",
- "Wrong identifier format",
+ Assert.assertEquals("wrong errorMsg",
+ "Wrong identifier format",
e.getParams()[1]);
-
- }
+
+ }
}
-
+
@Test
public void validResponse() throws URISyntaxException, EidasValidationException {
//set-up
-
+
String spCountry = RandomStringUtils.randomAlphabetic(2).toUpperCase();
String cCountry = RandomStringUtils.randomAlphabetic(2).toUpperCase();
-
- ILightResponse eidasResponse = buildDummyAuthResponse(
- cCountry + "/" + spCountry + "/" + RandomStringUtils.randomAlphanumeric(20),
+
+ ILightResponse eidasResponse = buildDummyAuthResponse(
+ cCountry + "/" + spCountry + "/" + RandomStringUtils.randomAlphanumeric(20),
EaafConstants.EIDAS_LOA_SUBSTANTIAL,
false);
-
+
oaParam.setLoa(Arrays.asList(EaafConstants.EIDAS_LOA_HIGH, EaafConstants.EIDAS_LOA_SUBSTANTIAL));
-
-
+
+
//execute test
EidasResponseValidator.validateResponse(pendingReq, eidasResponse, spCountry, cCountry, attrRegistry);
-
+
}
-
-
- private AuthenticationResponse buildDummyAuthResponse(String personalId, String loa, boolean moreThanOnePersonalId)
+
+
+ private AuthenticationResponse buildDummyAuthResponse(String personalId, String loa, boolean moreThanOnePersonalId)
throws URISyntaxException {
-
-
+
+
final AttributeDefinition personIdattributeDef = attrRegistry.getCoreAttributeRegistry().getByFriendlyName(
Constants.eIDAS_ATTR_PERSONALIDENTIFIER).first();
final Builder attributeMap = ImmutableAttributeMap.builder();
if (personalId != null) {
if (moreThanOnePersonalId) {
- ImmutableSet values = ImmutableSet.of(new StringAttributeValue(personalId),
+ ImmutableSet values = ImmutableSet.of(new StringAttributeValue(personalId),
new StringAttributeValue("XX/YY/" + RandomStringUtils.randomAlphanumeric(10)));
- attributeMap.put(personIdattributeDef, values);
-
+ attributeMap.put(personIdattributeDef, values);
+
} else {
attributeMap.put(personIdattributeDef, personalId);
-
- }
+
+ }
}
-
+
val b = new AuthenticationResponse.Builder();
return b.id("_".concat(Random.nextHexRandom16()))
.issuer(RandomStringUtils.randomAlphabetic(10))
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_lazy.xml b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_lazy.xml
new file mode 100644
index 00000000..a567ecba
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_lazy.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd" >
+
+ <context:annotation-config />
+
+ <import resource="classpath:/spring/eaaf_utils.beans.xml"/>
+
+ <bean id="idAustriaAuthCredentialProvider"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.idaustriaclient.provider.IdAustriaClientAuthCredentialProvider"
+ lazy-init="true" />
+
+ <bean id="dummyPvpConfig"
+ class="at.gv.egiz.eaaf.modules.pvp2.idp.test.dummy.DummyPvpConfiguration"
+ lazy-init="true" />
+
+</beans>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml
index cd2888c1..f4fc72a7 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_basic_test.xml
@@ -12,6 +12,9 @@
<context:annotation-config />
+
+ <bean id="eidasConnectorMessageSource"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.config.EidasConnectorMessageSource"/>
<bean id="SZRClientForeIDAS"
class="at.asitplus.eidas.specific.modules.auth.eidas.v2.szr.SzrClient" />
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_ccSearchProcessor_test.xml b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_ccSearchProcessor_test.xml
new file mode 100644
index 00000000..6f071b38
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_ccSearchProcessor_test.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:mvc="http://www.springframework.org/schema/mvc"
+ xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
+
+ <bean id="deMatchingHandler"
+ class="at.asitplus.eidas.specific.modules.auth.eidas.v2.handler.DeSpecificDetailSearchProcessor" />
+
+</beans> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml
index 6d6bb51e..0afa0d7d 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/SpringTest-context_tasks_test.xml
@@ -18,6 +18,8 @@
<import resource="SpringTest-context_authManager.xml" />
<import resource="SpringTest-context_basic_test.xml" />
+ <import resource="classpath:/eidas_v2_auth.beans.xml"/>
+ <import resource="classpath:/eaaf_pvp.beans.xml" />
<bean id="mvcGUIBuilderImpl"
class="at.gv.egiz.eaaf.core.impl.gui.builder.SpringMvcGuiFormBuilderImpl" />
@@ -25,6 +27,15 @@
<bean id="springManagedSpecificConnectorCommunicationService"
class="at.asitplus.eidas.specific.modules.auth.eidas.v2.test.dummy.DummySpecificCommunicationService" />
+ <bean id="dummyPvpConfig"
+ class="at.gv.egiz.eaaf.modules.pvp2.idp.test.dummy.DummyPvpConfiguration" />
+
+ <bean id="dummyGuiConfigFactory"
+ class="at.gv.egiz.eaaf.core.impl.idp.module.gui.DummyGuiBuilderConfigurationFactory" />
+
+ <bean id="dummyVelocityBuilder"
+ class="at.gv.egiz.eaaf.core.impl.idp.module.gui.DummyVelocityGuiFormBuilder" />
+
<bean id="specificConnectorAttributesFileWithPath"
class="java.lang.String">
<constructor-arg
@@ -37,31 +48,5 @@
value="src/test/resources/config/additional-attributes.xml" />
</bean>
- <bean id="attributeRegistry"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.EidasAttributeRegistry">
- <property name="eidasAttributesFile"
- ref="specificConnectorAttributesFileWithPath" />
- <property name="additionalAttributesFile"
- ref="specificConnectorAdditionalAttributesFileWithPath" />
- </bean>
-
- <bean id="authBlockSigningService"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.service.AuthBlockSigningService" />
-
- <bean id="EidasSignalServlet"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.EidasSignalServlet" />
-
- <!-- Authentication Process Tasks -->
- <bean id="ConnecteIDASNodeTask"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.GenerateAuthnRequestTask"
- scope="prototype" />
-
- <bean id="ReceiveResponseFromeIDASNodeTask"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.ReceiveAuthnResponseTask"
- scope="prototype" />
-
- <bean id="CreateIdentityLinkTask"
- class="at.asitplus.eidas.specific.modules.auth.eidas.v2.tasks.CreateIdentityLinkTask"
- scope="prototype" />
</beans> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties
index a662379c..6d97513a 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1.properties
@@ -8,15 +8,20 @@ eidas.ms.context.use.clustermode=true
eidas.ms.monitoring.eIDASNode.metadata.url=
+eidas.ms.client.http.connection.timeout.socket=5
+eidas.ms.client.http.connection.timeout.connection=5
+eidas.ms.client.http.connection.timeout.request=5
+
+
##Specific logger configuration
eidas.ms.technicallog.write.MDS.into.techlog=true
eidas.ms.revisionlog.write.MDS.into.revisionlog=true
eidas.ms.revisionlog.logIPAddressOfUser=true
##Directory for static Web content
-eidas.ms.webcontent.static.directory=webcontent/
-eidas.ms.webcontent.templates=templates/
-eidas.ms.webcontent.properties=properties/messages
+eidas.ms.webcontent.static.directory=../../../../../../basicConfig/webcontent/
+eidas.ms.webcontent.templates=../../../../../../basicConfig/templates/
+eidas.ms.webcontent.properties=../../../../../../basicConfig/properties/messages
## extended validation of pending-request Id's
eidas.ms.core.pendingrequestid.maxlifetime=300
@@ -88,6 +93,26 @@ eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,tr
eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demozmr
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+
+
+# ERnP communication
+eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
+eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=../keystore/junit_test.jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
+
+
+
+#### SP End-Points #####
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
@@ -114,4 +139,28 @@ eidas.ms.configuration.sp.disableRegistrationRequirement=
eidas.ms.configuration.restrictions.baseID.spTransmission=
eidas.ms.configuration.auth.default.countrycode=
eidas.ms.configuration.pvp.scheme.validation=
-eidas.ms.configuration.pvp.enable.entitycategories= \ No newline at end of file
+eidas.ms.configuration.pvp.enable.entitycategories=
+
+
+
+
+## PVP2 S-Profile ID Austria client configuration
+
+eidas.ms.modules.idaustriaclient.keystore.path=../keystore/junit_test.jks
+eidas.ms.modules.idaustriaclient.keystore.password=password
+eidas.ms.modules.idaustriaclient.keystore.type=jks
+
+eidas.ms.modules.idaustriaclient.metadata.sign.alias=meta
+eidas.ms.modules.idaustriaclient.metadata.sign.password=password
+eidas.ms.modules.idaustriaclient.request.sign.alias=sig
+eidas.ms.modules.idaustriaclient.request.sign.password=password
+eidas.ms.modules.idaustriaclient.response.encryption.alias=enc
+eidas.ms.modules.idaustriaclient.response.encryption.password=password
+
+eidas.ms.modules.idaustriaclient.truststore.path=../keystore/junit_test.jks
+eidas.ms.modules.idaustriaclient.truststore.password=password
+eidas.ms.modules.idaustriaclient.truststore.type=jks
+
+eidas.ms.modules.idaustriaclient.idaustria.idp.entityId=
+eidas.ms.modules.idaustriaclient.idaustria.idp.metadataUrl=
+
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1_springboot.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1_springboot.properties
new file mode 100644
index 00000000..22003513
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_1_springboot.properties
@@ -0,0 +1,143 @@
+## embbeded Tomcat
+tomcat.workingdir=./target/work
+tomcat.ajp.enabled=true
+tomcat.ajp.port=8009
+tomcat.ajp.networkAddress=127.0.0.1
+tomcat.ajp.additionalAttributes.secretrequired=true
+tomcat.ajp.additionalAttributes.secret=junit
+
+## Basic service configuration
+eidas.ms.context.url.prefix=http://localhost
+eidas.ms.core.configRootDir=file:./src/test/resources/config/
+
+eidas.ms.context.use.clustermode=true
+
+##Monitoring
+eidas.ms.monitoring.eIDASNode.metadata.url=http://localhost:40900/mockup
+
+## extended validation of pending-request Id's
+eidas.ms.core.pendingrequestid.digist.secret=pendingReqIdSecret
+
+## eIDAS Ref. Implementation connector ###
+eidas.ms.auth.eIDAS.node_v2.forward.endpoint=http://eidas.node/junit
+
+eidas.ms.auth.eIDAS.szrclient.useTestService=true
+eidas.ms.auth.eIDAS.szrclient.endpoint.prod=
+eidas.ms.auth.eIDAS.szrclient.endpoint.test=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.szrclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.path=
+eidas.ms.auth.eIDAS.szrclient.ssl.trustStore.password=
+
+#tech. AuthBlock signing for E-ID process
+eidas.ms.auth.eIDAS.authblock.keystore.password=f/+saJBc3a}*/T^s
+eidas.ms.auth.eIDAS.authblock.keystore.friendlyName=connectorkeypair
+eidas.ms.auth.eIDAS.authblock.keystore.path=keys/teststore.jks
+eidas.ms.auth.eIDAS.authblock.keystore.type=jks
+eidas.ms.auth.eIDAS.authblock.key.alias=connectorkeypair
+eidas.ms.auth.eIDAS.authblock.key.password=f/+saJBc3a}*/T^s
+
+
+#Raw eIDAS Id data storage
+eidas.ms.auth.eIDAS.szrclient.debug.logfullmessages=true
+eidas.ms.auth.eIDAS.szrclient.debug.useDummySolution=false
+
+
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.path=keys/junit.jks
+eidas.ms.auth.eIDAS.zmrclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.path=
+eidas.ms.auth.eIDAS.zmrclient.ssl.trustStore.password=
+
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.text=KITT for eIDAS Matching
+
+# ERnP communication
+eidas.ms.auth.eIDAS.ernpclient.endpoint=http://localhost:1718/demoernp
+eidas.ms.auth.eIDAS.ernpclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.type=jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.path=../keystore/junit_test.jks
+eidas.ms.auth.eIDAS.ernpclient.ssl.keyStore.password=password
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.alias=meta
+eidas.ms.auth.eIDAS.ernpclient.ssl.key.password=password
+
+
+
+#### SP End-Points #####
+## PVP2 S-Profile end-point configuration
+eidas.ms.pvp2.keystore.type=jks
+eidas.ms.pvp2.keystore.path=keys/junit.jks
+eidas.ms.pvp2.keystore.password=password
+eidas.ms.pvp2.key.metadata.alias=meta
+eidas.ms.pvp2.key.metadata.password=password
+eidas.ms.pvp2.key.signing.alias=sig
+eidas.ms.pvp2.key.signing.password=password
+eidas.ms.pvp2.metadata.validity=24
+
+eidas.ms.pvp2.metadata.organisation.name=JUnit
+eidas.ms.pvp2.metadata.organisation.friendyname=For testing with jUnit
+eidas.ms.pvp2.metadata.organisation.url=http://junit.test
+eidas.ms.pvp2.metadata.contact.givenname=Max
+eidas.ms.pvp2.metadata.contact.surname=Mustermann
+eidas.ms.pvp2.metadata.contact.email=max@junit.test
+
+## Service Provider configuration
+eidas.ms.sp.0.uniqueID=https://demo.egiz.gv.at/demoportal_moaid-2.0/sp/eidas/metadata
+eidas.ms.sp.0.pvp2.metadata.truststore=keys/junit.jks
+eidas.ms.sp.0.pvp2.metadata.truststore.password=password
+eidas.ms.sp.0.friendlyName=jUnit test
+eidas.ms.sp.0.newEidMode=true
+
+#eidas.ms.sp.0.pvp2.metadata.url=
+#eidas.ms.sp.0.policy.allowed.requested.targets=.*
+#eidas.ms.sp.0.policy.hasBaseIdTransferRestriction=false
+
+## Service Provider configuration
+eidas.ms.sp.1.uniqueID=https://demo.egiz.gv.at/junit_test
+eidas.ms.sp.1.pvp2.metadata.truststore=keys/junit.jks
+eidas.ms.sp.1.pvp2.metadata.truststore.password=password
+eidas.ms.sp.1.friendlyName=jUnit test
+eidas.ms.sp.1.pvp2.metadata.url=http://junit.test/metadata
+eidas.ms.sp.1.policy.allowed.requested.targets=test
+eidas.ms.sp.1.policy.hasBaseIdTransferRestriction=true
+
+## PVP2 S-Profile client configuration
+#eidas.ms.modules.idaustriaclient.keystore.type=jks
+#eidas.ms.modules.idaustriaclient.keystore.path=keys/junit.jks1
+#eidas.ms.modules.idaustriaclient.keystore.password=password
+#eidas.ms.modules.idaustriaclient.key.metadata.alias=meta
+#eidas.ms.modules.idaustriaclient.key.metadata.password=password
+#eidas.ms.modules.idaustriaclient.key.signing.alias=sig
+#eidas.ms.modules.idaustriaclient.key.signing.password=password
+#eidas.ms.modules.idaustriaclient.metadata.validity=24
+
+eidas.ms.modules.idaustriaclient.keystore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.keystore.password=password
+eidas.ms.modules.idaustriaclient.keystore.type=jks
+
+eidas.ms.modules.idaustriaclient.metadata.sign.alias=meta
+eidas.ms.modules.idaustriaclient.metadata.sign.password=password
+eidas.ms.modules.idaustriaclient.request.sign.alias=sig
+eidas.ms.modules.idaustriaclient.request.sign.password=password
+eidas.ms.modules.idaustriaclient.response.encryption.alias=enc
+eidas.ms.modules.idaustriaclient.response.encryption.password=password
+
+eidas.ms.modules.idaustriaclient.truststore.path=keys/junit_test.jks
+eidas.ms.modules.idaustriaclient.truststore.password=password
+eidas.ms.modules.idaustriaclient.truststore.type=jks
+
+eidas.ms.modules.idaustriaclient.idaustria.idp.entityId=
+eidas.ms.modules.idaustriaclient.idaustria.idp.metadataUrl=
+
+eidas.ms.modules.idaustriaclient.metadata.organisation.name=JUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.friendyname=For testing with jUnit
+eidas.ms.modules.idaustriaclient.metadata.organisation.url=http://junit.test
+eidas.ms.modules.idaustriaclient.metadata.contact.givenname=Max
+eidas.ms.modules.idaustriaclient.metadata.contact.surname=Mustermann
+eidas.ms.modules.idaustriaclient.metadata.contact.email=max@junit.test
+
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties
index 7c5e5a40..f07f86f6 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_2.properties
@@ -86,6 +86,13 @@ eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,tr
eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_3.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_3.properties
index c830d447..7b975752 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_3.properties
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_3.properties
@@ -88,6 +88,13 @@ eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,tr
eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties
index 01e72069..7fda2871 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_4.properties
@@ -86,6 +86,13 @@ eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,tr
eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_de_attributes.properties b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_de_attributes.properties
index 6b235667..0cdb4459 100644
--- a/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_de_attributes.properties
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/junit_config_de_attributes.properties
@@ -88,6 +88,13 @@ eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.4=LegalPerson,tr
eidas.ms.auth.eIDAS.node_v2.attributes.requested.representation.5=LegalName,true
+#### matching######
+# ZMR communication
+eidas.ms.auth.eIDAS.zmrclient.endpoint=http://localhost:1234/demoszr
+eidas.ms.auth.eIDAS.zmrclient.req.organisation.behoerdennr=jUnit123456
+eidas.ms.auth.eIDAS.zmrclient.req.update.reason.code=EIDAS-KITT
+
+
## PVP2 S-Profile end-point configuration
eidas.ms.pvp2.keystore.path=keys/.....
eidas.ms.pvp2.keystore.password=
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/junit_test.jks b/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/junit_test.jks
new file mode 100644
index 00000000..ee6254a9
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/junit_test.jks
Binary files differ
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/teststore.jks b/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/teststore.jks
new file mode 100644
index 00000000..fcc6400c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/config/keys/teststore.jks
Binary files differ
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID.xml
new file mode 100644
index 00000000..10701c29
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Mustermann</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Max</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1940-01-01</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">BF:QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userAuthBlock" Name="urn:eidgvat:attributes.authblock.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID_deprecated_bpk_encoding.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID_deprecated_bpk_encoding.xml
new file mode 100644
index 00000000..92ace06c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_EID_deprecated_bpk_encoding.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Mustermann</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Max</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1940-01-01</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userAuthBlock" Name="urn:eidgvat:attributes.authblock.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_wrong_destination_endpoint.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_wrong_destination_endpoint.xml
new file mode 100644
index 00000000..c21381d9
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_with_wrong_destination_endpoint.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
+ Destination="https://localhost/authhandler/idAustriaSp1/post"
+ InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3"
+ NotOnOrAfter="2014-03-05T06:44:51.017Z"
+ Recipient="https://localhost/authhandler/idAustriaSp1/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://demo.egiz.gv.at/demoportal_demologin/</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://www.stork.gov.eu/1.0/citizenQAALevel/4</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Mustermann</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Max</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1940-01-01</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">BF:QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.94" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:integer">4</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">AT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">urn:publicid:gv.at:cdid+BF</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_classpath_entityid.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_classpath_entityid.xml
new file mode 100644
index 00000000..1c3bd357
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_classpath_entityid.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Mustermann</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">Max</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">1940-01-01</saml2:AttributeValue>
+ </saml2:Attribute>
+
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA- EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/high</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">urn:publicid:gv.at:cdid+BF</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error.xml
new file mode 100644
index 00000000..2d7020ac
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder">
+ <saml2p:StatusCode Value="9199"/>
+ </saml2p:StatusCode>
+ <saml2p:StatusMessage>Der Anmeldevorgang wurde durch den Benutzer abgebrochen.</saml2p:StatusMessage>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="eidBind" Name="urn:eidgvat:attributes.eidbind" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">aabbccddeeffgghh</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userConsent" Name="urn:eidgvat:attributes.consent.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_empty_subcode.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_empty_subcode.xml
new file mode 100644
index 00000000..36fd9c11
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_empty_subcode.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder">
+ <saml2p:StatusCode Value=""/>
+ </saml2p:StatusCode>
+ <saml2p:StatusMessage>Der Anmeldevorgang wurde durch den Benutzer abgebrochen.</saml2p:StatusMessage>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="eidBind" Name="urn:eidgvat:attributes.eidbind" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">aabbccddeeffgghh</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userConsent" Name="urn:eidgvat:attributes.consent.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_userstop.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_userstop.xml
new file mode 100644
index 00000000..989d3053
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_userstop.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder">
+ <saml2p:StatusCode Value="1005"/>
+ </saml2p:StatusCode>
+ <saml2p:StatusMessage>Der Anmeldevorgang wurde durch den Benutzer abgebrochen.</saml2p:StatusMessage>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="eidBind" Name="urn:eidgvat:attributes.eidbind" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">aabbccddeeffgghh</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userConsent" Name="urn:eidgvat:attributes.consent.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_without_subcode.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_without_subcode.xml
new file mode 100644
index 00000000..c85cb655
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/Response_without_sig_with_error_without_subcode.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" Destination="https://localhost/authhandler/sp/idaustria/post" InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">classpath:/data/idp_metadata_classpath_entity.xml</saml2:Issuer>
+ <saml2p:Status>
+ <saml2p:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Responder">
+ </saml2p:StatusCode>
+ <saml2p:StatusMessage>Der Anmeldevorgang wurde durch den Benutzer abgebrochen.</saml2p:StatusMessage>
+ </saml2p:Status>
+ <saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="_602c3236bffaf71ac3ac88674e76ff9f" IssueInstant="2014-03-05T06:39:51.017Z" Version="2.0">
+ <saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://demo.egiz.gv.at/demoportal_moaid-2.0/pvp/metadata</saml2:Issuer>
+ <saml2:Subject>
+ <saml2:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" NameQualifier="urn:publicid:gv.at:cdid+BF">QVGm48cqcM4UcyhDTNGYmVdrIoY=</saml2:NameID>
+ <saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
+ <saml2:SubjectConfirmationData InResponseTo="_aeebfae3ce681fe3ddcaf213a42f01d3" NotOnOrAfter="2014-03-05T06:44:51.017Z" Recipient="https://localhost/authhandler/sp/idaustria/post"/>
+ </saml2:SubjectConfirmation>
+ </saml2:Subject>
+ <saml2:Conditions NotBefore="2014-03-05T06:39:51.017Z" NotOnOrAfter="2014-03-05T06:44:51.017Z">
+ <saml2:AudienceRestriction>
+ <saml2:Audience>https://localhost/authhandler/sp/idaustria/metadata</saml2:Audience>
+ </saml2:AudienceRestriction>
+ </saml2:Conditions>
+ <saml2:AuthnStatement AuthnInstant="2014-03-05T06:39:51.017Z" SessionIndex="_c0c683509a8ff6ac372a9cf9c5c5a406">
+ <saml2:AuthnContext>
+ <saml2:AuthnContextClassRef>http://eidas.europa.eu/LoA/high</saml2:AuthnContextClassRef>
+ </saml2:AuthnContext>
+ </saml2:AuthnStatement>
+ <saml2:AttributeStatement>
+ <saml2:Attribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">2.1</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">http://eidas.europa.eu/LoA/low</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">IT</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="eidBind" Name="urn:eidgvat:attributes.eidbind" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">aabbccddeeffgghh</saml2:AttributeValue>
+ </saml2:Attribute>
+ <saml2:Attribute FriendlyName="userConsent" Name="urn:eidgvat:attributes.consent.signed" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
+ <saml2:AttributeValue xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="xs:string">MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRhMB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SYO4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYIKoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImnAiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==</saml2:AttributeValue>
+ </saml2:Attribute>
+ </saml2:AttributeStatement>
+ </saml2:Assertion>
+</saml2p:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_req.json
new file mode 100644
index 00000000..4f823c60
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_req.json
@@ -0,0 +1,30 @@
+{
+ "begruendung": "Add new person",
+ "personendaten": {
+ "familienname": "CtKKrtUe",
+ "vorname": "dUeYzUFg",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ }
+ },
+ "anschrift": null,
+ "eidas": [
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "wert": "Y8ADWaeh0h",
+ "staatscode2": "DE"
+ },
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "wert": "hrFevCfP",
+ "staatscode2": "DE"
+ },
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "wert": "sNUEAhEr",
+ "staatscode2": "DE"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_resp.json
new file mode 100644
index 00000000..139483cf
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_add_resp.json
@@ -0,0 +1,60 @@
+{
+ "person": {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000486",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "Y8ADWaeh0h"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000488",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "hrFevCfP"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000490",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "sNUEAhEr"
+ }
+ ],
+ "entityId": "1933000000000475",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:07:28.885+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000482591530",
+ "bpkZp": "+OQnljn0Son1W2rkM73nP/VMsvc=",
+ "entityId": "1933000000000475",
+ "familienname": "CtKKrtUe",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "vorname": "dUeYzUFg"
+ },
+ "version": "2022-03-03T11:07:28.885+01:00"
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_req.json
new file mode 100644
index 00000000..2538ebac
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_req.json
@@ -0,0 +1,19 @@
+{
+ "begruendung": "KITT get-latest-version",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "bpkZp": "+OQnljn0Son1W2rkM73nP/VMsvc=",
+ "familienname": "CtKKrtUe",
+ "vorname": "dUeYzUFg",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_resp.json
new file mode 100644
index 00000000..588153cd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_search_latest_resp.json
@@ -0,0 +1,62 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000486",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "Y8ADWaeh0h"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000488",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "hrFevCfP"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000490",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "sNUEAhEr"
+ }
+ ],
+ "entityId": "1933000000000475",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:07:28.885+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000482591530",
+ "bpkZp": "+OQnljn0Son1W2rkM73nP/VMsvc=",
+ "entityId": "1933000000000475",
+ "familienname": "CtKKrtUe",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "vorname": "dUeYzUFg"
+ },
+ "version": "2022-03-03T11:07:28.885+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_req.json
new file mode 100644
index 00000000..194fba1d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_req.json
@@ -0,0 +1,17 @@
+{
+ "begruendung": "KITT update dataset",
+ "aendern": {
+ "personendaten": {
+ "entityId": "1933000000000475",
+ "familienname": "mVzTMpig6r",
+ "vorname": "Jb2vj1Xpql",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ }
+ }
+ },
+ "entityId": "1933000000000475",
+ "version": "2022-03-03T10:07:28.885Z"
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_resp.json
new file mode 100644
index 00000000..7fe9210a
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_kitt_update_resp.json
@@ -0,0 +1,60 @@
+{
+ "person": {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000486",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "Y8ADWaeh0h"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000488",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "hrFevCfP"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000490",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "sNUEAhEr"
+ }
+ ],
+ "entityId": "1933000000000475",
+ "gueltigAb": "2022-03-03T11:07:29.751+01:00",
+ "letzteOperation": {
+ "begruendung": "KITT update dataset",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAendern",
+ "zeitpunkt": "2022-03-03T11:07:29.751+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000482591530",
+ "bpkZp": "+OQnljn0Son1W2rkM73nP/VMsvc=",
+ "entityId": "1933000000000475",
+ "familienname": "mVzTMpig6r",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:07:29.751+01:00",
+ "vorname": "Jb2vj1Xpql"
+ },
+ "version": "2022-03-03T11:07:29.751+01:00"
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_req.json
new file mode 100644
index 00000000..d7344f08
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_req.json
@@ -0,0 +1,20 @@
+{
+ "begruendung": "Searching PersonIdentifier",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "familienname": null,
+ "vorname": null,
+ "eidas": [
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "wert": "Y8ADWaeh0h",
+ "staatscode2": "DE"
+ }
+ ]
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_resp.json
new file mode 100644
index 00000000..588153cd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/1_search_with_personalId_resp.json
@@ -0,0 +1,62 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000486",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "Y8ADWaeh0h"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000488",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "hrFevCfP"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000490",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "staatscode2": "DE",
+ "wert": "sNUEAhEr"
+ }
+ ],
+ "entityId": "1933000000000475",
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:07:28.885+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000482591530",
+ "bpkZp": "+OQnljn0Son1W2rkM73nP/VMsvc=",
+ "entityId": "1933000000000475",
+ "familienname": "CtKKrtUe",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 5,
+ "tag": 5
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:07:28.885+01:00",
+ "vorname": "dUeYzUFg"
+ },
+ "version": "2022-03-03T11:07:28.885+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_req.json
new file mode 100644
index 00000000..35e52c10
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_req.json
@@ -0,0 +1,30 @@
+{
+ "begruendung": "Add new person",
+ "personendaten": {
+ "familienname": "mRjMKAQc",
+ "vorname": "vdqZZIaA",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ }
+ },
+ "anschrift": null,
+ "eidas": [
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "wert": "88hvWzUaIX",
+ "staatscode2": "DE"
+ },
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "wert": "VRNCAylF",
+ "staatscode2": "DE"
+ },
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "wert": "miEklFHC",
+ "staatscode2": "DE"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_resp.json
new file mode 100644
index 00000000..7f85a143
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_add_resp.json
@@ -0,0 +1,60 @@
+{
+ "person": {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000509",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "88hvWzUaIX"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000511",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "VRNCAylF"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000513",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "miEklFHC"
+ }
+ ],
+ "entityId": "1933000000000498",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:14:59.712+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000951265372",
+ "bpkZp": "TBGoMlirU881e2jMGETa9WLx1+A=",
+ "entityId": "1933000000000498",
+ "familienname": "mRjMKAQc",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "vorname": "vdqZZIaA"
+ },
+ "version": "2022-03-03T11:14:59.712+01:00"
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_req.json
new file mode 100644
index 00000000..d3dd0658
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_req.json
@@ -0,0 +1,19 @@
+{
+ "begruendung": "KITT get-latest-version",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "bpkZp": "TBGoMlirU881e2jMGETa9WLx1+A=",
+ "familienname": "mRjMKAQc",
+ "vorname": "vdqZZIaA",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_resp.json
new file mode 100644
index 00000000..24009e64
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_search_latest_resp.json
@@ -0,0 +1,62 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000509",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "88hvWzUaIX"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000511",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "VRNCAylF"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000513",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "miEklFHC"
+ }
+ ],
+ "entityId": "1933000000000498",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:14:59.712+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000951265372",
+ "bpkZp": "TBGoMlirU881e2jMGETa9WLx1+A=",
+ "entityId": "1933000000000498",
+ "familienname": "mRjMKAQc",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "vorname": "vdqZZIaA"
+ },
+ "version": "2022-03-03T11:14:59.712+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_req.json
new file mode 100644
index 00000000..0e4a9b21
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_req.json
@@ -0,0 +1,14 @@
+{
+ "begruendung": "KITT update dataset",
+ "anlegen": {
+ "eidas": [
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "wert": "nj1m79jm9z",
+ "staatscode2": "DE"
+ }
+ ]
+ },
+ "entityId": "1933000000000498",
+ "version": "2022-03-03T10:14:59.712Z"
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_resp.json
new file mode 100644
index 00000000..23dc74f3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_kitt_update_resp.json
@@ -0,0 +1,69 @@
+{
+ "person": {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000509",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "88hvWzUaIX"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000511",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "VRNCAylF"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000513",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "miEklFHC"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933100000000607",
+ "gueltigAb": "2022-03-03T11:15:00.762+01:00",
+ "staatscode2": "DE",
+ "wert": "nj1m79jm9z"
+ }
+ ],
+ "entityId": "1933000000000498",
+ "gueltigAb": "2022-03-03T11:15:00.762+01:00",
+ "letzteOperation": {
+ "begruendung": "KITT update dataset",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAendern",
+ "zeitpunkt": "2022-03-03T11:15:00.762+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000951265372",
+ "bpkZp": "TBGoMlirU881e2jMGETa9WLx1+A=",
+ "entityId": "1933000000000498",
+ "familienname": "mRjMKAQc",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "vorname": "vdqZZIaA"
+ },
+ "version": "2022-03-03T11:15:00.762+01:00"
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_req.json
new file mode 100644
index 00000000..d80b0d2e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_req.json
@@ -0,0 +1,30 @@
+{
+ "begruendung": "Searching DE specific",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "familienname": "mRjMKAQc",
+ "vorname": "vdqZZIaA",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "eidas": [
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "wert": "VRNCAylF",
+ "staatscode2": "DE"
+ },
+ {
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "wert": "miEklFHC",
+ "staatscode2": "DE"
+ }
+ ]
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_resp.json
new file mode 100644
index 00000000..24009e64
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/2_search_with_cc_specific_resp.json
@@ -0,0 +1,62 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000509",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "88hvWzUaIX"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000511",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "VRNCAylF"
+ },
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/BirthName",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000513",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "staatscode2": "DE",
+ "wert": "miEklFHC"
+ }
+ ],
+ "entityId": "1933000000000498",
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:14:59.712+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000951265372",
+ "bpkZp": "TBGoMlirU881e2jMGETa9WLx1+A=",
+ "entityId": "1933000000000498",
+ "familienname": "mRjMKAQc",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:14:59.712+01:00",
+ "vorname": "vdqZZIaA"
+ },
+ "version": "2022-03-03T11:14:59.712+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_req.json
new file mode 100644
index 00000000..eb382bc0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_req.json
@@ -0,0 +1,18 @@
+{
+ "begruendung": "Searching with MDS only",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "familienname": "DOPISN[0xc3][0x8d]",
+ "vorname": "DANA",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_resp.json
new file mode 100644
index 00000000..87be362d
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/3_search_with_mds_resp.json
@@ -0,0 +1,44 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000058",
+ "gueltigAb": "2022-03-02T16:23:32.743+01:00",
+ "staatscode2": "CZ",
+ "wert": "7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit"
+ }
+ ],
+ "entityId": "1933000000000047",
+ "gueltigAb": "2022-03-02T16:23:32.743+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-02T16:23:32.743+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000501189333",
+ "bpkZp": "vypyCkyczK7i+cgPWlJasuJphIA=",
+ "entityId": "1933000000000047",
+ "familienname": "DOPISNÍ",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-02T16:23:32.743+01:00",
+ "vorname": "DANA"
+ },
+ "version": "2022-03-02T16:23:32.743+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_multi_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_multi_resp.json
new file mode 100644
index 00000000..87a23647
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_multi_resp.json
@@ -0,0 +1,84 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933000000000653",
+ "gueltigAb": "2022-03-03T11:27:57.651+01:00",
+ "staatscode2": "XZ",
+ "wert": "ybgLmbYGxU"
+ }
+ ],
+ "entityId": "1933000000000642",
+ "gueltigAb": "2022-03-03T11:27:57.651+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:27:57.651+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000693812023",
+ "bpkZp": "QJ/5YLEbOCfRhG5R0KKHNnmeMYo=",
+ "entityId": "1933000000000642",
+ "familienname": "HjecFKGu",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:27:57.651+01:00",
+ "vorname": "QwnAMXsJ"
+ },
+ "version": "2022-03-03T11:27:57.651+01:00"
+ },
+ {
+ "type": "Person",
+ "eidas": [
+ {
+ "ablaufDatum": "9999-12-31T00:00:00.000+01:00",
+ "art": "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier",
+ "ausstellDatum": "9999-12-31T00:00:00.000+01:00",
+ "entityId": "1933100000000762",
+ "gueltigAb": "2022-03-03T11:27:57.885+01:00",
+ "staatscode2": "XZ",
+ "wert": "rEhBYWgiSx"
+ }
+ ],
+ "entityId": "1933100000000751",
+ "gueltigAb": "2022-03-03T11:27:57.885+01:00",
+ "letzteOperation": {
+ "begruendung": "Add new person",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "380630",
+ "benutzer": "eidtapp@bmi.gv.at"
+ },
+ "vorgang": "PersonAnlegen",
+ "zeitpunkt": "2022-03-03T11:27:57.885+01:00"
+ },
+ "personendaten": {
+ "basiszahl": "000803465934",
+ "bpkZp": "ZaJ2Yvx0u/z8VqNyCJ8zKT8XQa0=",
+ "entityId": "1933100000000751",
+ "familienname": "HjecFKGu",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ },
+ "geprueft": false,
+ "gueltigAb": "2022-03-03T11:27:57.885+01:00",
+ "vorname": "QwnAMXsJ"
+ },
+ "version": "2022-03-03T11:27:57.885+01:00"
+ }
+ ]
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_req.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_req.json
new file mode 100644
index 00000000..01c3c3f9
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/4_search_with_mds_req.json
@@ -0,0 +1,18 @@
+{
+ "begruendung": "Searching with MDS only",
+ "suchoptionen": {
+ "historisch": "AktuellUndHistorisch",
+ "sucheMitNamensteilen": false,
+ "suchwizard": false,
+ "zmr": false
+ },
+ "suchdaten": {
+ "familienname": "HjecFKGu",
+ "vorname": "QwnAMXsJ",
+ "geburtsdatum": {
+ "jahr": 1996,
+ "monat": 1,
+ "tag": 1
+ }
+ }
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_empty_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_empty_resp.json
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_empty_resp.json
@@ -0,0 +1 @@
+{}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_handbook_example.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_handbook_example.json
new file mode 100644
index 00000000..f4485ff7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/ernp_handbook_example.json
@@ -0,0 +1,85 @@
+{
+ "person": [
+ {
+ "type": "Person",
+ "anschrift": {
+ "type": "AnschriftInland",
+ "adressstatus": "XXXXXXXXX",
+ "codes": {
+ "gemeindekennziffer": "09988",
+ "strassenkennziffer": "T80001"
+ },
+ "entityId": 33069800000171092,
+ "gemeinde": "Testgemeinde",
+ "gueltigAb": "2011-09-06T11:23:55.306+02:00",
+ "hausnummer": "99",
+ "postleitzahl": "0077",
+ "postort": "Testpostort 77 mit maximalmögl. Längen",
+ "staat": {
+ "isoCode3": "AUT",
+ "name": "Österreich"
+ },
+ "strasse": "Testgasse"
+ },
+ "entityId": 33069800000171080,
+ "gueltigAb": "2011-09-06T11:23:55.306+02:00",
+ "letzteOperation": {
+ "begruendung": "Testperson",
+ "durchgefuehrtVon": {
+ "behoerdenkennzeichen": "346743",
+ "benutzer": "xlechne@bmi.gv.at"
+ },
+ "vorgang": "PERSON_ANLEGEN",
+ "zeitpunkt": "2011-09-06T11:23:55.306+02:00"
+ },
+ "personendaten": {
+ "basiszahl": "000766083209",
+ "bpkZp": "BC1ifQanMKaDQG0yLBPbQ9AHgb4=",
+ "entityId": 33069800000171080,
+ "familienname": "XXXSZR",
+ "geburtsbundesland": "Wien",
+ "geburtsdatum": {
+ "jahr": 1985,
+ "monat": 1,
+ "tag": 1
+ },
+ "geburtsort": "Wien",
+ "geburtsstaat": {
+ "isoCode3": "AUT",
+ "name": "Österreich"
+ },
+ "geprueft": true,
+ "geschlecht": "Männlich",
+ "gueltigAb": "2011-09-06T11:23:55.306+02:00",
+ "vorname": "XXXTest"
+ },
+ "reisedokument": [
+ {
+ "art": "Personalausweis",
+ "ausgestelltVon": {
+ "behoerde": "Wien",
+ "datum": "1985-01-01T00:00:00.000+01:00",
+ "staat": {
+ "isoCode3": "AUT",
+ "name": "Österreich"
+ }
+ },
+ "entityId": 33069800000171090,
+ "gueltigAb": "2011-09-06T11:23:55.306+02:00",
+ "nummer": "123456789"
+ }
+ ],
+ "staatsangehoerigkeit": [
+ {
+ "entityId": 33069800000171084,
+ "gueltigAb": "2011-09-06T11:23:55.306+02:00",
+ "staat": {
+ "isoCode3": "AUT",
+ "name": "Österreich"
+ }
+ }
+ ],
+ "version": "2011-09-06T11:23:55.306+02:00"
+ }
+ ]
+} \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/error_resp.json b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/error_resp.json
new file mode 100644
index 00000000..76e3e7ba
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/ernp/error_resp.json
@@ -0,0 +1,12 @@
+{
+ "faultDetails": {
+ "fault": [
+ {
+ "key": "suchdaten",
+ "message": "Mindestsuchkriterien sind: Vorname & Familienname & Geburtsdatum (statt Familienname kann auch Name vor Ehe angegeben werden) oder mindestens ein Eidas Attribut (Art & Wert & Staat)"
+ }
+ ],
+ "faultNumber": 100
+ },
+ "message": "Validierungsfehler"
+}
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_classpath_entity.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_classpath_entity.xml
new file mode 100644
index 00000000..080a189f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_classpath_entity.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<md:EntityDescriptor
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+ ID="_1a48ec3432f2f3ba6222724a5b06f873"
+ entityID="classpath:/data/idp_metadata_classpath_entity.xml"
+ validUntil="2045-02-06T08:47:26.211Z">
+ <md:IDPSSODescriptor
+ WantAuthnRequestsSigned="true"
+ protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo
+ xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDMzCCAhsCBFtIcPowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+ SVoxJDAiBgNVBAsMG2NlbnRyYWwgbmF0aW9uYWwgZUlEQVMgbm9kZTEaMBgGA1UEAwwRQXNzZXJ0
+ aW9uIHNpZ25pbmcwHhcNMTgwNzEzMDkyOTMwWhcNMjEwNDA3MDkyOTMwWjBeMQswCQYDVQQGEwJB
+ VDENMAsGA1UECgwERUdJWjEkMCIGA1UECwwbY2VudHJhbCBuYXRpb25hbCBlSURBUyBub2RlMRow
+ GAYDVQQDDBFBc3NlcnRpb24gc2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ AJ5zDYxMPRcz6AHaev1tS46Tq8sdgbGFM56uxk6c7LmMDC+HTzNX/3Q5S/YwSzgL3ue5TSw1ltOf
+ yMXMZ6D0+buWWcsxGEkQ8M3adKRFdQrEwafzwTA7pguq5WiHOkr4qwR7dLMome9z5cc3LRcwdOPP
+ gq7ahb5jM3hRqc5xkMWIuvql0NFXPzlHrjDLwy5nIWPOhL5abhVt4YsXbpbjXxFSGkDEAZ32K3EU
+ LNBr9FSUmJfbrVX9AU2T+BKIwiqXP8e/3UJHgPHQ0l5ljWp5P6u5+tvM21o8sUM4eArRa8BkdRsP
+ C92GVuASSUz2ZJ3JhAK1cSM8bnvaZVLQtTvPMAcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAp7z
+ TubWXW6YMpyLSvWBdZiiQ3X66XpSZLZJDIAkoPzEY0DSBp8I5YASIx4JTR5XJt+6MI9acgNIAYW8
+ DhtRwUMVaRWEtuCrfKhGLWm5KSxnhPcD3lzRZhY4ZcA7dUlirjf6hnqo2TFEmJ9fkM+rxwy1GkDD
+ 7j2YDSOFmSq9/Ud9/IbIfSnRu/lO0dh7iRrmg3y0Y/+plPxYmp4AHqehP11OchTz2FGGHVsSC2Vs
+ IVBQI6ANZYyOlicgfEEFHA06jP9OnA0EwEFr2P+di9caZg8vfibyzxMGeuf6CY0c0eLHokBCn2W8
+ vkzvWiER3pozRvCmXFjCVZfRjUunaJf2ow==
+ </ds:X509Certificate>
+ </ds:X509Data>
+ <ds:X509Data>
+ <ds:X509Certificate>MIIC+DCCAeCgAwIBAgIEXh7TbTANBgkqhkiG9w0BAQsFADA+MQswCQYDVQQGEwJB
+ VDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxEDAOBgNVBAMMB3NpZ25p
+ bmcwHhcNMjAwMTE1MDg1NTA5WhcNMjkwMTE0MDg1NTA5WjA+MQswCQYDVQQGEwJB
+ VDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxEDAOBgNVBAMMB3NpZ25p
+ bmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCUSiRjnDvPafZfhJ+L
+ 1wM86FKJX3VIAV/8TD9qJ6HOBkn5WwYfpheyCfRb6XVDyIGpO8qnMWAgC17Ngbmh
+ zj8d8HXNQ2l3uppMv24oUTfXyYhQfZWAghx0sTlRIx/ZmlnduJilx2S53Sa7ruJw
+ lQcBFXj9h9B8dtyegc86Sx6D9BumP1xU7+mEBk8Gv9rR5Khg0Y7qGfZWB0t4aikg
+ aupWveVwiGifOOSfR8czqIg9qUpMYfZiTEBTSRmN6sPiNWhd4J0GyAI9Rn5C9jz/
+ sSlQrxpN+4DXzsqSU5F6gzq3yRux6wyOzDlt2birf21VPQ9HIy4YCjZXwgDWG7AO
+ 821pAgMBAAEwDQYJKoZIhvcNAQELBQADggEBADnwdaxUtQU6SIpYwIb2c0ljTmQi
+ 7ryUcUpNHtK0M0E5Mw5Ex8zwrWbNQZ2sUyc4r07M66iOIqHsYZUQlRYvVKHifDpA
+ r8TCgD7iGGdB3By8Ou0RaNW+03w1fwmi98CufbHCGvpv0o2KxlejoHZminNdQ79i
+ bN+01nhocezJQATEQlnwHLiQSjilXpZeLYDk8HbrcUXNRxezN4ChdH+uU54vf+Ux
+ qcj9QHcmBe1+BM8EXfqS1DbTwZl+NTCnh5OYl8fvIFSOHMBxwFrI4pyY0faxg9Uc
+ rCogn/oQ+mV1gnVUDaDhvvEnVGZQtrlt7heVId2BeNellVgsrcmdW8j4U9U=
+ </ds:X509Certificate>
+ </ds:X509Data>
+ <ds:X509Data>
+ <ds:X509Certificate>MIIBbjCCARSgAwIBAgIEXh7TNzAKBggqhkjOPQQDAjA/MQswCQYDVQQGEwJBVDEN
+ MAsGA1UECgwERUdJWjEOMAwGA1UECwwFalVuaXQxETAPBgNVBAMMCG1ldGFkYXRh
+ MB4XDTIwMDExNTA4NTQxNVoXDTMwMDExNDA4NTQxNVowPzELMAkGA1UEBhMCQVQx
+ DTALBgNVBAoMBEVHSVoxDjAMBgNVBAsMBWpVbml0MREwDwYDVQQDDAhtZXRhZGF0
+ YTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABBdBkaxt31p++aZeP3SmlWITj9SY
+ O4McV2ccXFsH4X4QMHuKAMUvjxPm1kdU01eTOWdiQX0GpDIBspYMZh8ZKcwwCgYI
+ KoZIzj0EAwIDSAAwRQIhAJ3QKlk9cd90s+i8y62fvmGF6LtfNO+JvkWqDUBeQImn
+ AiA2KwFtzO7STAp9MEwQGe0vt0F8mO1ttrLE+rr6YxdwGA==
+ </ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent
+ </md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient
+ </md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified
+ </md:NameIDFormat>
+ <md:SingleSignOnService
+ Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
+ Location="https://vidp.gv.at/ms_connector/pvp/post" />
+ <md:SingleSignOnService
+ Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
+ Location="https://vidp.gv.at/ms_connector/pvp/redirect" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="PRINCIPAL-NAME"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.20"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-CCS-URL" Name="urn:oid:1.2.40.0.10.2.1.1.261.64"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-ISSUING-NATION"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.32"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-SOURCE-PIN"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.36"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-SIGNER-CERTIFICATE"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.66"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-SECTOR-FOR-IDENTIFIER"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.34"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-SOURCE-PIN-TYPE"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.104"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-E-ID-TOKEN"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.39"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-IDENTITY-LINK"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.38"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.108"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ <saml2:Attribute
+ xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"
+ FriendlyName="EID-IDENTITY-STATUS-LEVEL"
+ Name="urn:oid:1.2.40.0.10.2.1.1.261.109"
+ NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" />
+ </md:IDPSSODescriptor>
+</md:EntityDescriptor>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig.xml
new file mode 100644
index 00000000..bc55fe62
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_1a48ec3432f2f3ba6222724a5b06f873" entityID="https://vidp.gv.at/ms_connector/pvp/metadata" validUntil="2045-02-06T08:47:26.211Z">
+ <md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDMzCCAhsCBFtIcPowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+SVoxJDAiBgNVBAsMG2NlbnRyYWwgbmF0aW9uYWwgZUlEQVMgbm9kZTEaMBgGA1UEAwwRQXNzZXJ0
+aW9uIHNpZ25pbmcwHhcNMTgwNzEzMDkyOTMwWhcNMjEwNDA3MDkyOTMwWjBeMQswCQYDVQQGEwJB
+VDENMAsGA1UECgwERUdJWjEkMCIGA1UECwwbY2VudHJhbCBuYXRpb25hbCBlSURBUyBub2RlMRow
+GAYDVQQDDBFBc3NlcnRpb24gc2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJ5zDYxMPRcz6AHaev1tS46Tq8sdgbGFM56uxk6c7LmMDC+HTzNX/3Q5S/YwSzgL3ue5TSw1ltOf
+yMXMZ6D0+buWWcsxGEkQ8M3adKRFdQrEwafzwTA7pguq5WiHOkr4qwR7dLMome9z5cc3LRcwdOPP
+gq7ahb5jM3hRqc5xkMWIuvql0NFXPzlHrjDLwy5nIWPOhL5abhVt4YsXbpbjXxFSGkDEAZ32K3EU
+LNBr9FSUmJfbrVX9AU2T+BKIwiqXP8e/3UJHgPHQ0l5ljWp5P6u5+tvM21o8sUM4eArRa8BkdRsP
+C92GVuASSUz2ZJ3JhAK1cSM8bnvaZVLQtTvPMAcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAp7z
+TubWXW6YMpyLSvWBdZiiQ3X66XpSZLZJDIAkoPzEY0DSBp8I5YASIx4JTR5XJt+6MI9acgNIAYW8
+DhtRwUMVaRWEtuCrfKhGLWm5KSxnhPcD3lzRZhY4ZcA7dUlirjf6hnqo2TFEmJ9fkM+rxwy1GkDD
+7j2YDSOFmSq9/Ud9/IbIfSnRu/lO0dh7iRrmg3y0Y/+plPxYmp4AHqehP11OchTz2FGGHVsSC2Vs
+IVBQI6ANZYyOlicgfEEFHA06jP9OnA0EwEFr2P+di9caZg8vfibyzxMGeuf6CY0c0eLHokBCn2W8
+vkzvWiER3pozRvCmXFjCVZfRjUunaJf2ow==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vidp.gv.at/ms_connector/pvp/post"/>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vidp.gv.at/ms_connector/pvp/redirect"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CCS-URL" Name="urn:oid:1.2.40.0.10.2.1.1.261.64" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN" Name="urn:oid:1.2.40.0.10.2.1.1.261.36" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SIGNER-CERTIFICATE" Name="urn:oid:1.2.40.0.10.2.1.1.261.66" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.104" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-E-ID-TOKEN" Name="urn:oid:1.2.40.0.10.2.1.1.261.39" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-LINK" Name="urn:oid:1.2.40.0.10.2.1.1.261.38" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-STATUS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.109" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ </md:IDPSSODescriptor>
+</md:EntityDescriptor>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig2.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig2.xml
new file mode 100644
index 00000000..bdc176a0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_no_sig2.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_1a48ec3432f2f3ba6222724a5b06f873" entityID="classpath:/data/idp_metadata_no_sig2.xml" validUntil="2045-02-06T08:47:26.211Z">
+ <md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDMzCCAhsCBFtIcPowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+SVoxJDAiBgNVBAsMG2NlbnRyYWwgbmF0aW9uYWwgZUlEQVMgbm9kZTEaMBgGA1UEAwwRQXNzZXJ0
+aW9uIHNpZ25pbmcwHhcNMTgwNzEzMDkyOTMwWhcNMjEwNDA3MDkyOTMwWjBeMQswCQYDVQQGEwJB
+VDENMAsGA1UECgwERUdJWjEkMCIGA1UECwwbY2VudHJhbCBuYXRpb25hbCBlSURBUyBub2RlMRow
+GAYDVQQDDBFBc3NlcnRpb24gc2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJ5zDYxMPRcz6AHaev1tS46Tq8sdgbGFM56uxk6c7LmMDC+HTzNX/3Q5S/YwSzgL3ue5TSw1ltOf
+yMXMZ6D0+buWWcsxGEkQ8M3adKRFdQrEwafzwTA7pguq5WiHOkr4qwR7dLMome9z5cc3LRcwdOPP
+gq7ahb5jM3hRqc5xkMWIuvql0NFXPzlHrjDLwy5nIWPOhL5abhVt4YsXbpbjXxFSGkDEAZ32K3EU
+LNBr9FSUmJfbrVX9AU2T+BKIwiqXP8e/3UJHgPHQ0l5ljWp5P6u5+tvM21o8sUM4eArRa8BkdRsP
+C92GVuASSUz2ZJ3JhAK1cSM8bnvaZVLQtTvPMAcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAp7z
+TubWXW6YMpyLSvWBdZiiQ3X66XpSZLZJDIAkoPzEY0DSBp8I5YASIx4JTR5XJt+6MI9acgNIAYW8
+DhtRwUMVaRWEtuCrfKhGLWm5KSxnhPcD3lzRZhY4ZcA7dUlirjf6hnqo2TFEmJ9fkM+rxwy1GkDD
+7j2YDSOFmSq9/Ud9/IbIfSnRu/lO0dh7iRrmg3y0Y/+plPxYmp4AHqehP11OchTz2FGGHVsSC2Vs
+IVBQI6ANZYyOlicgfEEFHA06jP9OnA0EwEFr2P+di9caZg8vfibyzxMGeuf6CY0c0eLHokBCn2W8
+vkzvWiER3pozRvCmXFjCVZfRjUunaJf2ow==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vidp.gv.at/ms_connector/pvp/post"/>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vidp.gv.at/ms_connector/pvp/redirect"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CCS-URL" Name="urn:oid:1.2.40.0.10.2.1.1.261.64" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN" Name="urn:oid:1.2.40.0.10.2.1.1.261.36" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SIGNER-CERTIFICATE" Name="urn:oid:1.2.40.0.10.2.1.1.261.66" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.104" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-E-ID-TOKEN" Name="urn:oid:1.2.40.0.10.2.1.1.261.39" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-LINK" Name="urn:oid:1.2.40.0.10.2.1.1.261.38" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-STATUS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.109" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ </md:IDPSSODescriptor>
+</md:EntityDescriptor>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_notvalid.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_notvalid.xml
new file mode 100644
index 00000000..86665a9c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_notvalid.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_1a48ec3432f2f3ba6222724a5b06f873" entityID="https://localEntity" validUntil="2045-02-06T08:47:26.211Z">
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:SignedInfo>
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
+ <ds:Reference URI="#_1a48ec3432f2f3ba6222724a5b06f873">
+ <ds:Transforms>
+ <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
+ <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
+ </ds:Transforms>
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
+ <ds:DigestValue>e6DiHa9scuvxJFBUipZ8PQcD4kAkmSIDZgZV+0/7glg=</ds:DigestValue>
+ </ds:Reference>
+ </ds:SignedInfo>
+ <ds:SignatureValue>Czr2EwhK/0ZUZ5blQpJfNoOFEscLlxlmHPjmOJUIsxlB2pUn+ApULrjVpR1ViUcGZ0PVi2KChSNoSn09YKjtgPFBiSY010VYdaACgqluxUt6AwESObaqcyHVBzMDUr/g6jkRFEJV4vqnZQQDdDfTH4MXNqunORegS1saBHw4nJSOX4YfoVmIuT5uOlRrxvoG7srnGShvF7DmvIHBUBF5Tq9FyeSgwTM8udxl8Yl9FB2pREuR83CcbgjPrYKtzi6TiSfrWkcD0L5BvmMxN/BdaGDAorxYOnk41sWDJjrkY8C2SC1YDy6XT4SM06uFwstUrRn8QPg1hfbLHAyQNoaR8ecgapk5DkxmbATMcGY+SM4yQWkBdYT7GtufNmF8sIVaL6JOOTKAE9qqX/1N6N4zOPmm8rpIqVEQZtQ5usN/ubxbxLxUoTdDeo8RwkktW6zQ3Zv9+Iyf0DASYmK1IxN+fMw/qyeVy9r6o15ITHTqTmT/7BidKZ58m4HxIK52E3DU</ds:SignatureValue>
+ <ds:KeyInfo>
+ <ds:X509Data>
+ <ds:X509Certificate>MIIEFTCCAn0CBFtIcMwwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+SVoxMTAvBgNVBAMMKG5hdGlvbmFsIGNlbnRyYWwgZUlEQVMgbm9kZSAtIHRlc3RzeXN0ZW0wHhcN
+MTgwNzEzMDkyODQ0WhcNMjEwNDA3MDkyODQ0WjBPMQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJ
+WjExMC8GA1UEAwwobmF0aW9uYWwgY2VudHJhbCBlSURBUyBub2RlIC0gdGVzdHN5c3RlbTCCAaIw
+DQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBALK4bdf5OremKkj0+xCjU0eN7RUd1A2VqoGnvFUs
+t7xjLQ1PspHiDf9Pm2cwOIJabSnuZ01hYAGz9X+lU3Z3fwhVc+tEsuzsaAml/LPw3i3+ppoSTJDM
+iDvhCoUKTzJ8HBQj2gTvXNlqPljyGneuCJ+uBMr7Okq/XjMTJj2xzvutrHS3qIO+/w+OkY967QLV
+RXh0bdFqYqnyAnlYcWJPIwjanOJtE2difPYqers7ZW1F9djP0+IZRoyaook5rpLYvuQTHuvulgIE
+3zGlTuOx3sk8zMyInMndqi75Eh+ROnndSZE7gN3u5CfFpuO5pxFa2jj1h/AnR39Tg8/sU+Se+AwH
+rNvee3IWhxk5LkelYevfeCQos7Dv2ASE9XMCCs7FoE47w8fDalECh09MFKDiotpklbq3OrPg9NQ4
+D//k0GXlW5jYUKP/Wq/+suAI6mfhSnNkjOGMcMlzNTmwxGD/v7Py6OVA+YcJQsqYalLrqbvT2tXV
+mYBVO3oqafg+kfevfwIDAQABMA0GCSqGSIb3DQEBCwUAA4IBgQCioM8k0EEBFtY4QyxOYFufPDLw
+9PNPct01ltnTVjNEEt/L6/8zYlDwrDeULEkJS7mV9zV3657NPQ5IPT/Ib93Uk/RPi0iOA2CGWIMa
+DQIODN3BUYr+zPUqhbKS6OWOhTgV8GiRCUbxrT1uc1AiacP63pga3TJX8k8WFnfW+Dqm2MfWWlxr
+4X2YB9VUW55X5sBNy035jYhEpp8NCK/fTAhoEQNCG+rm3T9qhT6YyOnbW2kXU747+ZwXT2qA5o4y
+a/9+6dDc+LUlHCEm4X7c6bcGvCfNezB4k56FzbAJlOLf2VDGzvEQBf0hsB+kElezm1VBlEkZ4Mjz
+pBpHBMoR21SwTpcvrbR4ig0Bk1eEHNK44sw0F32K5yww3gnJftMIZtPhjhk8UdG2/H6vs9s/to2V
+j4V6wN4o79RTULoQ8RjL6MPWEWzwOvOZXJAo2XJEECvDivSjIJvNC0lfrK3zI3LH3c1JR6q2EfeC
+Z50wTJMFoChSaqunJQXKo81g6wNhP00=</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </ds:Signature>
+ <md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDMzCCAhsCBFtIcPowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+SVoxJDAiBgNVBAsMG2NlbnRyYWwgbmF0aW9uYWwgZUlEQVMgbm9kZTEaMBgGA1UEAwwRQXNzZXJ0
+aW9uIHNpZ25pbmcwHhcNMTgwNzEzMDkyOTMwWhcNMjEwNDA3MDkyOTMwWjBeMQswCQYDVQQGEwJB
+VDENMAsGA1UECgwERUdJWjEkMCIGA1UECwwbY2VudHJhbCBuYXRpb25hbCBlSURBUyBub2RlMRow
+GAYDVQQDDBFBc3NlcnRpb24gc2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJ5zDYxMPRcz6AHaev1tS46Tq8sdgbGFM56uxk6c7LmMDC+HTzNX/3Q5S/YwSzgL3ue5TSw1ltOf
+yMXMZ6D0+buWWcsxGEkQ8M3adKRFdQrEwafzwTA7pguq5WiHOkr4qwR7dLMome9z5cc3LRcwdOPP
+gq7ahb5jM3hRqc5xkMWIuvql0NFXPzlHrjDLwy5nIWPOhL5abhVt4YsXbpbjXxFSGkDEAZ32K3EU
+LNBr9FSUmJfbrVX9AU2T+BKIwiqXP8e/3UJHgPHQ0l5ljWp5P6u5+tvM21o8sUM4eArRa8BkdRsP
+C92GVuASSUz2ZJ3JhAK1cSM8bnvaZVLQtTvPMAcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAp7z
+TubWXW6YMpyLSvWBdZiiQ3X66XpSZLZJDIAkoPzEY0DSBp8I5YASIx4JTR5XJt+6MI9acgNIAYW8
+DhtRwUMVaRWEtuCrfKhGLWm5KSxnhPcD3lzRZhY4ZcA7dUlirjf6hnqo2TFEmJ9fkM+rxwy1GkDD
+7j2YDSOFmSq9/Ud9/IbIfSnRu/lO0dh7iRrmg3y0Y/+plPxYmp4AHqehP11OchTz2FGGHVsSC2Vs
+IVBQI6ANZYyOlicgfEEFHA06jP9OnA0EwEFr2P+di9caZg8vfibyzxMGeuf6CY0c0eLHokBCn2W8
+vkzvWiER3pozRvCmXFjCVZfRjUunaJf2ow==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vidp.gv.at/ms_connector/pvp/post"/>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vidp.gv.at/ms_connector/pvp/redirect"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CCS-URL" Name="urn:oid:1.2.40.0.10.2.1.1.261.64" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN" Name="urn:oid:1.2.40.0.10.2.1.1.261.36" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SIGNER-CERTIFICATE" Name="urn:oid:1.2.40.0.10.2.1.1.261.66" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.104" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-E-ID-TOKEN" Name="urn:oid:1.2.40.0.10.2.1.1.261.39" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-LINK" Name="urn:oid:1.2.40.0.10.2.1.1.261.38" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-STATUS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.109" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ </md:IDPSSODescriptor>
+</md:EntityDescriptor>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_valid_wrong_alg.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_valid_wrong_alg.xml
new file mode 100644
index 00000000..2187aa5f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/idp_metadata_sig_valid_wrong_alg.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_1a48ec3432f2f3ba6222724a5b06f873" entityID="https://vidp.gv.at/ms_connector/pvp/metadata" validUntil="2045-02-06T08:47:26.211Z">
+ <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" Id="signature-1-1"><dsig:SignedInfo><dsig:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><dsig:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><dsig:Reference Id="reference-1-1" URI=""><dsig:Transforms><dsig:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><dsig:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></dsig:Transforms><dsig:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><dsig:DigestValue>dhkHkgZ1OOHG0nYWiRXrpZhIAx41103CG6DKDbBra8o=</dsig:DigestValue></dsig:Reference></dsig:SignedInfo><dsig:SignatureValue>AkxnEu9g3QgYC0JwuJXMYFrnNn6UMtrbtVn5YzkKBXxyYqZui4pEi/TRSM9r7Gt+
+4UqHrJVkYMbbuoO2kpiDnluPG+vHYzYFvF0agQ+gfGjpVQNRORN0FU7JPX+KPjpr
+sMU8wVZITSPU0GBBccvzrcpq7DQt0VbV5U7/Vq3KM/fop4ytAkUbTltUj/XxvAd1
+XdhB/zyeTTR2dafJ6Z2CKyM7MMmxwXYD1NrPGciPvTJ9ASHAT0lJM1dxrRNbeAja
+KTrNVj78MhSluRm5g7N1pMZzgMSpqN66AUg8pkSTvcRaNImPzYDcMQzHl2Tr362M
+RudjSgaEljK98TbBdgLFTg==</dsig:SignatureValue><dsig:KeyInfo><dsig:X509Data><dsig:X509Certificate>MIIEqzCCBBSgAwIBAgIHANux81oNezANBgkqhkiG9w0BAQUFADBAMSIwIAYDVQQD
+ExlJQUlLIFRlc3QgSW50ZXJtZWRpYXRlIENBMQ0wCwYDVQQKEwRJQUlLMQswCQYD
+VQQGEwJBVDAeFw0xMzA5MjcwNTMzMzdaFw0yMzA5MjcwNTMzMzdaMIHkMQswCQYD
+VQQGEwJBVDENMAsGA1UEBxMER3JhejEmMCQGA1UEChMdR3JheiBVbml2ZXJzaXR5
+IG9mIFRlY2hub2xvZ3kxSDBGBgNVBAsTP0luc3RpdHV0ZSBmb3IgQXBwbGllZCBJ
+bmZvcm1hdGlvbiBQcm9jZXNzaW5nIGFuZCBDb21tdW5pY2F0aW9uczEUMBIGA1UE
+BBMLTU9BLVNTIFRlc3QxGDAWBgNVBCoTD0VHSVogVGVzdHBvcnRhbDEkMCIGA1UE
+AxMbRUdJWiBUZXN0cG9ydGFsIE1PQS1TUyBUZXN0MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAuDjOyf+mY+oQL2FQzzuaiC8C23vVKbq/n2Zi7BqSibZH
+mtqMJfmj4pT+hWSNHvVvWsaxFcx4KeNqdCMzwnw1r4P3Sf+2o5uFku5KHEMLMokR
+yYQG9VqY/KkB94ye7Pv6zT8gvKqxGFg96UamECep4swPaSZrA8AOER5WAtyGDzKI
+Tz+a5zfFaTXDoba7f98PCWR96yKiFjVOhzp38WVz4VJgz+b8ZSY7Xsv5Kn7DXjOL
+STX4MevFLki3rFPup3+4vGToaMBW3PEj67HXBdqR855Le6+E6rVxORqsXqlVwhsI
+6nuS0CO2LWYmBNR1IB0mXteeYH/HfxvuZc+7yDjdPQIDAQABo4IBhDCCAYAwDgYD
+VR0PAQH/BAQDAgbAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFEmcH6VY4BG1EAGB
+TLoNR9vH/g6yMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jYS5pYWlrLnR1Z3Jh
+ei5hdC9jYXBzby9jcmxzL0lBSUtUZXN0X0ludGVybWVkaWF0ZUNBLmNybDCBqgYI
+KwYBBQUHAQEEgZ0wgZowSgYIKwYBBQUHMAGGPmh0dHA6Ly9jYS5pYWlrLnR1Z3Jh
+ei5hdC9jYXBzby9PQ1NQP2NhPUlBSUtUZXN0X0ludGVybWVkaWF0ZUNBMEwGCCsG
+AQUFBzAChkBodHRwOi8vY2EuaWFpay50dWdyYXouYXQvY2Fwc28vY2VydHMvSUFJ
+S1Rlc3RfSW50ZXJtZWRpYXRlQ0EuY2VyMCEGA1UdEQQaMBiBFnRob21hcy5sZW56
+QGVnaXouZ3YuYXQwHwYDVR0jBBgwFoAUaKJeEdreL4BrRES/jfplNoEkp28wDQYJ
+KoZIhvcNAQEFBQADgYEAlFGjUxXLs7SAT8NtXSrv2WrjlklaRnHTFHLQwyVo8JWb
+gvRkHHDUv2o8ofXUY2R2WJ38dxeDoccgbXrJb/Qhi8IY7YhCwv/TuIZDisyAqo8W
+ORKSip/6HWlGCSR/Vgoet1GtCmF0FoUxFUIGSAuQ2yyt4fIzt5GJrU1X5ujjI1w=</dsig:X509Certificate></dsig:X509Data></dsig:KeyInfo></dsig:Signature><md:IDPSSODescriptor WantAuthnRequestsSigned="true" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDMzCCAhsCBFtIcPowDQYJKoZIhvcNAQELBQAwXjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+SVoxJDAiBgNVBAsMG2NlbnRyYWwgbmF0aW9uYWwgZUlEQVMgbm9kZTEaMBgGA1UEAwwRQXNzZXJ0
+aW9uIHNpZ25pbmcwHhcNMTgwNzEzMDkyOTMwWhcNMjEwNDA3MDkyOTMwWjBeMQswCQYDVQQGEwJB
+VDENMAsGA1UECgwERUdJWjEkMCIGA1UECwwbY2VudHJhbCBuYXRpb25hbCBlSURBUyBub2RlMRow
+GAYDVQQDDBFBc3NlcnRpb24gc2lnbmluZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AJ5zDYxMPRcz6AHaev1tS46Tq8sdgbGFM56uxk6c7LmMDC+HTzNX/3Q5S/YwSzgL3ue5TSw1ltOf
+yMXMZ6D0+buWWcsxGEkQ8M3adKRFdQrEwafzwTA7pguq5WiHOkr4qwR7dLMome9z5cc3LRcwdOPP
+gq7ahb5jM3hRqc5xkMWIuvql0NFXPzlHrjDLwy5nIWPOhL5abhVt4YsXbpbjXxFSGkDEAZ32K3EU
+LNBr9FSUmJfbrVX9AU2T+BKIwiqXP8e/3UJHgPHQ0l5ljWp5P6u5+tvM21o8sUM4eArRa8BkdRsP
+C92GVuASSUz2ZJ3JhAK1cSM8bnvaZVLQtTvPMAcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAAp7z
+TubWXW6YMpyLSvWBdZiiQ3X66XpSZLZJDIAkoPzEY0DSBp8I5YASIx4JTR5XJt+6MI9acgNIAYW8
+DhtRwUMVaRWEtuCrfKhGLWm5KSxnhPcD3lzRZhY4ZcA7dUlirjf6hnqo2TFEmJ9fkM+rxwy1GkDD
+7j2YDSOFmSq9/Ud9/IbIfSnRu/lO0dh7iRrmg3y0Y/+plPxYmp4AHqehP11OchTz2FGGHVsSC2Vs
+IVBQI6ANZYyOlicgfEEFHA06jP9OnA0EwEFr2P+di9caZg8vfibyzxMGeuf6CY0c0eLHokBCn2W8
+vkzvWiER3pozRvCmXFjCVZfRjUunaJf2ow==</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</md:NameIDFormat>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</md:NameIDFormat>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://vidp.gv.at/ms_connector/pvp/post"/>
+ <md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://vidp.gv.at/ms_connector/pvp/redirect"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CCS-URL" Name="urn:oid:1.2.40.0.10.2.1.1.261.64" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN" Name="urn:oid:1.2.40.0.10.2.1.1.261.36" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SIGNER-CERTIFICATE" Name="urn:oid:1.2.40.0.10.2.1.1.261.66" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-SOURCE-PIN-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.104" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-E-ID-TOKEN" Name="urn:oid:1.2.40.0.10.2.1.1.261.39" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-LINK" Name="urn:oid:1.2.40.0.10.2.1.1.261.38" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ <saml2:Attribute xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" FriendlyName="EID-IDENTITY-STATUS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.109" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"/>
+ </md:IDPSSODescriptor>
+</md:EntityDescriptor> \ No newline at end of file
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/pvp_postbinding_template.html b/modules/authmodule-eIDAS-v2/src/test/resources/data/pvp_postbinding_template.html
new file mode 100644
index 00000000..68a797e6
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/pvp_postbinding_template.html
@@ -0,0 +1,3 @@
+#if($RelayState)RelayState=${RelayState}#end
+#if($SAMLRequest)SAMLRequest=${SAMLRequest}#end
+#if($SAMLResponse)SAMLResponse=${SAMLResponse}#end
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/sp_metadata_junit.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/sp_metadata_junit.xml
new file mode 100644
index 00000000..0e25cce4
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/sp_metadata_junit.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" ID="_1a48ec3432f2f3ba6222724a5b06f873" entityID="https://localhost/authhandler/sp/idaustria/metadata" validUntil="2045-02-06T08:47:26.211Z">
+ <md:SPSSODescriptor AuthnRequestsSigned="true" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
+ <md:KeyDescriptor use="signing">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIC+DCCAeCgAwIBAgIEXh7TbTANBgkqhkiG9w0BAQsFADA+MQswCQYDVQQGEwJBVDENMAsGA1UE
+ CgwERUdJWjEOMAwGA1UECwwFalVuaXQxEDAOBgNVBAMMB3NpZ25pbmcwHhcNMjAwMTE1MDg1NTA5
+ WhcNMjkwMTE0MDg1NTA5WjA+MQswCQYDVQQGEwJBVDENMAsGA1UECgwERUdJWjEOMAwGA1UECwwF
+ alVuaXQxEDAOBgNVBAMMB3NpZ25pbmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCU
+ SiRjnDvPafZfhJ+L1wM86FKJX3VIAV/8TD9qJ6HOBkn5WwYfpheyCfRb6XVDyIGpO8qnMWAgC17N
+ gbmhzj8d8HXNQ2l3uppMv24oUTfXyYhQfZWAghx0sTlRIx/ZmlnduJilx2S53Sa7ruJwlQcBFXj9
+ h9B8dtyegc86Sx6D9BumP1xU7+mEBk8Gv9rR5Khg0Y7qGfZWB0t4aikgaupWveVwiGifOOSfR8cz
+ qIg9qUpMYfZiTEBTSRmN6sPiNWhd4J0GyAI9Rn5C9jz/sSlQrxpN+4DXzsqSU5F6gzq3yRux6wyO
+ zDlt2birf21VPQ9HIy4YCjZXwgDWG7AO821pAgMBAAEwDQYJKoZIhvcNAQELBQADggEBADnwdaxU
+ tQU6SIpYwIb2c0ljTmQi7ryUcUpNHtK0M0E5Mw5Ex8zwrWbNQZ2sUyc4r07M66iOIqHsYZUQlRYv
+ VKHifDpAr8TCgD7iGGdB3By8Ou0RaNW+03w1fwmi98CufbHCGvpv0o2KxlejoHZminNdQ79ibN+0
+ 1nhocezJQATEQlnwHLiQSjilXpZeLYDk8HbrcUXNRxezN4ChdH+uU54vf+Uxqcj9QHcmBe1+BM8E
+ XfqS1DbTwZl+NTCnh5OYl8fvIFSOHMBxwFrI4pyY0faxg9UcrCogn/oQ+mV1gnVUDaDhvvEnVGZQ
+ trlt7heVId2BeNellVgsrcmdW8j4U9U=</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:KeyDescriptor use="encryption">
+ <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
+ <ds:X509Data>
+ <ds:X509Certificate>MIIDKzCCAhMCBFrxKO4wDQYJKoZIhvcNAQELBQAwWjELMAkGA1UEBhMCQVQxDTALBgNVBAoMBEVH
+ SVoxGDAWBgNVBAsMD2RlbW8uZWdpei5ndi5hdDEiMCAGA1UEAwwZTU9BLUlEIElEUCAoVGVzdC1W
+ ZXJzaW9uKTAeFw0xODA1MDgwNDM0NTRaFw0yMTAxMzEwNDM0NTRaMFoxCzAJBgNVBAYTAkFUMQ0w
+ CwYDVQQKDARFR0laMRgwFgYDVQQLDA9kZW1vLmVnaXouZ3YuYXQxIjAgBgNVBAMMGU1PQS1JRCBJ
+ RFAgKFRlc3QtVmVyc2lvbikwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCaFnqoaYoq
+ UptenemC6FiVDg5F2hEjpjix8+ow6/6QhUl2cPOS0uwZHaIvwT/RVbJ9CPdil6+11qaCPfZ+FoY+
+ M+ke7TRd2RS1DqFbe1KC0imEnwemyLQrYe5Pm7DNcaY/kHTTq+k0eeGbYH0U/Iopyi0VuN5OWl4F
+ Vg45pf7knhXkaimItdjnCXnKcYM91mmltCf6TDgUrz7US7PmgvinnhfBgdITAT4GRr4ehliT+/jt
+ 1OzHEyWRHanBGIpXNeZNqxgnpnGtaDh4JZuYR8qfH+GRK6dtW2ziej6rGIiUElGVCkXsohgxMNzq
+ nWeD9JT8+yyp1XZlyQf+IxhhESQLAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAIFejAFQepaEl/kC
+ VLvidMR+MXq5LCGHthUiI6eDTQZ+H7lZdHlj547XwEdX15b6Md3h7eSJ4hwlfV4go/0FaoLPzvVq
+ itwtYY5htywB3B6ZV34Eyi6C59Gl34XrV8CWxH4KKwLsVAjAy+/p/Xh0q2pzSBkeOChzBMBkjmyc
+ 2Ue4MEKdL9guzp6+Yc/HL/phHAKYapkVyFwvsdqWOgyRzxAHINko8ExImMMB3xB5a52kfqLcui5O
+ fzEhjwLFJaGBMmFCmFGGOUwtIvl/6ZQ2LLzOE9+giVK9WsIgH11Pu+ejPFAbXf8cf4oWhbAfTkiy
+ 4jpXrp77JXFRSDWddb0yePc=</ds:X509Certificate>
+ </ds:X509Data>
+ </ds:KeyInfo>
+ </md:KeyDescriptor>
+ <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
+ <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://demo.egiz.gv.at/demoportal_moaid-2.0/sp/eidas/post" index="0" isDefault="true"/>
+ <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" Location="https://demo.egiz.gv.at/demoportal_moaid-2.0/sp/eidas/redirect" index="1"/>
+ <md:AttributeConsumingService index="0" isDefault="true">
+ <md:ServiceName xml:lang="en">Default Service</md:ServiceName>
+ <md:RequestedAttribute FriendlyName="BPK" Name="urn:oid:1.2.40.0.10.2.1.1.149" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="PRINCIPAL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.20" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="BIRTHDATE" Name="urn:oid:1.2.40.0.10.2.1.1.55" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="PVP-VERSION" Name="urn:oid:1.2.40.0.10.2.1.1.261.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="EID-ISSUING-NATION" Name="urn:oid:1.2.40.0.10.2.1.1.261.32" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="MANDATOR-LEGAL-PERSON-SOURCE-PIN-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.76" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="MANDATOR-LEGAL-PERSON-FULL-NAME" Name="urn:oid:1.2.40.0.10.2.1.1.261.84" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="MANDATE-TYPE" Name="urn:oid:1.2.40.0.10.2.1.1.261.68" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="MANDATOR-LEGAL-PERSON-SOURCE-PIN" Name="urn:oid:1.2.40.0.10.2.1.1.261.100" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="GIVEN-NAME" Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="EID-SECTOR-FOR-IDENTIFIER" Name="urn:oid:1.2.40.0.10.2.1.1.261.34" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ <md:RequestedAttribute FriendlyName="MANDATE-TYPE-OID" Name="urn:oid:1.2.40.0.10.2.1.1.261.106" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="EID-IDENTITY-LINK" Name="urn:oid:1.2.40.0.10.2.1.1.261.38" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="false"/>
+ <md:RequestedAttribute FriendlyName="EID-CITIZEN-QAA-EIDAS-LEVEL" Name="urn:oid:1.2.40.0.10.2.1.1.261.108" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri" isRequired="true"/>
+ </md:AttributeConsumingService>
+ </md:SPSSODescriptor>
+</md:EntityDescriptor>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/empty_zmr_result.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/empty_zmr_result.xml
new file mode 100644
index 00000000..a968fabc
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/empty_zmr_result.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person nicht gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>0</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/no_bpk_zp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/no_bpk_zp.xml
new file mode 100644
index 00000000..8104573e
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/no_bpk_zp.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+GH</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>aabbcc_should_not_be_included_for_DE</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp.xml
new file mode 100644
index 00000000..3d63472f
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp.xml
@@ -0,0 +1,290 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>aabbcc_should_not_be_included_for_DE</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_historicIncluded.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_historicIncluded.xml
new file mode 100644
index 00000000..b8a6fcd0
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_historicIncluded.xml
@@ -0,0 +1,389 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000080</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>9/MtsPZgBHQMBpQOD6aOY2TUqcY=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXŐzgür</Vorname>
+ <Familienname>XXXTüzekçi</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1983-06-04</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>aabbcc_should_not_be_included_for_DE</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+
+<zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-10-21T13:07:39.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000811</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000648035760</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXŐzgür</Vorname>
+ <Familienname>XXXTüzekçi</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>1983-06-04</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>TUR</ISOCode3>
+ <StaatsnameDE>Türkei</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000841</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:Reisedokument>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000855</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:DokumentArt>FREMDEROA</base:DokumentArt>
+ </zmr:Reisedokument>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1867900000000716</base:EntityID>
+ <base:LetzteAenderung>2021-10-21T13:07:38.065</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-10-21T13:07:38.065</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_first</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne.xml
new file mode 100644
index 00000000..3259d411
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne.xml
@@ -0,0 +1,488 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>aabbcc_should_not_be_included_for_DE</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-10-21T13:07:39.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000811</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000648035760</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>9/MtsPZgBHQMBpQOD6aOY2TUqcY=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXŐzgür</Vorname>
+ <Familienname>XXXTüzekçi</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>1983-06-04</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>TUR</ISOCode3>
+ <StaatsnameDE>Türkei</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000841</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:Reisedokument>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000855</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:DokumentArt>FREMDEROA</base:DokumentArt>
+ </zmr:Reisedokument>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1867900000000716</base:EntityID>
+ <base:LetzteAenderung>2021-10-21T13:07:38.065</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-10-21T13:07:38.065</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_first</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1868500000000597</base:EntityID>
+ <base:LetzteAenderung>2021-10-21T13:07:39.000</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-10-21T13:07:39.000</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_second</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453900000006913</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HSX11XWWX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:45:52.563</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453900000006933</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:45:52.563</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne_2.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne_2.xml
new file mode 100644
index 00000000..ba4ad172
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/search_with_personalId_only_resp_moreThanOne_2.xml
@@ -0,0 +1,465 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000080</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>2</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>9/MtsPZgBHQMBpQOD6aOY2TUqcY=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXŐzgür</Vorname>
+ <Familienname>XXXTüzekçi</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1983-06-04</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>aabbcc_should_not_be_included_for_DE</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit_second_one</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-10-21T13:07:39.000</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000811</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000648035760</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXŐzgür</Vorname>
+ <Familienname>XXXTüzekçi</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>weiblich</Geschlecht>
+ <Geburtsdatum>1983-06-04</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>TUR</ISOCode3>
+ <StaatsnameDE>Türkei</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000841</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:Reisedokument>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44454000000000855</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>REISEDOK_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Reisedokument anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:DokumentArt>FREMDEROA</base:DokumentArt>
+ </zmr:Reisedokument>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1867900000000716</base:EntityID>
+ <base:LetzteAenderung>2021-10-21T13:07:38.065</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-10-21T13:07:38.065</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>EE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYSvKZasdfsafsaf4CDVzNT4E7cjkU4Vq_first</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453900000006913</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HSX11XWWX</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:45:52.563</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453900000006933</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:45:52.563</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:45:52.563</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:45:52.563</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-2_search_with_mds_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-2_search_with_mds_resp.xml
new file mode 100644
index 00000000..36d8516c
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-2_search_with_mds_resp.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000081</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:38.905</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877200000000125</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching with MDS only</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </PersonenName>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml
new file mode 100644
index 00000000..a8b708dd
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-4_kitt_get_latest_version_resp.xml
@@ -0,0 +1,185 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000081</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.330</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000133</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>KITT get-latest-version</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </PersonenName>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-6_kitt_update_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-6_kitt_update_resp.xml
new file mode 100644
index 00000000..0f8e8dad
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-6_kitt_update_resp.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000082</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.695</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877200000000131</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAendernResponse>
+ <base:Message>
+ <base:Number>4</base:Number>
+ <base:Text>Personenänderung erfolgreich durchgeführt.</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>PERS_AENDERN</base:BeginnCode>
+ <base:BeginnText>Person ändern</base:BeginnText>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:PersonAendernResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml
new file mode 100644
index 00000000..f21c3698
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml
@@ -0,0 +1,336 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>ES</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000003</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>Hintergigritzpotschn</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Brandenburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXClaus - Maria</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/DateOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>1994-12-31</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml
new file mode 100644
index 00000000..6551cdd3
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>367100000000079</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:40.985</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000139</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>Searching PersonIdentifier</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson/>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000001</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/BirthName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Heuburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-10_kitt_update_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-10_kitt_update_resp.xml
new file mode 100644
index 00000000..2be8a419
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-10_kitt_update_resp.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000082</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.695</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877200000000131</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAendernResponse>
+ <base:Message>
+ <base:Number>4</base:Number>
+ <base:Text>Personenänderung erfolgreich durchgeführt.</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>PERS_AENDERN</base:BeginnCode>
+ <base:BeginnText>Person ändern</base:BeginnText>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:PersonAendernResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml
new file mode 100644
index 00000000..01dac890
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-4_kitt_get_latest_version_resp.xml
@@ -0,0 +1,208 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000081</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.330</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000133</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>KITT get-latest-version</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </PersonenName>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-6_kitt_update_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-6_kitt_update_resp.xml
new file mode 100644
index 00000000..2be8a419
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-6_kitt_update_resp.xml
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000082</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.695</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877200000000131</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonAendernResponse>
+ <base:Message>
+ <base:Number>4</base:Number>
+ <base:Text>Personenänderung erfolgreich durchgeführt.</base:Text>
+ </base:Message>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>PERS_AENDERN</base:BeginnCode>
+ <base:BeginnText>Person ändern</base:BeginnText>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>melch@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:PersonAendernResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml
new file mode 100644
index 00000000..656164f2
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml
@@ -0,0 +1,300 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <base:Response xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://reference.e-government.gv.at/namespace/persondata/de/20040201#" xmlns:base="http://bmi.gv.at/namespace/zmr-su/base/20040201#" xmlns:smi="http://bmi.gv.at/namespace/zmr-su/smi/20060901#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:zmr="http://bmi.gv.at/namespace/zmr-su/zmr/20040201#" xmlns:ns10="http://bmi.gv.at/namespace/zmr-su/ernp/20050901#" xmlns:ns11="http://bmi.gv.at/namespace/zmr-su/gis/20070725#" xmlns:ns12="http://egov.gv.at/pvp1.xsd" xmlns:ns13="http://schemas.xmlsoap.org/ws/2002/04/secext" xmlns:ns8="http://bmi.gv.at/namespace/zmr-su/lmr/20050401#" xmlns:ns9="http://www.w3.org/2000/09/xmldsig#">
+ <base:WorkflowInfoServer>
+ <base:ProzessName>GP_EIDAS</base:ProzessName>
+ <base:ProzessInstanzID>366200000000081</base:ProzessInstanzID>
+ <base:SequenzID>0</base:SequenzID>
+ </base:WorkflowInfoServer>
+ <base:ServerInfo>
+ <base:GeneriertVon>ZMR-Server Version: 5.9.0.0-SNAPSHOT</base:GeneriertVon>
+ <base:GeneriertAm>2021-11-12T08:24:39.330</base:GeneriertAm>
+ <base:ServerTransaktionNr>1877300000000133</base:ServerTransaktionNr>
+ </base:ServerInfo>
+ <zmr:PersonSuchenResponse>
+ <zmr:PersonensucheAnfrage>
+ <zmr:PersonensucheInfo>
+ <base:Bezugsfeld>KITT get-latest-version</base:Bezugsfeld>
+ <zmr:Suchkriterien>
+ <base:InclusivHistorie>true</base:InclusivHistorie>
+ <base:Formalisiert>false</base:Formalisiert>
+ </zmr:Suchkriterien>
+ <zmr:Ergebniskriterien>
+ <base:InclusivHistorie>false</base:InclusivHistorie>
+ </zmr:Ergebniskriterien>
+ <base:AnzahlSaetze>10</base:AnzahlSaetze>
+ </zmr:PersonensucheInfo>
+ <NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </PersonenName>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ </NatuerlichePerson>
+ </zmr:PersonensucheAnfrage>
+ <base:Message>
+ <base:Number>5020</base:Number>
+ <base:Text>Person gefunden.</base:Text>
+ </base:Message>
+ <zmr:Personensuchergebnis>
+ <base:GefundeneSaetze>1</base:GefundeneSaetze>
+ <zmr:GefundeneSaetzeERnP>0</zmr:GefundeneSaetzeERnP>
+ <base:SaetzeVon>0</base:SaetzeVon>
+ <base:SaetzeBis>1</base:SaetzeBis>
+ <zmr:PersonErgebnisSatz>
+ <zmr:Personendaten>
+ <zmr:PersonErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000697</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>SONSTIGES</base:BeginnCode>
+ <base:BeginnText>Sonstiges</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <base:ZMRZahl>000430320173</base:ZMRZahl>
+ <zmr:NatuerlichePerson>
+ <Identification>
+ <Value>UgeknNsc26lVuB7U/uYGVmWtnnA=</Value>
+ <Type>urn:publicid:gv.at:cdid+ZP</Type>
+ </Identification>
+ <zmr:PersonenName>
+ <Vorname>XXXClaus - Maria</Vorname>
+ <Familienname>XXXvon Brandenburg</Familienname>
+ </zmr:PersonenName>
+ <Familienstand>unbekannt</Familienstand>
+ <Geschlecht>männlich</Geschlecht>
+ <Geburtsdatum>1994-12-31</Geburtsdatum>
+ <Geburtsort>Wien</Geburtsort>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit
+ <Geburtsbundesland>Wien</Geburtsbundesland>
+ <Geburtsstaat>Österreich</Geburtsstaat>
+ <zmr:Staatsangehoerigkeit>
+ <ISOCode3>AUT</ISOCode3>
+ <StaatsnameDE>Österreich</StaatsnameDE>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453600000000727</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>STAATSANGEH_ANLEGEN</base:BeginnCode>
+ <base:BeginnText>Staatsangehörigkeit anlegen</base:BeginnText>
+ <base:BeginnFreitext>Testerperson</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ </zmr:Staatsangehoerigkeit>
+ </zmr:NatuerlichePerson>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXvon Brandenburg</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>XXXClaus - Maria</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ <zmr:EidasIdentitaet>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>1879000000000005</base:EntityID>
+ <base:LetzteAenderung>2021-11-12T08:24:39.695</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2021-11-12T08:24:39.695</base:Von>
+ <base:BeginnCode>EIDAS_ANLEGEN</base:BeginnCode>
+ <base:BeginnFreitext>KITT for eIDAS Matching</base:BeginnFreitext>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>101179</base:Behoerdenschluessel>
+ </base:Organisation>
+ <base:Benutzer>eidtapp@bmi.gv.at</base:Benutzer>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:EidasArt>http://eidas.europa.eu/attributes/naturalperson/DateOfBirth</zmr:EidasArt>
+ <zmr:Staatscode2>DE</zmr:Staatscode2>
+ <base:AusstellBehoerde/>
+ <zmr:EidasWert>1994-12-31</zmr:EidasWert>
+ <base:AusstellDatum>9999-12-31</base:AusstellDatum>
+ <base:AblaufDatum>9999-12-31</base:AblaufDatum>
+ </zmr:EidasIdentitaet>
+ </zmr:PersonErgebnis>
+ </zmr:Personendaten>
+ <zmr:Meldedaten>
+ <zmr:MeldungErgebnis>
+ <base:ErgebnissatzInfo>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:ErgebnissatzInfo>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005242</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>WSANM</base:BeginnCode>
+ <base:BeginnText>Wohnsitz anmelden</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:Wohnsitz>
+ <zmr:PostAdresse>
+ <Postleitzahl>0088</Postleitzahl>
+ <Gemeinde>Testgemeinde</Gemeinde>
+ <Gemeindekennziffer>09988</Gemeindekennziffer>
+ <Ortschaft>Testort A</Ortschaft>
+ <zmr:Zustelladresse>
+ <Strassenname>Testgasse</Strassenname>
+ <Orientierungsnummer>1a-2b</Orientierungsnummer>
+ <Gebaeude>Stg. 3c-4d</Gebaeude>
+ <Nutzungseinheit>5</Nutzungseinheit>
+ <Wohnsitzqualitaet>H</Wohnsitzqualitaet>
+ <Abgabestelle>false</Abgabestelle>
+ <Nutzungseinheitlaufnummer>0001</Nutzungseinheitlaufnummer>
+ <zmr:AdressRegisterEintrag>
+ <Adresscode>T800001</Adresscode>
+ <Subcode>001</Subcode>
+ <Objektnummer>T800001</Objektnummer>
+ </zmr:AdressRegisterEintrag>
+ </zmr:Zustelladresse>
+ </zmr:PostAdresse>
+ <base:Adressstatus>HST111WWW</base:Adressstatus>
+ <base:Adressschluessel>
+ <base:OKZ>T8001</base:OKZ>
+ <base:SKZ>T80001</base:SKZ>
+ <base:ADRRefkey>T80000000001</base:ADRRefkey>
+ <base:GBRRefkey>T80000000002</base:GBRRefkey>
+ </base:Adressschluessel>
+ <base:HauptIdent>H</base:HauptIdent>
+ <base:Postleitzahlgebiet>Testpostort</base:Postleitzahlgebiet>
+ </zmr:Wohnsitz>
+ <base:GemeldetVon>2020-02-05T13:07:06.311</base:GemeldetVon>
+ <base:PeriodeCode>WSANM</base:PeriodeCode>
+ <base:PeriodeText>Wohnsitz anmelden</base:PeriodeText>
+ <zmr:Auskunftssperre>
+ <base:EntityErgebnisReferenz>
+ <base:Technisch>
+ <base:EntityID>44453500000005262</base:EntityID>
+ <base:LetzteAenderung>2020-02-05T13:07:06.311</base:LetzteAenderung>
+ </base:Technisch>
+ <base:Von>2020-02-05T13:07:06.311</base:Von>
+ <base:BeginnCode>AUSK_SPERRE_SETZ</base:BeginnCode>
+ <base:BeginnText>Auskunftssperre setzen</base:BeginnText>
+ <base:DurchgefuehrtVon>
+ <base:Organisation>
+ <base:Behoerdenschluessel>109091</base:Behoerdenschluessel>
+ </base:Organisation>
+ </base:DurchgefuehrtVon>
+ </base:EntityErgebnisReferenz>
+ <zmr:SperreVon>2020-02-05T13:07:06.311</zmr:SperreVon>
+ <zmr:SperreBis>9999-12-31T23:59:59.000</zmr:SperreBis>
+ <zmr:SperrCode>ASMG</zmr:SperrCode>
+ <zmr:SperrText>Auskunftssperre nach § 18 / 2ff MeldeG</zmr:SperrText>
+ <zmr:SperrFreitext>automatische Auskunftssperre</zmr:SperrFreitext>
+ </zmr:Auskunftssperre>
+ </zmr:MeldungErgebnis>
+ </zmr:Meldedaten>
+ </zmr:PersonErgebnisSatz>
+ </zmr:Personensuchergebnis>
+ </zmr:PersonSuchenResponse>
+ </base:Response>
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/keystore/junit_test.jks b/modules/authmodule-eIDAS-v2/src/test/resources/keystore/junit_test.jks
new file mode 100644
index 00000000..ee6254a9
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/keystore/junit_test.jks
Binary files differ
diff --git a/modules/authmodule-eIDAS-v2/src/test/resources/keystore/pvp.p12 b/modules/authmodule-eIDAS-v2/src/test/resources/keystore/pvp.p12
new file mode 100644
index 00000000..183342f7
--- /dev/null
+++ b/modules/authmodule-eIDAS-v2/src/test/resources/keystore/pvp.p12
Binary files differ
diff --git a/modules/core_common_lib/pom.xml b/modules/core_common_lib/pom.xml
index b5a95005..8b06a9ee 100644
--- a/modules/core_common_lib/pom.xml
+++ b/modules/core_common_lib/pom.xml
@@ -7,7 +7,7 @@
<parent>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>modules</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<artifactId>core_common_lib</artifactId>
<name>ms_specific_common_lib</name>
@@ -27,6 +27,14 @@
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
+ <groupId>org.thymeleaf</groupId>
+ <artifactId>thymeleaf-spring5</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate.validator</groupId>
+ <artifactId>hibernate-validator</artifactId>
+ </dependency>
+ <dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
@@ -36,6 +44,8 @@
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
+
+
<!-- jUnit test dependencies -->
<dependency>
@@ -61,6 +71,14 @@
<type>test-jar</type>
</dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_sp</artifactId>
+ </dependency>
</dependencies>
<build>
diff --git a/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/MsEidasNodeConstants.java b/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/MsEidasNodeConstants.java
index 8580950f..be5d7c7d 100644
--- a/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/MsEidasNodeConstants.java
+++ b/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/MsEidasNodeConstants.java
@@ -51,7 +51,13 @@ public class MsEidasNodeConstants {
public static final String PROP_CONFIG_WEBCONTENT_TEMPLATES_PATH = "webcontent.templates";
public static final String PROP_CONFIG_WEBCONTENT_TEMPLATES_CCSELECTION = "webcontent.templates.countryselection";
-
+ public static final String PROP_CONFIG_WEBCONTENT_TEMPLATES_OTHER_LOGIN_METHOD_SELECTION = "webcontent.templates"
+ + ".otherLoginMethodselection";
+ public static final String PROP_CONFIG_WEBCONTENT_TEMPLATES_RESIDENCY = "webcontent.templates"
+ + ".residency";
+ public static final String PROP_CONFIG_WEBCONTENT_TEMPLATES_OTHER_CONTACTS_WITH_AUSTRIAN_EGOV =
+ "webcontent.templates.otherContactsWithAustrianEgov";
+
public static final String PROP_CONFIG_MONITORING_EIDASNODE_METADATAURL =
"monitoring.eIDASNode.metadata.url";
@@ -84,7 +90,7 @@ public class MsEidasNodeConstants {
PROP_CONFIG_PVP2_PREFIX + "metadata.organisation.friendyname";
public static final String CONFIG_PROPS_METADATA_ORGANISATION_URL =
PROP_CONFIG_PVP2_PREFIX + "metadata.organisation.url";
-
+
// TODO: is not implemented yet
public static final String PROP_CONFIG_SP_VALIDATION_DISABLED =
"configuration.sp.disableRegistrationRequirement";
@@ -99,14 +105,14 @@ public class MsEidasNodeConstants {
public static final String PROP_CONFIG_AUTHBLOCK_KEYSTORE_PASSWORD =
"auth.eIDAS.authblock.keystore.password";
public static final String PROP_CONFIG_AUTHBLOCK_KEYSTORE_NAME =
- "auth.eIDAS.authblock.keystore.name";
+ "auth.eIDAS.authblock.keystore.name";
public static final String PROP_CONFIG_AUTHBLOCK_KEY_ALIAS =
"auth.eIDAS.authblock.key.alias";
public static final String PROP_CONFIG_AUTHBLOCK_KEY_PASSWORD =
"auth.eIDAS.authblock.key.password";
-
-
-
+
+
+
public static final String PROP_CONFIG_SP_LIST_PREFIX = "sp";
public static final String PROP_CONFIG_SP_UNIQUEIDENTIFIER = EaafConfigConstants.SERVICE_UNIQUEIDENTIFIER;
@@ -144,7 +150,10 @@ public class MsEidasNodeConstants {
public static final String ENDPOINT_PVP_REDIRECT = "/pvp/redirect";
public static final String ENDPOINT_COUNTRYSELECTION = "/myHomeCountry";
-
+ public static final String ENDPOINT_OTHER_LOGIN_METHOD_SELECTION = "/otherLoginMethod";
+ public static final String ENDPOINT_RESIDENCY_INPUT = "/residency";
+ public static final String ENDPOINT_RESIDENCY_SEARCH = "/residency/search";
+ public static final String ENDPOINT_OTHER_CONTACTS_INPUT = "/otherContacts";
public static final String ENDPOINT_MONITORING_MONITOR = "/monitoring";
public static final String ENDPOINT_MONITORING_VERIFY = "/verify";
@@ -155,7 +164,9 @@ public class MsEidasNodeConstants {
public static final String TEMPLATE_HTML_ERROR = "error_message.html";
public static final String TEMPLATE_HTML_PVP_POSTBINDING = "pvp2_post_binding.html";
public static final String TEMPLATE_HTML_COUNTRYSELECTION = "countrySelection.html";
-
+ public static final String TEMPLATE_HTML_OTHERLOGINMETHODS = "other_login_method.html";
+ public static final String TEMPLATE_HTML_RESIDENCY = "residency.html";
+ public static final String TEMPLATE_HTML_OTHERCONTACTSWITHAUSTRIANEGOV = "otherContactsWithAustrianEgov.html";
// ************ execution context and generic data ************
public static final String REQ_PARAM_SELECTED_COUNTRY = "selectedCountry";
public static final String REQ_PARAM_SELECTED_ENVIRONMENT = "selectedEnvironment";
@@ -227,5 +238,5 @@ public class MsEidasNodeConstants {
private MsEidasNodeConstants() {
//hidden Constructor for class with static values only.
}
-
+
}
diff --git a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/config/StaticResourceConfiguration.java b/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/gui/config/StaticResourceConfiguration.java
index 06377c3f..ea080497 100644
--- a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/config/StaticResourceConfiguration.java
+++ b/modules/core_common_lib/src/main/java/at/asitplus/eidas/specific/core/gui/config/StaticResourceConfiguration.java
@@ -21,7 +21,7 @@
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
-package at.asitplus.eidas.specific.core.config;
+package at.asitplus.eidas.specific.core.gui.config;
import java.net.MalformedURLException;
import java.util.List;
diff --git a/modules/core_common_lib/src/main/resources/common_gui.beans.xml b/modules/core_common_lib/src/main/resources/common_gui.beans.xml
index 969a40f7..c482f8d2 100644
--- a/modules/core_common_lib/src/main/resources/common_gui.beans.xml
+++ b/modules/core_common_lib/src/main/resources/common_gui.beans.xml
@@ -11,6 +11,9 @@
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
+ <bean id="WebResourceConfiguration"
+ class="at.asitplus.eidas.specific.core.gui.config.StaticResourceConfiguration" />
+
<bean id="contentNegotiationManager"
class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"
primary="true">
diff --git a/modules/core_common_webapp/pom.xml b/modules/core_common_webapp/pom.xml
index a7efdf15..a7090761 100644
--- a/modules/core_common_webapp/pom.xml
+++ b/modules/core_common_webapp/pom.xml
@@ -3,7 +3,7 @@
<parent>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>modules</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<artifactId>core_common_webapp</artifactId>
<name>WebApplication commons</name>
diff --git a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/provider/StatusMessageProvider.java b/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/provider/StatusMessageProvider.java
index 39543fe4..416a4cb5 100644
--- a/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/provider/StatusMessageProvider.java
+++ b/modules/core_common_webapp/src/main/java/at/asitplus/eidas/specific/core/provider/StatusMessageProvider.java
@@ -127,13 +127,11 @@ public class StatusMessageProvider implements IStatusMessenger, MessageSourceAwa
@Override
public String getResponseErrorCode(Throwable throwable) {
- String errorCode = IStatusMessenger.CODES_EXTERNAL_ERROR_GENERIC;
if (throwable instanceof EaafException) {
- errorCode = ((EaafException) throwable).getErrorId();
-
+ return ((EaafException) throwable).getErrorId();
+
}
-
- return errorCode;
+ return IStatusMessenger.CODES_INTERNAL_ERROR_GENERIC;
}
diff --git a/modules/core_common_webapp/src/main/resources/specific_eIDAS_core.beans.xml b/modules/core_common_webapp/src/main/resources/specific_eIDAS_core.beans.xml
index f37dc451..ee67d712 100644
--- a/modules/core_common_webapp/src/main/resources/specific_eIDAS_core.beans.xml
+++ b/modules/core_common_webapp/src/main/resources/specific_eIDAS_core.beans.xml
@@ -15,7 +15,7 @@
<import resource="classpath:specific_eIDAS_core_storage.beans.xml"/>
<bean id="WebResourceConfiguration"
- class="at.asitplus.eidas.specific.core.config.StaticResourceConfiguration" />
+ class="at.asitplus.eidas.specific.core.gui.config.StaticResourceConfiguration" />
<bean id="eidasNodeMetadata"
class="at.asitplus.eidas.specific.core.health.EidasNodeMetadataHealthIndicator" />
diff --git a/modules/core_common_webapp/src/test/resources/spring/SpringTest_core.beans.xml b/modules/core_common_webapp/src/test/resources/spring/SpringTest_core.beans.xml
index e66ac987..cc295e91 100644
--- a/modules/core_common_webapp/src/test/resources/spring/SpringTest_core.beans.xml
+++ b/modules/core_common_webapp/src/test/resources/spring/SpringTest_core.beans.xml
@@ -16,7 +16,7 @@
<mvc:default-servlet-handler />
<bean id="WebResourceConfiguration"
- class="at.asitplus.eidas.specific.core.config.StaticResourceConfiguration" />
+ class="at.asitplus.eidas.specific.core.gui.config.StaticResourceConfiguration" />
<bean id="AuthenticationManager"
class="at.asitplus.eidas.specific.core.auth.AuthenticationManager" />
diff --git a/modules/pom.xml b/modules/pom.xml
index fff02aa5..a6e9c696 100644
--- a/modules/pom.xml
+++ b/modules/pom.xml
@@ -4,7 +4,7 @@
<parent>
<groupId>at.asitplus.eidas</groupId>
<artifactId>ms_specific</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
</parent>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>modules</artifactId>
diff --git a/pom.xml b/pom.xml
index a8eb854c..ea08990e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,17 +5,17 @@
<modelVersion>4.0.0</modelVersion>
<groupId>at.asitplus.eidas</groupId>
<artifactId>ms_specific</artifactId>
- <version>1.2.5-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>MS specific eIDAS components</name>
- <properties>
+ <properties>
<!-- Project versions -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>yyyy-MM-dd HH:mm</maven.build.timestamp.format>
-
+
<egiz.eidas.version>${project.version}</egiz.eidas.version>
@@ -24,11 +24,11 @@
<egiz-eventlog-slf4jBackend>0.4</egiz-eventlog-slf4jBackend>
<eaaf-core.version>1.2.1-SNAPSHOT</eaaf-core.version>
- <spring-boot-starter-web.version>2.5.12</spring-boot-starter-web.version>
- <spring-boot-admin-starter-client.version>2.5.4</spring-boot-admin-starter-client.version>
- <org.springframework.version>5.3.18</org.springframework.version>
+ <spring-boot-starter-web.version>2.5.13</spring-boot-starter-web.version>
+ <spring-boot-admin-starter-client.version>2.5.6</spring-boot-admin-starter-client.version>
+ <org.springframework.version>5.3.19</org.springframework.version>
<org.thymeleaf-spring5.version>3.0.15.RELEASE</org.thymeleaf-spring5.version>
- <apache.cxf.version>3.5.0</apache.cxf.version>
+ <apache.cxf.version>3.5.2</apache.cxf.version>
<eidas-ref.version>2.5.0</eidas-ref.version>
@@ -39,28 +39,33 @@
<commons-io.version>2.11.0</commons-io.version>
<com.google.guava.version>31.1-jre</com.google.guava.version>
<joda-time.version>2.10.14</joda-time.version>
+ <jackson.version>2.13.2</jackson.version>
<jackson-datatype-jsr310.version>2.13.2</jackson-datatype-jsr310.version>
+ <jackson-databind-nullable.version>0.2.2</jackson-databind-nullable.version>
+ <swagger-parser.version>2.0.32</swagger-parser.version>
<org.slf4j.version>1.7.36</org.slf4j.version>
<log4j.version>2.17.2</log4j.version>
- <ch.qos.logback.version>1.2.10</ch.qos.logback.version>
+ <ch.qos.logback.version>1.2.11</ch.qos.logback.version>
+
+ <!-- for code generation -->
+ <openapi-generator-maven-plugin.version>5.4.0</openapi-generator-maven-plugin.version>
<!-- org.xerial.sqlite-jdbc.version>3.34.0</org.xerial.sqlite-jdbc.version -->
<javax.validation-api.version>2.0.1.Final</javax.validation-api.version>
<hibernate-validator.version>6.1.5.Final</hibernate-validator.version>
- <org.bitbucket.b_c.jose4j.version>0.7.11</org.bitbucket.b_c.jose4j.version>
-
+ <org.bitbucket.b_c.jose4j.version>0.7.12</org.bitbucket.b_c.jose4j.version>
<!-- For software testing only -->
- <json-path.version>2.6.0</json-path.version>
- <jetty.version>9.4.44.v20210927</jetty.version>
+ <json-path.version>2.7.0</json-path.version>
+ <jetty.version>9.4.46.v20220331</jetty.version>
<!-- testing -->
<junit.version>4.13.2</junit.version>
<surefire.version>2.22.2</surefire.version>
<mockito-soap-cxf.version>1.2.0</mockito-soap-cxf.version>
- <com.squareup.okhttp3.version>4.0.0</com.squareup.okhttp3.version>
+ <com.squareup.okhttp3.version>4.9.3</com.squareup.okhttp3.version>
<org.powermock.version>2.0.9</org.powermock.version>
<!-- Code quality checks -->
@@ -96,6 +101,16 @@
</activation>
<repositories>
<repository>
+ <id>central</id>
+ <url>https://repo.maven.apache.org/maven2</url>
+ <releases>
+ <updatePolicy>never</updatePolicy>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ <repository>
<id>egiz-commons</id>
<url>https://apps.egiz.gv.at/maven/</url>
<releases>
@@ -155,9 +170,14 @@
</dependency>
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
+ <version>${eaaf-core.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
<artifactId>eaaf_module_pvp2_sp</artifactId>
<version>${eaaf-core.version}</version>
- </dependency>
+ </dependency>
<dependency>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>ms_specific_connector</artifactId>
@@ -243,7 +263,6 @@
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring-boot-admin-starter-client.version}</version>
</dependency>
-
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
@@ -361,17 +380,37 @@
<version>${commons-collections4.version}</version>
</dependency>
<dependency>
+ <groupId>com.fasterxml.jackson.dataformat</groupId>
+ <artifactId>jackson-dataformat-yaml</artifactId>
+ <version>${jackson.version}</version>
+ </dependency>
+ <dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
- <version>${jackson-datatype-jsr310.version}</version>
+ <version>${jackson.version}</version>
</dependency>
<dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>${jackson.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.openapitools</groupId>
+ <artifactId>jackson-databind-nullable</artifactId>
+ <version>${jackson-databind-nullable.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>io.swagger.parser.v3</groupId>
+ <artifactId>swagger-parser</artifactId>
+ <version>${swagger-parser.version}</version>
+ </dependency>
+ <dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-modules-java8</artifactId>
<version>${jackson-datatype-jsr310.version}</version>
<type>pom</type>
- <scope>runtime</scope>
- </dependency>
+ <scope>runtime</scope>
+ </dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
@@ -407,7 +446,7 @@
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot-starter-web.version}</version>
<scope>test</scope>
- </dependency>
+ </dependency>
<dependency>
<groupId>com.github.skjolber</groupId>
<artifactId>mockito-soap-cxf</artifactId>
@@ -478,7 +517,7 @@
</dependency>
<dependency>
<groupId>at.gv.egiz.eaaf</groupId>
- <artifactId>eaaf_module_pvp2_sp</artifactId>
+ <artifactId>eaaf_module_pvp2_core</artifactId>
<version>${eaaf-core.version}</version>
<scope>test</scope>
<type>test-jar</type>
@@ -489,7 +528,14 @@
<version>${eaaf-core.version}</version>
<scope>test</scope>
<type>test-jar</type>
- </dependency>
+ </dependency>
+ <dependency>
+ <groupId>at.gv.egiz.eaaf</groupId>
+ <artifactId>eaaf_module_pvp2_sp</artifactId>
+ <version>${eaaf-core.version}</version>
+ <scope>test</scope>
+ <type>test-jar</type>
+ </dependency>
<dependency>
<groupId>at.asitplus.eidas.ms_specific</groupId>
<artifactId>core_common_lib</artifactId>
@@ -633,6 +679,11 @@
</executions>
</plugin>
+ <plugin>
+ <groupId>org.openapitools</groupId>
+ <artifactId>openapi-generator-maven-plugin</artifactId>
+ <version>${openapi-generator-maven-plugin.version}</version>
+ </plugin>
</plugins>
</pluginManagement>
@@ -652,7 +703,7 @@
</executions>
<configuration>
<excludedScopes>test</excludedScopes>
- <excludedGroups>iaik.*|MOA.spss.*</excludedGroups>
+ <excludedGroups>MOA.spss.*</excludedGroups>
</configuration>
</plugin>
@@ -754,7 +805,7 @@
</execution>
</executions>
<configuration>
- <linkXref>false</linkXref>
+ <linkXRef>false</linkXRef>
<sourceEncoding>utf-8</sourceEncoding>
<minimumTokens>100</minimumTokens>
<targetJdk>1.8</targetJdk>
@@ -765,6 +816,7 @@
</rulesets>
<excludeRoots>
<excludeRoot>target/generated/cxf</excludeRoot>
+ <excludeRoot>target/generated/swagger</excludeRoot>
</excludeRoots>
</configuration>
</plugin>