{"diffoscope-json-version": 1, "source1": "/input1", "source2": "/input2", "unified_diff": null, "details": [{"source1": "zipinfo {}", "source2": "zipinfo {}", "unified_diff": "@@ -1,8 +1,8 @@\n-Zip file size: 145782 bytes, number of entries: 122\n+Zip file size: 146545 bytes, number of entries: 122\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/MANIFEST.MF\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 org/apache/dubbo/registry/client/\n@@ -20,105 +20,105 @@\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/dubbo/internal/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/\n drwxr-xr-x  2.0 unx        0 b- stor 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-api/\n -rw-r--r--  2.0 unx     3750 b- defN 20-Apr-01 08:04 META-INF/DEPENDENCIES\n -rw-r--r--  2.0 unx    11358 b- defN 20-Apr-01 08:04 META-INF/LICENSE\n -rw-r--r--  2.0 unx      175 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     1312 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/AddressListener.java\n--rw-r--r--  2.0 unx     2669 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/Constants.java\n--rw-r--r--  2.0 unx     5145 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/ListenerRegistryWrapper.java\n+-rw-r--r--  2.0 unx     1348 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/AddressListener.java\n+-rw-r--r--  2.0 unx     2765 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/Constants.java\n+-rw-r--r--  2.0 unx     5303 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/ListenerRegistryWrapper.java\n -rw-r--r--  2.0 unx     2612 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/NotifyListener.java\n -rw-r--r--  2.0 unx     1338 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/Registry.java\n -rw-r--r--  2.0 unx     2003 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryFactory.java\n--rw-r--r--  2.0 unx     1529 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryFactoryWrapper.java\n+-rw-r--r--  2.0 unx     1567 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryFactoryWrapper.java\n -rw-r--r--  2.0 unx     5634 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryService.java\n--rw-r--r--  2.0 unx     1166 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryServiceListener.java\n--rw-r--r--  2.0 unx     2099 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/AbstractServiceDiscovery.java\n--rw-r--r--  2.0 unx     1731 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java\n--rw-r--r--  2.0 unx     1381 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java\n--rw-r--r--  2.0 unx     2160 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java\n--rw-r--r--  2.0 unx     6064 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultServiceInstance.java\n--rw-r--r--  2.0 unx    10791 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java\n--rw-r--r--  2.0 unx     8176 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java\n--rw-r--r--  2.0 unx    12067 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/InstanceAddressURL.java\n--rw-r--r--  2.0 unx     1504 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/RegistryClusterIdentifier.java\n--rw-r--r--  2.0 unx    11945 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscovery.java\n--rw-r--r--  2.0 unx     1974 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java\n--rw-r--r--  2.0 unx    21022 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java\n--rw-r--r--  2.0 unx    11484 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java\n--rw-r--r--  2.0 unx     1677 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java\n--rw-r--r--  2.0 unx     3498 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceInstance.java\n--rw-r--r--  2.0 unx     1494 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java\n--rw-r--r--  2.0 unx     1270 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java\n--rw-r--r--  2.0 unx     1275 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java\n--rw-r--r--  2.0 unx     2159 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java\n--rw-r--r--  2.0 unx     1659 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java\n--rw-r--r--  2.0 unx     1316 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java\n--rw-r--r--  2.0 unx     1322 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java\n--rw-r--r--  2.0 unx     1653 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java\n--rw-r--r--  2.0 unx     1351 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java\n--rw-r--r--  2.0 unx     1359 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java\n--rw-r--r--  2.0 unx     1344 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java\n--rw-r--r--  2.0 unx     1381 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java\n--rw-r--r--  2.0 unx     2214 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java\n--rw-r--r--  2.0 unx     3618 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java\n--rw-r--r--  2.0 unx    11317 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java\n--rw-r--r--  2.0 unx     3702 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java\n--rw-r--r--  2.0 unx     1495 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java\n--rw-r--r--  2.0 unx     2794 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java\n--rw-r--r--  2.0 unx     4771 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataUtils.java\n--rw-r--r--  2.0 unx     2296 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java\n--rw-r--r--  2.0 unx     2755 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java\n--rw-r--r--  2.0 unx     4021 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java\n--rw-r--r--  2.0 unx    13453 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java\n--rw-r--r--  2.0 unx     2159 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java\n--rw-r--r--  2.0 unx     3710 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java\n--rw-r--r--  2.0 unx     2120 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java\n--rw-r--r--  2.0 unx    11874 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java\n--rw-r--r--  2.0 unx     7562 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java\n--rw-r--r--  2.0 unx     3221 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java\n--rw-r--r--  2.0 unx      920 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/InvokersChangedListener.java\n--rw-r--r--  2.0 unx     1108 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java\n--rw-r--r--  2.0 unx    14787 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationInvoker.java\n--rw-r--r--  2.0 unx     2745 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java\n--rw-r--r--  2.0 unx     4504 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationRuleListener.java\n--rw-r--r--  2.0 unx     2612 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java\n--rw-r--r--  2.0 unx     1027 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/package-info.java\n--rw-r--r--  2.0 unx     1705 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java\n--rw-r--r--  2.0 unx     1699 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java\n--rw-r--r--  2.0 unx     3892 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java\n--rw-r--r--  2.0 unx    11260 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/DynamicDirectory.java\n--rw-r--r--  2.0 unx     3267 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java\n--rw-r--r--  2.0 unx      916 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/InvokersChangedListener.java\n+-rw-r--r--  2.0 unx     1207 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/RegistryServiceListener.java\n+-rw-r--r--  2.0 unx     2155 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/AbstractServiceDiscovery.java\n+-rw-r--r--  2.0 unx     1773 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx     1415 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java\n+-rw-r--r--  2.0 unx     2209 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx     6285 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/DefaultServiceInstance.java\n+-rw-r--r--  2.0 unx    11106 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java\n+-rw-r--r--  2.0 unx     8397 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java\n+-rw-r--r--  2.0 unx    12446 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/InstanceAddressURL.java\n+-rw-r--r--  2.0 unx     1540 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/RegistryClusterIdentifier.java\n+-rw-r--r--  2.0 unx    12232 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscovery.java\n+-rw-r--r--  2.0 unx     2027 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx    21520 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java\n+-rw-r--r--  2.0 unx    11749 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java\n+-rw-r--r--  2.0 unx     1715 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java\n+-rw-r--r--  2.0 unx     3624 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceInstance.java\n+-rw-r--r--  2.0 unx     1532 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java\n+-rw-r--r--  2.0 unx     1303 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java\n+-rw-r--r--  2.0 unx     1308 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java\n+-rw-r--r--  2.0 unx     2226 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java\n+-rw-r--r--  2.0 unx     1707 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java\n+-rw-r--r--  2.0 unx     1349 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java\n+-rw-r--r--  2.0 unx     1355 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java\n+-rw-r--r--  2.0 unx     1700 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java\n+-rw-r--r--  2.0 unx     1385 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java\n+-rw-r--r--  2.0 unx     1393 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java\n+-rw-r--r--  2.0 unx     1378 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java\n+-rw-r--r--  2.0 unx     1416 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java\n+-rw-r--r--  2.0 unx     2278 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java\n+-rw-r--r--  2.0 unx     3703 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java\n+-rw-r--r--  2.0 unx    11585 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java\n+-rw-r--r--  2.0 unx     3788 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java\n+-rw-r--r--  2.0 unx     1535 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java\n+-rw-r--r--  2.0 unx     2859 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java\n+-rw-r--r--  2.0 unx     4873 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/MetadataUtils.java\n+-rw-r--r--  2.0 unx     2351 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java\n+-rw-r--r--  2.0 unx     2822 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java\n+-rw-r--r--  2.0 unx     4109 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java\n+-rw-r--r--  2.0 unx    13771 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java\n+-rw-r--r--  2.0 unx     2210 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java\n+-rw-r--r--  2.0 unx     3799 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java\n+-rw-r--r--  2.0 unx     2175 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java\n+-rw-r--r--  2.0 unx    12175 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java\n+-rw-r--r--  2.0 unx     7705 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java\n+-rw-r--r--  2.0 unx     3295 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java\n+-rw-r--r--  2.0 unx      940 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/InvokersChangedListener.java\n+-rw-r--r--  2.0 unx     1133 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java\n+-rw-r--r--  2.0 unx    15177 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationInvoker.java\n+-rw-r--r--  2.0 unx     2816 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java\n+-rw-r--r--  2.0 unx     4616 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/MigrationRuleListener.java\n+-rw-r--r--  2.0 unx     2672 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java\n+-rw-r--r--  2.0 unx     1049 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/package-info.java\n+-rw-r--r--  2.0 unx     1752 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java\n+-rw-r--r--  2.0 unx     1742 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java\n+-rw-r--r--  2.0 unx     3989 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java\n+-rw-r--r--  2.0 unx    11545 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/DynamicDirectory.java\n+-rw-r--r--  2.0 unx     3340 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java\n+-rw-r--r--  2.0 unx      937 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/InvokersChangedListener.java\n -rw-r--r--  2.0 unx    29242 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/RegistryDirectory.java\n--rw-r--r--  2.0 unx    37486 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/RegistryProtocol.java\n--rw-r--r--  2.0 unx     2095 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/RegistryProtocolListener.java\n--rw-r--r--  2.0 unx     4424 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/AbstractRetryTask.java\n+-rw-r--r--  2.0 unx    38329 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/RegistryProtocol.java\n+-rw-r--r--  2.0 unx     2148 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/integration/RegistryProtocolListener.java\n+-rw-r--r--  2.0 unx     4557 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/AbstractRetryTask.java\n -rw-r--r--  2.0 unx     1487 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/FailedRegisteredTask.java\n -rw-r--r--  2.0 unx     1760 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/FailedSubscribedTask.java\n -rw-r--r--  2.0 unx     1499 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/FailedUnregisteredTask.java\n -rw-r--r--  2.0 unx     1770 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/FailedUnsubscribedTask.java\n--rw-r--r--  2.0 unx     1438 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/ReExportTask.java\n+-rw-r--r--  2.0 unx     1479 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/retry/ReExportTask.java\n -rw-r--r--  2.0 unx     2086 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/status/RegistryStatusChecker.java\n -rw-r--r--  2.0 unx    21375 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/support/AbstractRegistry.java\n -rw-r--r--  2.0 unx     7562 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/support/AbstractRegistryFactory.java\n -rw-r--r--  2.0 unx    17966 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/support/FailbackRegistry.java\n -rw-r--r--  2.0 unx     1362 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/support/SkipFailbackWrapperException.java\n -rw-r--r--  2.0 unx       63 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.common.status.StatusChecker\n -rw-r--r--  2.0 unx       85 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.event.EventListener\n -rw-r--r--  2.0 unx       77 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.metadata.ServiceNameMapping\n -rw-r--r--  2.0 unx       87 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.metadata.WritableMetadataService\n--rw-r--r--  2.0 unx      148 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n+-rw-r--r--  2.0 unx      149 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw-r--r--  2.0 unx       73 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.RegistryClusterIdentifier\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n -rw-r--r--  2.0 unx       71 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n--rw-r--r--  2.0 unx      568 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n--rw-r--r--  2.0 unx      176 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder\n+-rw-r--r--  2.0 unx      574 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer\n+-rw-r--r--  2.0 unx      177 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder\n -rw-r--r--  2.0 unx       84 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer\n -rw-r--r--  2.0 unx       84 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.migration.MigrationAddressComparator\n -rw-r--r--  2.0 unx       78 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.selector.ServiceInstanceSelector\n -rw-r--r--  2.0 unx       74 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.integration.RegistryProtocolListener\n--rw-r--r--  2.0 unx      164 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\n--rw-r--r--  2.0 unx     3313 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml\n+-rw-r--r--  2.0 unx      165 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol\n+-rw-r--r--  2.0 unx     3225 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml\n -rw-r--r--  2.0 unx       73 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.properties\n-122 files, 424269 bytes uncompressed, 121956 bytes compressed:  71.3%\n+122 files, 431935 bytes uncompressed, 122719 bytes compressed:  71.6%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -461,5596 +461,5596 @@\n 0193A Extract Zip Spec      14 (20) '2.0'\n 0193B Extract OS            00 (0) 'MS-DOS'\n 0193C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n 0193E Compression Method    0008 (8) 'Deflated'\n 01940 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-01944 CRC                   D4B8B1A6 (3568873894)\n-01948 Compressed Size       00000299 (665)\n-0194C Uncompressed Size     00000520 (1312)\n+01944 CRC                   D8E4F331 (3638883121)\n+01948 Compressed Size       000002A3 (675)\n+0194C Uncompressed Size     00000544 (1348)\n 01950 Filename Length       002E (46)\n 01952 Extra Length          0000 (0)\n 01954 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x1954: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 01982 PAYLOAD\n \n-01C1B LOCAL HEADER #27      04034B50 (67324752)\n-01C1F Extract Zip Spec      14 (20) '2.0'\n-01C20 Extract OS            00 (0) 'MS-DOS'\n-01C21 General Purpose Flag  0800 (2048)\n+01C25 LOCAL HEADER #27      04034B50 (67324752)\n+01C29 Extract Zip Spec      14 (20) '2.0'\n+01C2A Extract OS            00 (0) 'MS-DOS'\n+01C2B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-01C23 Compression Method    0008 (8) 'Deflated'\n-01C25 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-01C29 CRC                   9303661A (2466473498)\n-01C2D Compressed Size       0000043D (1085)\n-01C31 Uncompressed Size     00000A6D (2669)\n-01C35 Filename Length       0028 (40)\n-01C37 Extra Length          0000 (0)\n-01C39 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+01C2D Compression Method    0008 (8) 'Deflated'\n+01C2F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+01C33 CRC                   C7E99B2E (3353975598)\n+01C37 Compressed Size       00000448 (1096)\n+01C3B Uncompressed Size     00000ACD (2765)\n+01C3F Filename Length       0028 (40)\n+01C41 Extra Length          0000 (0)\n+01C43 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C39: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C43: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-01C61 PAYLOAD\n+01C6B PAYLOAD\n \n-0209E LOCAL HEADER #28      04034B50 (67324752)\n-020A2 Extract Zip Spec      14 (20) '2.0'\n-020A3 Extract OS            00 (0) 'MS-DOS'\n-020A4 General Purpose Flag  0800 (2048)\n+020B3 LOCAL HEADER #28      04034B50 (67324752)\n+020B7 Extract Zip Spec      14 (20) '2.0'\n+020B8 Extract OS            00 (0) 'MS-DOS'\n+020B9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-020A6 Compression Method    0008 (8) 'Deflated'\n-020A8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-020AC CRC                   8391A9ED (2207361517)\n-020B0 Compressed Size       00000421 (1057)\n-020B4 Uncompressed Size     00001419 (5145)\n-020B8 Filename Length       0036 (54)\n-020BA Extra Length          0000 (0)\n-020BC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+020BB Compression Method    0008 (8) 'Deflated'\n+020BD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+020C1 CRC                   A4BC4964 (2763802980)\n+020C5 Compressed Size       0000042E (1070)\n+020C9 Uncompressed Size     000014B7 (5303)\n+020CD Filename Length       0036 (54)\n+020CF Extra Length          0000 (0)\n+020D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20BC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-020F2 PAYLOAD\n+02107 PAYLOAD\n \n-02513 LOCAL HEADER #29      04034B50 (67324752)\n-02517 Extract Zip Spec      14 (20) '2.0'\n-02518 Extract OS            00 (0) 'MS-DOS'\n-02519 General Purpose Flag  0800 (2048)\n+02535 LOCAL HEADER #29      04034B50 (67324752)\n+02539 Extract Zip Spec      14 (20) '2.0'\n+0253A Extract OS            00 (0) 'MS-DOS'\n+0253B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0251B Compression Method    0008 (8) 'Deflated'\n-0251D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02521 CRC                   4C19B653 (1276753491)\n-02525 Compressed Size       000004BF (1215)\n-02529 Uncompressed Size     00000A34 (2612)\n-0252D Filename Length       002D (45)\n-0252F Extra Length          0000 (0)\n-02531 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0253D Compression Method    0008 (8) 'Deflated'\n+0253F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+02543 CRC                   4C19B653 (1276753491)\n+02547 Compressed Size       000004BF (1215)\n+0254B Uncompressed Size     00000A34 (2612)\n+0254F Filename Length       002D (45)\n+02551 Extra Length          0000 (0)\n+02553 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2531: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2553: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0255E PAYLOAD\n+02580 PAYLOAD\n \n-02A1D LOCAL HEADER #30      04034B50 (67324752)\n-02A21 Extract Zip Spec      14 (20) '2.0'\n-02A22 Extract OS            00 (0) 'MS-DOS'\n-02A23 General Purpose Flag  0800 (2048)\n+02A3F LOCAL HEADER #30      04034B50 (67324752)\n+02A43 Extract Zip Spec      14 (20) '2.0'\n+02A44 Extract OS            00 (0) 'MS-DOS'\n+02A45 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-02A25 Compression Method    0008 (8) 'Deflated'\n-02A27 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02A2B CRC                   92D33C56 (2463317078)\n-02A2F Compressed Size       00000290 (656)\n-02A33 Uncompressed Size     0000053A (1338)\n-02A37 Filename Length       0027 (39)\n-02A39 Extra Length          0000 (0)\n-02A3B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+02A47 Compression Method    0008 (8) 'Deflated'\n+02A49 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+02A4D CRC                   92D33C56 (2463317078)\n+02A51 Compressed Size       00000290 (656)\n+02A55 Uncompressed Size     0000053A (1338)\n+02A59 Filename Length       0027 (39)\n+02A5B Extra Length          0000 (0)\n+02A5D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2A3B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2A5D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-02A62 PAYLOAD\n+02A84 PAYLOAD\n \n-02CF2 LOCAL HEADER #31      04034B50 (67324752)\n-02CF6 Extract Zip Spec      14 (20) '2.0'\n-02CF7 Extract OS            00 (0) 'MS-DOS'\n-02CF8 General Purpose Flag  0800 (2048)\n+02D14 LOCAL HEADER #31      04034B50 (67324752)\n+02D18 Extract Zip Spec      14 (20) '2.0'\n+02D19 Extract OS            00 (0) 'MS-DOS'\n+02D1A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-02CFA Compression Method    0008 (8) 'Deflated'\n-02CFC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-02D00 CRC                   8AC6D7E1 (2328287201)\n-02D04 Compressed Size       000003BB (955)\n-02D08 Uncompressed Size     000007D3 (2003)\n-02D0C Filename Length       002E (46)\n-02D0E Extra Length          0000 (0)\n-02D10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+02D1C Compression Method    0008 (8) 'Deflated'\n+02D1E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+02D22 CRC                   8AC6D7E1 (2328287201)\n+02D26 Compressed Size       000003BB (955)\n+02D2A Uncompressed Size     000007D3 (2003)\n+02D2E Filename Length       002E (46)\n+02D30 Extra Length          0000 (0)\n+02D32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2D10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2D32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-02D3E PAYLOAD\n+02D60 PAYLOAD\n \n-030F9 LOCAL HEADER #32      04034B50 (67324752)\n-030FD Extract Zip Spec      14 (20) '2.0'\n-030FE Extract OS            00 (0) 'MS-DOS'\n-030FF General Purpose Flag  0800 (2048)\n+0311B LOCAL HEADER #32      04034B50 (67324752)\n+0311F Extract Zip Spec      14 (20) '2.0'\n+03120 Extract OS            00 (0) 'MS-DOS'\n+03121 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03101 Compression Method    0008 (8) 'Deflated'\n-03103 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03107 CRC                   BDE39003 (3185807363)\n-0310B Compressed Size       000002C2 (706)\n-0310F Uncompressed Size     000005F9 (1529)\n-03113 Filename Length       0035 (53)\n-03115 Extra Length          0000 (0)\n-03117 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03123 Compression Method    0008 (8) 'Deflated'\n+03125 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03129 CRC                   12C409E5 (314837477)\n+0312D Compressed Size       000002C9 (713)\n+03131 Uncompressed Size     0000061F (1567)\n+03135 Filename Length       0035 (53)\n+03137 Extra Length          0000 (0)\n+03139 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3117: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3139: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0314C PAYLOAD\n+0316E PAYLOAD\n \n-0340E LOCAL HEADER #33      04034B50 (67324752)\n-03412 Extract Zip Spec      14 (20) '2.0'\n-03413 Extract OS            00 (0) 'MS-DOS'\n-03414 General Purpose Flag  0800 (2048)\n+03437 LOCAL HEADER #33      04034B50 (67324752)\n+0343B Extract Zip Spec      14 (20) '2.0'\n+0343C Extract OS            00 (0) 'MS-DOS'\n+0343D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03416 Compression Method    0008 (8) 'Deflated'\n-03418 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0341C CRC                   6C2E2D81 (1814965633)\n-03420 Compressed Size       00000739 (1849)\n-03424 Uncompressed Size     00001602 (5634)\n-03428 Filename Length       002E (46)\n-0342A Extra Length          0000 (0)\n-0342C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0343F Compression Method    0008 (8) 'Deflated'\n+03441 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03445 CRC                   6C2E2D81 (1814965633)\n+03449 Compressed Size       00000739 (1849)\n+0344D Uncompressed Size     00001602 (5634)\n+03451 Filename Length       002E (46)\n+03453 Extra Length          0000 (0)\n+03455 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x342C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3455: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0345A PAYLOAD\n+03483 PAYLOAD\n \n-03B93 LOCAL HEADER #34      04034B50 (67324752)\n-03B97 Extract Zip Spec      14 (20) '2.0'\n-03B98 Extract OS            00 (0) 'MS-DOS'\n-03B99 General Purpose Flag  0800 (2048)\n+03BBC LOCAL HEADER #34      04034B50 (67324752)\n+03BC0 Extract Zip Spec      14 (20) '2.0'\n+03BC1 Extract OS            00 (0) 'MS-DOS'\n+03BC2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03B9B Compression Method    0008 (8) 'Deflated'\n-03B9D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03BA1 CRC                   350310AE (889393326)\n-03BA5 Compressed Size       0000024A (586)\n-03BA9 Uncompressed Size     0000048E (1166)\n-03BAD Filename Length       0036 (54)\n-03BAF Extra Length          0000 (0)\n-03BB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03BC4 Compression Method    0008 (8) 'Deflated'\n+03BC6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03BCA CRC                   ED9B9E6B (3986398827)\n+03BCE Compressed Size       00000255 (597)\n+03BD2 Uncompressed Size     000004B7 (1207)\n+03BD6 Filename Length       0036 (54)\n+03BD8 Extra Length          0000 (0)\n+03BDA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BDA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-03BE7 PAYLOAD\n+03C10 PAYLOAD\n \n-03E31 LOCAL HEADER #35      04034B50 (67324752)\n-03E35 Extract Zip Spec      14 (20) '2.0'\n-03E36 Extract OS            00 (0) 'MS-DOS'\n-03E37 General Purpose Flag  0800 (2048)\n+03E65 LOCAL HEADER #35      04034B50 (67324752)\n+03E69 Extract Zip Spec      14 (20) '2.0'\n+03E6A Extract OS            00 (0) 'MS-DOS'\n+03E6B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-03E39 Compression Method    0008 (8) 'Deflated'\n-03E3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-03E3F CRC                   D05840B7 (3495444663)\n-03E43 Compressed Size       0000030B (779)\n-03E47 Uncompressed Size     00000833 (2099)\n-03E4B Filename Length       003E (62)\n-03E4D Extra Length          0000 (0)\n-03E4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+03E6D Compression Method    0008 (8) 'Deflated'\n+03E6F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+03E73 CRC                   3799B565 (932820325)\n+03E77 Compressed Size       00000312 (786)\n+03E7B Uncompressed Size     0000086B (2155)\n+03E7F Filename Length       003E (62)\n+03E81 Extra Length          0000 (0)\n+03E83 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E83: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-03E8D PAYLOAD\n+03EC1 PAYLOAD\n \n-04198 LOCAL HEADER #36      04034B50 (67324752)\n-0419C Extract Zip Spec      14 (20) '2.0'\n-0419D Extract OS            00 (0) 'MS-DOS'\n-0419E General Purpose Flag  0800 (2048)\n+041D3 LOCAL HEADER #36      04034B50 (67324752)\n+041D7 Extract Zip Spec      14 (20) '2.0'\n+041D8 Extract OS            00 (0) 'MS-DOS'\n+041D9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-041A0 Compression Method    0008 (8) 'Deflated'\n-041A2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-041A6 CRC                   D9AD2407 (3652002823)\n-041AA Compressed Size       0000032E (814)\n-041AE Uncompressed Size     000006C3 (1731)\n-041B2 Filename Length       0045 (69)\n-041B4 Extra Length          0000 (0)\n-041B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+041DB Compression Method    0008 (8) 'Deflated'\n+041DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+041E1 CRC                   0B335580 (187913600)\n+041E5 Compressed Size       00000337 (823)\n+041E9 Uncompressed Size     000006ED (1773)\n+041ED Filename Length       0045 (69)\n+041EF Extra Length          0000 (0)\n+041F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x41B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x41F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-041FB PAYLOAD\n+04236 PAYLOAD\n \n-04529 LOCAL HEADER #37      04034B50 (67324752)\n-0452D Extract Zip Spec      14 (20) '2.0'\n-0452E Extract OS            00 (0) 'MS-DOS'\n-0452F General Purpose Flag  0800 (2048)\n+0456D LOCAL HEADER #37      04034B50 (67324752)\n+04571 Extract Zip Spec      14 (20) '2.0'\n+04572 Extract OS            00 (0) 'MS-DOS'\n+04573 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-04531 Compression Method    0008 (8) 'Deflated'\n-04533 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-04537 CRC                   6AAAC02C (1789575212)\n-0453B Compressed Size       00000294 (660)\n-0453F Uncompressed Size     00000565 (1381)\n-04543 Filename Length       0046 (70)\n-04545 Extra Length          0000 (0)\n-04547 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+04575 Compression Method    0008 (8) 'Deflated'\n+04577 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0457B CRC                   4E9CD747 (1318901575)\n+0457F Compressed Size       0000029C (668)\n+04583 Uncompressed Size     00000587 (1415)\n+04587 Filename Length       0046 (70)\n+04589 Extra Length          0000 (0)\n+0458B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4547: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x458B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0458D PAYLOAD\n+045D1 PAYLOAD\n \n-04821 LOCAL HEADER #38      04034B50 (67324752)\n-04825 Extract Zip Spec      14 (20) '2.0'\n-04826 Extract OS            00 (0) 'MS-DOS'\n-04827 General Purpose Flag  0800 (2048)\n+0486D LOCAL HEADER #38      04034B50 (67324752)\n+04871 Extract Zip Spec      14 (20) '2.0'\n+04872 Extract OS            00 (0) 'MS-DOS'\n+04873 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-04829 Compression Method    0008 (8) 'Deflated'\n-0482B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0482F CRC                   5F8855A5 (1602770341)\n-04833 Compressed Size       0000038F (911)\n-04837 Uncompressed Size     00000870 (2160)\n-0483B Filename Length       0044 (68)\n-0483D Extra Length          0000 (0)\n-0483F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+04875 Compression Method    0008 (8) 'Deflated'\n+04877 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0487B CRC                   A92DE3D2 (2838356946)\n+0487F Compressed Size       0000039B (923)\n+04883 Uncompressed Size     000008A1 (2209)\n+04887 Filename Length       0044 (68)\n+04889 Extra Length          0000 (0)\n+0488B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x483F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x488B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-04883 PAYLOAD\n+048CF PAYLOAD\n \n-04C12 LOCAL HEADER #39      04034B50 (67324752)\n-04C16 Extract Zip Spec      14 (20) '2.0'\n-04C17 Extract OS            00 (0) 'MS-DOS'\n-04C18 General Purpose Flag  0800 (2048)\n+04C6A LOCAL HEADER #39      04034B50 (67324752)\n+04C6E Extract Zip Spec      14 (20) '2.0'\n+04C6F Extract OS            00 (0) 'MS-DOS'\n+04C70 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-04C1A Compression Method    0008 (8) 'Deflated'\n-04C1C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-04C20 CRC                   C2AD0276 (3266118262)\n-04C24 Compressed Size       000006C4 (1732)\n-04C28 Uncompressed Size     000017B0 (6064)\n-04C2C Filename Length       003C (60)\n-04C2E Extra Length          0000 (0)\n-04C30 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+04C72 Compression Method    0008 (8) 'Deflated'\n+04C74 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+04C78 CRC                   B19E4EA6 (2979942054)\n+04C7C Compressed Size       000006D3 (1747)\n+04C80 Uncompressed Size     0000188D (6285)\n+04C84 Filename Length       003C (60)\n+04C86 Extra Length          0000 (0)\n+04C88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4C30: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4C88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-04C6C PAYLOAD\n+04CC4 PAYLOAD\n \n-05330 LOCAL HEADER #40      04034B50 (67324752)\n-05334 Extract Zip Spec      14 (20) '2.0'\n-05335 Extract OS            00 (0) 'MS-DOS'\n-05336 General Purpose Flag  0800 (2048)\n+05397 LOCAL HEADER #40      04034B50 (67324752)\n+0539B Extract Zip Spec      14 (20) '2.0'\n+0539C Extract OS            00 (0) 'MS-DOS'\n+0539D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-05338 Compression Method    0008 (8) 'Deflated'\n-0533A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0533E CRC                   77B5952D (2008388909)\n-05342 Compressed Size       00000901 (2305)\n-05346 Uncompressed Size     00002A27 (10791)\n-0534A Filename Length       0045 (69)\n-0534C Extra Length          0000 (0)\n-0534E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0539F Compression Method    0008 (8) 'Deflated'\n+053A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+053A5 CRC                   25CCFC5A (634190938)\n+053A9 Compressed Size       00000913 (2323)\n+053AD Uncompressed Size     00002B62 (11106)\n+053B1 Filename Length       0045 (69)\n+053B3 Extra Length          0000 (0)\n+053B5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x534E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x53B5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-05393 PAYLOAD\n+053FA PAYLOAD\n \n-05C94 LOCAL HEADER #41      04034B50 (67324752)\n-05C98 Extract Zip Spec      14 (20) '2.0'\n-05C99 Extract OS            00 (0) 'MS-DOS'\n-05C9A General Purpose Flag  0800 (2048)\n+05D0D LOCAL HEADER #41      04034B50 (67324752)\n+05D11 Extract Zip Spec      14 (20) '2.0'\n+05D12 Extract OS            00 (0) 'MS-DOS'\n+05D13 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-05C9C Compression Method    0008 (8) 'Deflated'\n-05C9E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-05CA2 CRC                   013987D8 (20547544)\n-05CA6 Compressed Size       0000087C (2172)\n-05CAA Uncompressed Size     00001FF0 (8176)\n-05CAE Filename Length       0040 (64)\n-05CB0 Extra Length          0000 (0)\n-05CB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+05D15 Compression Method    0008 (8) 'Deflated'\n+05D17 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+05D1B CRC                   DEC94C5D (3737734237)\n+05D1F Compressed Size       0000088A (2186)\n+05D23 Uncompressed Size     000020CD (8397)\n+05D27 Filename Length       0040 (64)\n+05D29 Extra Length          0000 (0)\n+05D2B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x5CB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x5D2B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-05CF2 PAYLOAD\n+05D6B PAYLOAD\n \n-0656E LOCAL HEADER #42      04034B50 (67324752)\n-06572 Extract Zip Spec      14 (20) '2.0'\n-06573 Extract OS            00 (0) 'MS-DOS'\n-06574 General Purpose Flag  0800 (2048)\n+065F5 LOCAL HEADER #42      04034B50 (67324752)\n+065F9 Extract Zip Spec      14 (20) '2.0'\n+065FA Extract OS            00 (0) 'MS-DOS'\n+065FB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-06576 Compression Method    0008 (8) 'Deflated'\n-06578 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0657C CRC                   E564338A (3848549258)\n-06580 Compressed Size       0000087A (2170)\n-06584 Uncompressed Size     00002F23 (12067)\n-06588 Filename Length       0038 (56)\n-0658A Extra Length          0000 (0)\n-0658C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+065FD Compression Method    0008 (8) 'Deflated'\n+065FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+06603 CRC                   71025D3E (1895980350)\n+06607 Compressed Size       0000088C (2188)\n+0660B Uncompressed Size     0000309E (12446)\n+0660F Filename Length       0038 (56)\n+06611 Extra Length          0000 (0)\n+06613 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x658C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6613: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-065C4 PAYLOAD\n+0664B PAYLOAD\n \n-06E3E LOCAL HEADER #43      04034B50 (67324752)\n-06E42 Extract Zip Spec      14 (20) '2.0'\n-06E43 Extract OS            00 (0) 'MS-DOS'\n-06E44 General Purpose Flag  0800 (2048)\n+06ED7 LOCAL HEADER #43      04034B50 (67324752)\n+06EDB Extract Zip Spec      14 (20) '2.0'\n+06EDC Extract OS            00 (0) 'MS-DOS'\n+06EDD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-06E46 Compression Method    0008 (8) 'Deflated'\n-06E48 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-06E4C CRC                   4D393448 (1295594568)\n-06E50 Compressed Size       000002BF (703)\n-06E54 Uncompressed Size     000005E0 (1504)\n-06E58 Filename Length       003F (63)\n-06E5A Extra Length          0000 (0)\n-06E5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+06EDF Compression Method    0008 (8) 'Deflated'\n+06EE1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+06EE5 CRC                   BE5FB3B5 (3193942965)\n+06EE9 Compressed Size       000002C9 (713)\n+06EED Uncompressed Size     00000604 (1540)\n+06EF1 Filename Length       003F (63)\n+06EF3 Extra Length          0000 (0)\n+06EF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x6E5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x6EF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-06E9B PAYLOAD\n+06F34 PAYLOAD\n \n-0715A LOCAL HEADER #44      04034B50 (67324752)\n-0715E Extract Zip Spec      14 (20) '2.0'\n-0715F Extract OS            00 (0) 'MS-DOS'\n-07160 General Purpose Flag  0800 (2048)\n+071FD LOCAL HEADER #44      04034B50 (67324752)\n+07201 Extract Zip Spec      14 (20) '2.0'\n+07202 Extract OS            00 (0) 'MS-DOS'\n+07203 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-07162 Compression Method    0008 (8) 'Deflated'\n-07164 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-07168 CRC                   6E2B9BED (1848351725)\n-0716C Compressed Size       00000A39 (2617)\n-07170 Uncompressed Size     00002EA9 (11945)\n-07174 Filename Length       0036 (54)\n-07176 Extra Length          0000 (0)\n-07178 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+07205 Compression Method    0008 (8) 'Deflated'\n+07207 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0720B CRC                   ED1E1920 (3978172704)\n+0720F Compressed Size       00000A47 (2631)\n+07213 Uncompressed Size     00002FC8 (12232)\n+07217 Filename Length       0036 (54)\n+07219 Extra Length          0000 (0)\n+0721B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7178: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x721B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-071AE PAYLOAD\n+07251 PAYLOAD\n \n-07BE7 LOCAL HEADER #45      04034B50 (67324752)\n-07BEB Extract Zip Spec      14 (20) '2.0'\n-07BEC Extract OS            00 (0) 'MS-DOS'\n-07BED General Purpose Flag  0800 (2048)\n+07C98 LOCAL HEADER #45      04034B50 (67324752)\n+07C9C Extract Zip Spec      14 (20) '2.0'\n+07C9D Extract OS            00 (0) 'MS-DOS'\n+07C9E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-07BEF Compression Method    0008 (8) 'Deflated'\n-07BF1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-07BF5 CRC                   9F02351C (2667722012)\n-07BF9 Compressed Size       00000327 (807)\n-07BFD Uncompressed Size     000007B6 (1974)\n-07C01 Filename Length       003D (61)\n-07C03 Extra Length          0000 (0)\n-07C05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+07CA0 Compression Method    0008 (8) 'Deflated'\n+07CA2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+07CA6 CRC                   9286ACC7 (2458299591)\n+07CAA Compressed Size       00000331 (817)\n+07CAE Uncompressed Size     000007EB (2027)\n+07CB2 Filename Length       003D (61)\n+07CB4 Extra Length          0000 (0)\n+07CB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7C05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x7CB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-07C42 PAYLOAD\n+07CF3 PAYLOAD\n \n-07F69 LOCAL HEADER #46      04034B50 (67324752)\n-07F6D Extract Zip Spec      14 (20) '2.0'\n-07F6E Extract OS            00 (0) 'MS-DOS'\n-07F6F General Purpose Flag  0800 (2048)\n+08024 LOCAL HEADER #46      04034B50 (67324752)\n+08028 Extract Zip Spec      14 (20) '2.0'\n+08029 Extract OS            00 (0) 'MS-DOS'\n+0802A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-07F71 Compression Method    0008 (8) 'Deflated'\n-07F73 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-07F77 CRC                   88D1E805 (2295457797)\n-07F7B Compressed Size       00001221 (4641)\n-07F7F Uncompressed Size     0000521E (21022)\n-07F83 Filename Length       003E (62)\n-07F85 Extra Length          0000 (0)\n-07F87 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0802C Compression Method    0008 (8) 'Deflated'\n+0802E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+08032 CRC                   8EF20CD3 (2398227667)\n+08036 Compressed Size       0000123B (4667)\n+0803A Uncompressed Size     00005410 (21520)\n+0803E Filename Length       003E (62)\n+08040 Extra Length          0000 (0)\n+08042 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x7F87: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x8042: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-07FC5 PAYLOAD\n+08080 PAYLOAD\n \n-091E6 LOCAL HEADER #47      04034B50 (67324752)\n-091EA Extract Zip Spec      14 (20) '2.0'\n-091EB Extract OS            00 (0) 'MS-DOS'\n-091EC General Purpose Flag  0800 (2048)\n+092BB LOCAL HEADER #47      04034B50 (67324752)\n+092BF Extract Zip Spec      14 (20) '2.0'\n+092C0 Extract OS            00 (0) 'MS-DOS'\n+092C1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-091EE Compression Method    0008 (8) 'Deflated'\n-091F0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-091F4 CRC                   1C63503A (476270650)\n-091F8 Compressed Size       00000C27 (3111)\n-091FC Uncompressed Size     00002CDC (11484)\n-09200 Filename Length       0047 (71)\n-09202 Extra Length          0000 (0)\n-09204 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+092C3 Compression Method    0008 (8) 'Deflated'\n+092C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+092C9 CRC                   82D7146C (2195133548)\n+092CD Compressed Size       00000C35 (3125)\n+092D1 Uncompressed Size     00002DE5 (11749)\n+092D5 Filename Length       0047 (71)\n+092D7 Extra Length          0000 (0)\n+092D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9204: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x92D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0924B PAYLOAD\n+09320 PAYLOAD\n \n-09E72 LOCAL HEADER #48      04034B50 (67324752)\n-09E76 Extract Zip Spec      14 (20) '2.0'\n-09E77 Extract OS            00 (0) 'MS-DOS'\n-09E78 General Purpose Flag  0800 (2048)\n+09F55 LOCAL HEADER #48      04034B50 (67324752)\n+09F59 Extract Zip Spec      14 (20) '2.0'\n+09F5A Extract OS            00 (0) 'MS-DOS'\n+09F5B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-09E7A Compression Method    0008 (8) 'Deflated'\n-09E7C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-09E80 CRC                   A7D42D9C (2815700380)\n-09E84 Compressed Size       000002F5 (757)\n-09E88 Uncompressed Size     0000068D (1677)\n-09E8C Filename Length       0045 (69)\n-09E8E Extra Length          0000 (0)\n-09E90 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+09F5D Compression Method    0008 (8) 'Deflated'\n+09F5F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+09F63 CRC                   988327A2 (2558732194)\n+09F67 Compressed Size       000002FF (767)\n+09F6B Uncompressed Size     000006B3 (1715)\n+09F6F Filename Length       0045 (69)\n+09F71 Extra Length          0000 (0)\n+09F73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x9E90: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x9F73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-09ED5 PAYLOAD\n+09FB8 PAYLOAD\n \n-0A1CA LOCAL HEADER #49      04034B50 (67324752)\n-0A1CE Extract Zip Spec      14 (20) '2.0'\n-0A1CF Extract OS            00 (0) 'MS-DOS'\n-0A1D0 General Purpose Flag  0800 (2048)\n+0A2B7 LOCAL HEADER #49      04034B50 (67324752)\n+0A2BB Extract Zip Spec      14 (20) '2.0'\n+0A2BC Extract OS            00 (0) 'MS-DOS'\n+0A2BD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A1D2 Compression Method    0008 (8) 'Deflated'\n-0A1D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A1D8 CRC                   F623C4B3 (4129539251)\n-0A1DC Compressed Size       000004AB (1195)\n-0A1E0 Uncompressed Size     00000DAA (3498)\n-0A1E4 Filename Length       0035 (53)\n-0A1E6 Extra Length          0000 (0)\n-0A1E8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A2BF Compression Method    0008 (8) 'Deflated'\n+0A2C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0A2C5 CRC                   756EE014 (1970200596)\n+0A2C9 Compressed Size       000004B5 (1205)\n+0A2CD Uncompressed Size     00000E28 (3624)\n+0A2D1 Filename Length       0035 (53)\n+0A2D3 Extra Length          0000 (0)\n+0A2D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA1E8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA2D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0A21D PAYLOAD\n+0A30A PAYLOAD\n \n-0A6C8 LOCAL HEADER #50      04034B50 (67324752)\n-0A6CC Extract Zip Spec      14 (20) '2.0'\n-0A6CD Extract OS            00 (0) 'MS-DOS'\n-0A6CE General Purpose Flag  0800 (2048)\n+0A7BF LOCAL HEADER #50      04034B50 (67324752)\n+0A7C3 Extract Zip Spec      14 (20) '2.0'\n+0A7C4 Extract OS            00 (0) 'MS-DOS'\n+0A7C5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A6D0 Compression Method    0008 (8) 'Deflated'\n-0A6D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A6D6 CRC                   5B09319E (1527329182)\n-0A6DA Compressed Size       000002B4 (692)\n-0A6DE Uncompressed Size     000005D6 (1494)\n-0A6E2 Filename Length       003F (63)\n-0A6E4 Extra Length          0000 (0)\n-0A6E6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0A7C7 Compression Method    0008 (8) 'Deflated'\n+0A7C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0A7CD CRC                   3557220F (894902799)\n+0A7D1 Compressed Size       000002BE (702)\n+0A7D5 Uncompressed Size     000005FC (1532)\n+0A7D9 Filename Length       003F (63)\n+0A7DB Extra Length          0000 (0)\n+0A7DD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA6E6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xA7DD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0A725 PAYLOAD\n+0A81C PAYLOAD\n \n-0A9D9 LOCAL HEADER #51      04034B50 (67324752)\n-0A9DD Extract Zip Spec      14 (20) '2.0'\n-0A9DE Extract OS            00 (0) 'MS-DOS'\n-0A9DF General Purpose Flag  0800 (2048)\n+0AADA LOCAL HEADER #51      04034B50 (67324752)\n+0AADE Extract Zip Spec      14 (20) '2.0'\n+0AADF Extract OS            00 (0) 'MS-DOS'\n+0AAE0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0A9E1 Compression Method    0008 (8) 'Deflated'\n-0A9E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0A9E7 CRC                   504AAFAB (1347071915)\n-0A9EB Compressed Size       0000027D (637)\n-0A9EF Uncompressed Size     000004F6 (1270)\n-0A9F3 Filename Length       004A (74)\n-0A9F5 Extra Length          0000 (0)\n-0A9F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0AAE2 Compression Method    0008 (8) 'Deflated'\n+0AAE4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0AAE8 CRC                   B96C1EAA (3110870698)\n+0AAEC Compressed Size       00000285 (645)\n+0AAF0 Uncompressed Size     00000517 (1303)\n+0AAF4 Filename Length       004A (74)\n+0AAF6 Extra Length          0000 (0)\n+0AAF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xA9F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xAAF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AA41 PAYLOAD\n+0AB42 PAYLOAD\n \n-0ACBE LOCAL HEADER #52      04034B50 (67324752)\n-0ACC2 Extract Zip Spec      14 (20) '2.0'\n-0ACC3 Extract OS            00 (0) 'MS-DOS'\n-0ACC4 General Purpose Flag  0800 (2048)\n+0ADC7 LOCAL HEADER #52      04034B50 (67324752)\n+0ADCB Extract Zip Spec      14 (20) '2.0'\n+0ADCC Extract OS            00 (0) 'MS-DOS'\n+0ADCD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0ACC6 Compression Method    0008 (8) 'Deflated'\n-0ACC8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0ACCC CRC                   24C1B311 (616674065)\n-0ACD0 Compressed Size       00000280 (640)\n-0ACD4 Uncompressed Size     000004FB (1275)\n-0ACD8 Filename Length       004B (75)\n-0ACDA Extra Length          0000 (0)\n-0ACDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0ADCF Compression Method    0008 (8) 'Deflated'\n+0ADD1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0ADD5 CRC                   7934C791 (2033502097)\n+0ADD9 Compressed Size       00000287 (647)\n+0ADDD Uncompressed Size     0000051C (1308)\n+0ADE1 Filename Length       004B (75)\n+0ADE3 Extra Length          0000 (0)\n+0ADE5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xACDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xADE5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0AD27 PAYLOAD\n+0AE30 PAYLOAD\n \n-0AFA7 LOCAL HEADER #53      04034B50 (67324752)\n-0AFAB Extract Zip Spec      14 (20) '2.0'\n-0AFAC Extract OS            00 (0) 'MS-DOS'\n-0AFAD General Purpose Flag  0800 (2048)\n+0B0B7 LOCAL HEADER #53      04034B50 (67324752)\n+0B0BB Extract Zip Spec      14 (20) '2.0'\n+0B0BC Extract OS            00 (0) 'MS-DOS'\n+0B0BD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0AFAF Compression Method    0008 (8) 'Deflated'\n-0AFB1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0AFB5 CRC                   F122AA0E (4045580814)\n-0AFB9 Compressed Size       0000035E (862)\n-0AFBD Uncompressed Size     0000086F (2159)\n-0AFC1 Filename Length       0041 (65)\n-0AFC3 Extra Length          0000 (0)\n-0AFC5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B0BF Compression Method    0008 (8) 'Deflated'\n+0B0C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B0C5 CRC                   BF357544 (3207951684)\n+0B0C9 Compressed Size       00000365 (869)\n+0B0CD Uncompressed Size     000008B2 (2226)\n+0B0D1 Filename Length       0041 (65)\n+0B0D3 Extra Length          0000 (0)\n+0B0D5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xAFC5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB0D5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B006 PAYLOAD\n+0B116 PAYLOAD\n \n-0B364 LOCAL HEADER #54      04034B50 (67324752)\n-0B368 Extract Zip Spec      14 (20) '2.0'\n-0B369 Extract OS            00 (0) 'MS-DOS'\n-0B36A General Purpose Flag  0800 (2048)\n+0B47B LOCAL HEADER #54      04034B50 (67324752)\n+0B47F Extract Zip Spec      14 (20) '2.0'\n+0B480 Extract OS            00 (0) 'MS-DOS'\n+0B481 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B36C Compression Method    0008 (8) 'Deflated'\n-0B36E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B372 CRC                   267DEE50 (645787216)\n-0B376 Compressed Size       00000308 (776)\n-0B37A Uncompressed Size     0000067B (1659)\n-0B37E Filename Length       004A (74)\n-0B380 Extra Length          0000 (0)\n-0B382 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B483 Compression Method    0008 (8) 'Deflated'\n+0B485 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B489 CRC                   59957DEF (1502969327)\n+0B48D Compressed Size       00000311 (785)\n+0B491 Uncompressed Size     000006AB (1707)\n+0B495 Filename Length       004A (74)\n+0B497 Extra Length          0000 (0)\n+0B499 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB382: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB499: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B3CC PAYLOAD\n+0B4E3 PAYLOAD\n \n-0B6D4 LOCAL HEADER #55      04034B50 (67324752)\n-0B6D8 Extract Zip Spec      14 (20) '2.0'\n-0B6D9 Extract OS            00 (0) 'MS-DOS'\n-0B6DA General Purpose Flag  0800 (2048)\n+0B7F4 LOCAL HEADER #55      04034B50 (67324752)\n+0B7F8 Extract Zip Spec      14 (20) '2.0'\n+0B7F9 Extract OS            00 (0) 'MS-DOS'\n+0B7FA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B6DC Compression Method    0008 (8) 'Deflated'\n-0B6DE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B6E2 CRC                   398D4C03 (965561347)\n-0B6E6 Compressed Size       0000028E (654)\n-0B6EA Uncompressed Size     00000524 (1316)\n-0B6EE Filename Length       004C (76)\n-0B6F0 Extra Length          0000 (0)\n-0B6F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0B7FC Compression Method    0008 (8) 'Deflated'\n+0B7FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0B802 CRC                   30CE65FD (818832893)\n+0B806 Compressed Size       00000298 (664)\n+0B80A Uncompressed Size     00000545 (1349)\n+0B80E Filename Length       004C (76)\n+0B810 Extra Length          0000 (0)\n+0B812 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB6F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xB812: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0B73E PAYLOAD\n+0B85E PAYLOAD\n \n-0B9CC LOCAL HEADER #56      04034B50 (67324752)\n-0B9D0 Extract Zip Spec      14 (20) '2.0'\n-0B9D1 Extract OS            00 (0) 'MS-DOS'\n-0B9D2 General Purpose Flag  0800 (2048)\n+0BAF6 LOCAL HEADER #56      04034B50 (67324752)\n+0BAFA Extract Zip Spec      14 (20) '2.0'\n+0BAFB Extract OS            00 (0) 'MS-DOS'\n+0BAFC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0B9D4 Compression Method    0008 (8) 'Deflated'\n-0B9D6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0B9DA CRC                   120048C8 (302008520)\n-0B9DE Compressed Size       00000292 (658)\n-0B9E2 Uncompressed Size     0000052A (1322)\n-0B9E6 Filename Length       004D (77)\n-0B9E8 Extra Length          0000 (0)\n-0B9EA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BAFE Compression Method    0008 (8) 'Deflated'\n+0BB00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0BB04 CRC                   C145F19E (3242586526)\n+0BB08 Compressed Size       0000029B (667)\n+0BB0C Uncompressed Size     0000054B (1355)\n+0BB10 Filename Length       004D (77)\n+0BB12 Extra Length          0000 (0)\n+0BB14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xB9EA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBB14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0BA37 PAYLOAD\n+0BB61 PAYLOAD\n \n-0BCC9 LOCAL HEADER #57      04034B50 (67324752)\n-0BCCD Extract Zip Spec      14 (20) '2.0'\n-0BCCE Extract OS            00 (0) 'MS-DOS'\n-0BCCF General Purpose Flag  0800 (2048)\n+0BDFC LOCAL HEADER #57      04034B50 (67324752)\n+0BE00 Extract Zip Spec      14 (20) '2.0'\n+0BE01 Extract OS            00 (0) 'MS-DOS'\n+0BE02 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0BCD1 Compression Method    0008 (8) 'Deflated'\n-0BCD3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0BCD7 CRC                   7B9FC9D5 (2074069461)\n-0BCDB Compressed Size       000002C9 (713)\n-0BCDF Uncompressed Size     00000675 (1653)\n-0BCE3 Filename Length       0040 (64)\n-0BCE5 Extra Length          0000 (0)\n-0BCE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0BE04 Compression Method    0008 (8) 'Deflated'\n+0BE06 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0BE0A CRC                   511C2CC7 (1360800967)\n+0BE0E Compressed Size       000002D1 (721)\n+0BE12 Uncompressed Size     000006A4 (1700)\n+0BE16 Filename Length       0040 (64)\n+0BE18 Extra Length          0000 (0)\n+0BE1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xBCE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xBE1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0BD27 PAYLOAD\n+0BE5A PAYLOAD\n \n-0BFF0 LOCAL HEADER #58      04034B50 (67324752)\n-0BFF4 Extract Zip Spec      14 (20) '2.0'\n-0BFF5 Extract OS            00 (0) 'MS-DOS'\n-0BFF6 General Purpose Flag  0800 (2048)\n+0C12B LOCAL HEADER #58      04034B50 (67324752)\n+0C12F Extract Zip Spec      14 (20) '2.0'\n+0C130 Extract OS            00 (0) 'MS-DOS'\n+0C131 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0BFF8 Compression Method    0008 (8) 'Deflated'\n-0BFFA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0BFFE CRC                   A2914700 (2727429888)\n-0C002 Compressed Size       00000290 (656)\n-0C006 Uncompressed Size     00000547 (1351)\n-0C00A Filename Length       004D (77)\n-0C00C Extra Length          0000 (0)\n-0C00E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C133 Compression Method    0008 (8) 'Deflated'\n+0C135 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C139 CRC                   B5EBBEE9 (3052125929)\n+0C13D Compressed Size       00000298 (664)\n+0C141 Uncompressed Size     00000569 (1385)\n+0C145 Filename Length       004D (77)\n+0C147 Extra Length          0000 (0)\n+0C149 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC00E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC149: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C05B PAYLOAD\n+0C196 PAYLOAD\n \n-0C2EB LOCAL HEADER #59      04034B50 (67324752)\n-0C2EF Extract Zip Spec      14 (20) '2.0'\n-0C2F0 Extract OS            00 (0) 'MS-DOS'\n-0C2F1 General Purpose Flag  0800 (2048)\n+0C42E LOCAL HEADER #59      04034B50 (67324752)\n+0C432 Extract Zip Spec      14 (20) '2.0'\n+0C433 Extract OS            00 (0) 'MS-DOS'\n+0C434 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C2F3 Compression Method    0008 (8) 'Deflated'\n-0C2F5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C2F9 CRC                   A0D533A5 (2698326949)\n-0C2FD Compressed Size       00000292 (658)\n-0C301 Uncompressed Size     0000054F (1359)\n-0C305 Filename Length       004F (79)\n-0C307 Extra Length          0000 (0)\n-0C309 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C436 Compression Method    0008 (8) 'Deflated'\n+0C438 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C43C CRC                   31557B6E (827685742)\n+0C440 Compressed Size       0000029C (668)\n+0C444 Uncompressed Size     00000571 (1393)\n+0C448 Filename Length       004F (79)\n+0C44A Extra Length          0000 (0)\n+0C44C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC309: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC44C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C358 PAYLOAD\n+0C49B PAYLOAD\n \n-0C5EA LOCAL HEADER #60      04034B50 (67324752)\n-0C5EE Extract Zip Spec      14 (20) '2.0'\n-0C5EF Extract OS            00 (0) 'MS-DOS'\n-0C5F0 General Purpose Flag  0800 (2048)\n+0C737 LOCAL HEADER #60      04034B50 (67324752)\n+0C73B Extract Zip Spec      14 (20) '2.0'\n+0C73C Extract OS            00 (0) 'MS-DOS'\n+0C73D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C5F2 Compression Method    0008 (8) 'Deflated'\n-0C5F4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C5F8 CRC                   DD6C864E (3714877006)\n-0C5FC Compressed Size       0000028D (653)\n-0C600 Uncompressed Size     00000540 (1344)\n-0C604 Filename Length       004A (74)\n-0C606 Extra Length          0000 (0)\n-0C608 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0C73F Compression Method    0008 (8) 'Deflated'\n+0C741 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0C745 CRC                   9E00A28D (2650841741)\n+0C749 Compressed Size       00000295 (661)\n+0C74D Uncompressed Size     00000562 (1378)\n+0C751 Filename Length       004A (74)\n+0C753 Extra Length          0000 (0)\n+0C755 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC608: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xC755: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C652 PAYLOAD\n+0C79F PAYLOAD\n \n-0C8DF LOCAL HEADER #61      04034B50 (67324752)\n-0C8E3 Extract Zip Spec      14 (20) '2.0'\n-0C8E4 Extract OS            00 (0) 'MS-DOS'\n-0C8E5 General Purpose Flag  0800 (2048)\n+0CA34 LOCAL HEADER #61      04034B50 (67324752)\n+0CA38 Extract Zip Spec      14 (20) '2.0'\n+0CA39 Extract OS            00 (0) 'MS-DOS'\n+0CA3A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0C8E7 Compression Method    0008 (8) 'Deflated'\n-0C8E9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0C8ED CRC                   F868DDB6 (4167622070)\n-0C8F1 Compressed Size       00000298 (664)\n-0C8F5 Uncompressed Size     00000565 (1381)\n-0C8F9 Filename Length       004C (76)\n-0C8FB Extra Length          0000 (0)\n-0C8FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0CA3C Compression Method    0008 (8) 'Deflated'\n+0CA3E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0CA42 CRC                   B8F3B221 (3102978593)\n+0CA46 Compressed Size       000002A0 (672)\n+0CA4A Uncompressed Size     00000588 (1416)\n+0CA4E Filename Length       004C (76)\n+0CA50 Extra Length          0000 (0)\n+0CA52 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xC8FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCA52: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0C949 PAYLOAD\n+0CA9E PAYLOAD\n \n-0CBE1 LOCAL HEADER #62      04034B50 (67324752)\n-0CBE5 Extract Zip Spec      14 (20) '2.0'\n-0CBE6 Extract OS            00 (0) 'MS-DOS'\n-0CBE7 General Purpose Flag  0800 (2048)\n+0CD3E LOCAL HEADER #62      04034B50 (67324752)\n+0CD42 Extract Zip Spec      14 (20) '2.0'\n+0CD43 Extract OS            00 (0) 'MS-DOS'\n+0CD44 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0CBE9 Compression Method    0008 (8) 'Deflated'\n-0CBEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0CBEF CRC                   97496C8E (2538171534)\n-0CBF3 Compressed Size       00000370 (880)\n-0CBF7 Uncompressed Size     000008A6 (2214)\n-0CBFB Filename Length       0048 (72)\n-0CBFD Extra Length          0000 (0)\n-0CBFF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0CD46 Compression Method    0008 (8) 'Deflated'\n+0CD48 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0CD4C CRC                   A03840DB (2688041179)\n+0CD50 Compressed Size       00000379 (889)\n+0CD54 Uncompressed Size     000008E6 (2278)\n+0CD58 Filename Length       0048 (72)\n+0CD5A Extra Length          0000 (0)\n+0CD5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCBFF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xCD5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0CC47 PAYLOAD\n+0CDA4 PAYLOAD\n \n-0CFB7 LOCAL HEADER #63      04034B50 (67324752)\n-0CFBB Extract Zip Spec      14 (20) '2.0'\n-0CFBC Extract OS            00 (0) 'MS-DOS'\n-0CFBD General Purpose Flag  0800 (2048)\n+0D11D LOCAL HEADER #63      04034B50 (67324752)\n+0D121 Extract Zip Spec      14 (20) '2.0'\n+0D122 Extract OS            00 (0) 'MS-DOS'\n+0D123 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0CFBF Compression Method    0008 (8) 'Deflated'\n-0CFC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0CFC5 CRC                   C309C134 (3272196404)\n-0CFC9 Compressed Size       000003FA (1018)\n-0CFCD Uncompressed Size     00000E22 (3618)\n-0CFD1 Filename Length       0049 (73)\n-0CFD3 Extra Length          0000 (0)\n-0CFD5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D125 Compression Method    0008 (8) 'Deflated'\n+0D127 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0D12B CRC                   80296188 (2150195592)\n+0D12F Compressed Size       00000404 (1028)\n+0D133 Uncompressed Size     00000E77 (3703)\n+0D137 Filename Length       0049 (73)\n+0D139 Extra Length          0000 (0)\n+0D13B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xCFD5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD13B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D01E PAYLOAD\n+0D184 PAYLOAD\n \n-0D418 LOCAL HEADER #64      04034B50 (67324752)\n-0D41C Extract Zip Spec      14 (20) '2.0'\n-0D41D Extract OS            00 (0) 'MS-DOS'\n-0D41E General Purpose Flag  0800 (2048)\n+0D588 LOCAL HEADER #64      04034B50 (67324752)\n+0D58C Extract Zip Spec      14 (20) '2.0'\n+0D58D Extract OS            00 (0) 'MS-DOS'\n+0D58E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0D420 Compression Method    0008 (8) 'Deflated'\n-0D422 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0D426 CRC                   BD334F2B (3174256427)\n-0D42A Compressed Size       00000B02 (2818)\n-0D42E Uncompressed Size     00002C35 (11317)\n-0D432 Filename Length       0054 (84)\n-0D434 Extra Length          0000 (0)\n-0D436 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0D590 Compression Method    0008 (8) 'Deflated'\n+0D592 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0D596 CRC                   179D40B4 (396181684)\n+0D59A Compressed Size       00000B12 (2834)\n+0D59E Uncompressed Size     00002D41 (11585)\n+0D5A2 Filename Length       0054 (84)\n+0D5A4 Extra Length          0000 (0)\n+0D5A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xD436: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xD5A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0D48A PAYLOAD\n+0D5FA PAYLOAD\n \n-0DF8C LOCAL HEADER #65      04034B50 (67324752)\n-0DF90 Extract Zip Spec      14 (20) '2.0'\n-0DF91 Extract OS            00 (0) 'MS-DOS'\n-0DF92 General Purpose Flag  0800 (2048)\n+0E10C LOCAL HEADER #65      04034B50 (67324752)\n+0E110 Extract Zip Spec      14 (20) '2.0'\n+0E111 Extract OS            00 (0) 'MS-DOS'\n+0E112 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0DF94 Compression Method    0008 (8) 'Deflated'\n-0DF96 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0DF9A CRC                   8764F382 (2271540098)\n-0DF9E Compressed Size       000004AD (1197)\n-0DFA2 Uncompressed Size     00000E76 (3702)\n-0DFA6 Filename Length       0049 (73)\n-0DFA8 Extra Length          0000 (0)\n-0DFAA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E114 Compression Method    0008 (8) 'Deflated'\n+0E116 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E11A CRC                   D8B03CE3 (3635428579)\n+0E11E Compressed Size       000004B8 (1208)\n+0E122 Uncompressed Size     00000ECC (3788)\n+0E126 Filename Length       0049 (73)\n+0E128 Extra Length          0000 (0)\n+0E12A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xDFAA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE12A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0DFF3 PAYLOAD\n+0E173 PAYLOAD\n \n-0E4A0 LOCAL HEADER #66      04034B50 (67324752)\n-0E4A4 Extract Zip Spec      14 (20) '2.0'\n-0E4A5 Extract OS            00 (0) 'MS-DOS'\n-0E4A6 General Purpose Flag  0800 (2048)\n+0E62B LOCAL HEADER #66      04034B50 (67324752)\n+0E62F Extract Zip Spec      14 (20) '2.0'\n+0E630 Extract OS            00 (0) 'MS-DOS'\n+0E631 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E4A8 Compression Method    0008 (8) 'Deflated'\n-0E4AA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0E4AE CRC                   E42AC0C2 (3828007106)\n-0E4B2 Compressed Size       000002E7 (743)\n-0E4B6 Uncompressed Size     000005D7 (1495)\n-0E4BA Filename Length       0048 (72)\n-0E4BC Extra Length          0000 (0)\n-0E4BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E633 Compression Method    0008 (8) 'Deflated'\n+0E635 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E639 CRC                   EEBAB417 (4005213207)\n+0E63D Compressed Size       000002EF (751)\n+0E641 Uncompressed Size     000005FF (1535)\n+0E645 Filename Length       0048 (72)\n+0E647 Extra Length          0000 (0)\n+0E649 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE4BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE649: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E506 PAYLOAD\n+0E691 PAYLOAD\n \n-0E7ED LOCAL HEADER #67      04034B50 (67324752)\n-0E7F1 Extract Zip Spec      14 (20) '2.0'\n-0E7F2 Extract OS            00 (0) 'MS-DOS'\n-0E7F3 General Purpose Flag  0800 (2048)\n+0E980 LOCAL HEADER #67      04034B50 (67324752)\n+0E984 Extract Zip Spec      14 (20) '2.0'\n+0E985 Extract OS            00 (0) 'MS-DOS'\n+0E986 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0E7F5 Compression Method    0008 (8) 'Deflated'\n-0E7F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0E7FB CRC                   33C91E00 (868818432)\n-0E7FF Compressed Size       000003D6 (982)\n-0E803 Uncompressed Size     00000AEA (2794)\n-0E807 Filename Length       0059 (89)\n-0E809 Extra Length          0000 (0)\n-0E80B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0E988 Compression Method    0008 (8) 'Deflated'\n+0E98A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0E98E CRC                   75D2ADE7 (1976741351)\n+0E992 Compressed Size       000003DE (990)\n+0E996 Uncompressed Size     00000B2B (2859)\n+0E99A Filename Length       0059 (89)\n+0E99C Extra Length          0000 (0)\n+0E99E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xE80B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xE99E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0E864 PAYLOAD\n+0E9F7 PAYLOAD\n \n-0EC3A LOCAL HEADER #68      04034B50 (67324752)\n-0EC3E Extract Zip Spec      14 (20) '2.0'\n-0EC3F Extract OS            00 (0) 'MS-DOS'\n-0EC40 General Purpose Flag  0800 (2048)\n+0EDD5 LOCAL HEADER #68      04034B50 (67324752)\n+0EDD9 Extract Zip Spec      14 (20) '2.0'\n+0EDDA Extract OS            00 (0) 'MS-DOS'\n+0EDDB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0EC42 Compression Method    0008 (8) 'Deflated'\n-0EC44 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0EC48 CRC                   055EEF97 (90107799)\n-0EC4C Compressed Size       0000060B (1547)\n-0EC50 Uncompressed Size     000012A3 (4771)\n-0EC54 Filename Length       003C (60)\n-0EC56 Extra Length          0000 (0)\n-0EC58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0EDDD Compression Method    0008 (8) 'Deflated'\n+0EDDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0EDE3 CRC                   755A196E (1968839022)\n+0EDE7 Compressed Size       00000616 (1558)\n+0EDEB Uncompressed Size     00001309 (4873)\n+0EDEF Filename Length       003C (60)\n+0EDF1 Extra Length          0000 (0)\n+0EDF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xEC58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xEDF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0EC94 PAYLOAD\n+0EE2F PAYLOAD\n \n-0F29F LOCAL HEADER #69      04034B50 (67324752)\n-0F2A3 Extract Zip Spec      14 (20) '2.0'\n-0F2A4 Extract OS            00 (0) 'MS-DOS'\n-0F2A5 General Purpose Flag  0800 (2048)\n+0F445 LOCAL HEADER #69      04034B50 (67324752)\n+0F449 Extract Zip Spec      14 (20) '2.0'\n+0F44A Extract OS            00 (0) 'MS-DOS'\n+0F44B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F2A7 Compression Method    0008 (8) 'Deflated'\n-0F2A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F2AD CRC                   02F66D1C (49704220)\n-0F2B1 Compressed Size       000003CC (972)\n-0F2B5 Uncompressed Size     000008F8 (2296)\n-0F2B9 Filename Length       004E (78)\n-0F2BB Extra Length          0000 (0)\n-0F2BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F44D Compression Method    0008 (8) 'Deflated'\n+0F44F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F453 CRC                   59E1F72D (1507981101)\n+0F457 Compressed Size       000003D7 (983)\n+0F45B Uncompressed Size     0000092F (2351)\n+0F45F Filename Length       004E (78)\n+0F461 Extra Length          0000 (0)\n+0F463 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF2BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF463: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F30B PAYLOAD\n+0F4B1 PAYLOAD\n \n-0F6D7 LOCAL HEADER #70      04034B50 (67324752)\n-0F6DB Extract Zip Spec      14 (20) '2.0'\n-0F6DC Extract OS            00 (0) 'MS-DOS'\n-0F6DD General Purpose Flag  0800 (2048)\n+0F888 LOCAL HEADER #70      04034B50 (67324752)\n+0F88C Extract Zip Spec      14 (20) '2.0'\n+0F88D Extract OS            00 (0) 'MS-DOS'\n+0F88E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0F6DF Compression Method    0008 (8) 'Deflated'\n-0F6E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0F6E5 CRC                   0266C937 (40290615)\n-0F6E9 Compressed Size       00000401 (1025)\n-0F6ED Uncompressed Size     00000AC3 (2755)\n-0F6F1 Filename Length       0054 (84)\n-0F6F3 Extra Length          0000 (0)\n-0F6F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0F890 Compression Method    0008 (8) 'Deflated'\n+0F892 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0F896 CRC                   FB40FD46 (4215340358)\n+0F89A Compressed Size       0000040C (1036)\n+0F89E Uncompressed Size     00000B06 (2822)\n+0F8A2 Filename Length       0054 (84)\n+0F8A4 Extra Length          0000 (0)\n+0F8A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xF6F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xF8A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0F749 PAYLOAD\n+0F8FA PAYLOAD\n \n-0FB4A LOCAL HEADER #71      04034B50 (67324752)\n-0FB4E Extract Zip Spec      14 (20) '2.0'\n-0FB4F Extract OS            00 (0) 'MS-DOS'\n-0FB50 General Purpose Flag  0800 (2048)\n+0FD06 LOCAL HEADER #71      04034B50 (67324752)\n+0FD0A Extract Zip Spec      14 (20) '2.0'\n+0FD0B Extract OS            00 (0) 'MS-DOS'\n+0FD0C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-0FB52 Compression Method    0008 (8) 'Deflated'\n-0FB54 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-0FB58 CRC                   BFC681E5 (3217457637)\n-0FB5C Compressed Size       00000541 (1345)\n-0FB60 Uncompressed Size     00000FB5 (4021)\n-0FB64 Filename Length       0050 (80)\n-0FB66 Extra Length          0000 (0)\n-0FB68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+0FD0E Compression Method    0008 (8) 'Deflated'\n+0FD10 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+0FD14 CRC                   53F9F17D (1408889213)\n+0FD18 Compressed Size       0000054E (1358)\n+0FD1C Uncompressed Size     0000100D (4109)\n+0FD20 Filename Length       0050 (80)\n+0FD22 Extra Length          0000 (0)\n+0FD24 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0xFB68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0xFD24: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-0FBB8 PAYLOAD\n+0FD74 PAYLOAD\n \n-100F9 LOCAL HEADER #72      04034B50 (67324752)\n-100FD Extract Zip Spec      14 (20) '2.0'\n-100FE Extract OS            00 (0) 'MS-DOS'\n-100FF General Purpose Flag  0800 (2048)\n+102C2 LOCAL HEADER #72      04034B50 (67324752)\n+102C6 Extract Zip Spec      14 (20) '2.0'\n+102C7 Extract OS            00 (0) 'MS-DOS'\n+102C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10101 Compression Method    0008 (8) 'Deflated'\n-10103 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-10107 CRC                   3C5C28F1 (1012672753)\n-1010B Compressed Size       00000C22 (3106)\n-1010F Uncompressed Size     0000348D (13453)\n-10113 Filename Length       004B (75)\n-10115 Extra Length          0000 (0)\n-10117 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+102CA Compression Method    0008 (8) 'Deflated'\n+102CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+102D0 CRC                   D85C97E6 (3629946854)\n+102D4 Compressed Size       00000C35 (3125)\n+102D8 Uncompressed Size     000035CB (13771)\n+102DC Filename Length       004B (75)\n+102DE Extra Length          0000 (0)\n+102E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10117: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x102E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10162 PAYLOAD\n+1032B PAYLOAD\n \n-10D84 LOCAL HEADER #73      04034B50 (67324752)\n-10D88 Extract Zip Spec      14 (20) '2.0'\n-10D89 Extract OS            00 (0) 'MS-DOS'\n-10D8A General Purpose Flag  0800 (2048)\n+10F60 LOCAL HEADER #73      04034B50 (67324752)\n+10F64 Extract Zip Spec      14 (20) '2.0'\n+10F65 Extract OS            00 (0) 'MS-DOS'\n+10F66 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-10D8C Compression Method    0008 (8) 'Deflated'\n-10D8E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-10D92 CRC                   81760C22 (2171997218)\n-10D96 Compressed Size       000003DE (990)\n-10D9A Uncompressed Size     0000086F (2159)\n-10D9E Filename Length       0053 (83)\n-10DA0 Extra Length          0000 (0)\n-10DA2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+10F68 Compression Method    0008 (8) 'Deflated'\n+10F6A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+10F6E CRC                   790FD089 (2031079561)\n+10F72 Compressed Size       000003E7 (999)\n+10F76 Uncompressed Size     000008A2 (2210)\n+10F7A Filename Length       0053 (83)\n+10F7C Extra Length          0000 (0)\n+10F7E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x10DA2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x10F7E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-10DF5 PAYLOAD\n+10FD1 PAYLOAD\n \n-111D3 LOCAL HEADER #74      04034B50 (67324752)\n-111D7 Extract Zip Spec      14 (20) '2.0'\n-111D8 Extract OS            00 (0) 'MS-DOS'\n-111D9 General Purpose Flag  0800 (2048)\n+113B8 LOCAL HEADER #74      04034B50 (67324752)\n+113BC Extract Zip Spec      14 (20) '2.0'\n+113BD Extract OS            00 (0) 'MS-DOS'\n+113BE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-111DB Compression Method    0008 (8) 'Deflated'\n-111DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-111E1 CRC                   7D70DC8D (2104548493)\n-111E5 Compressed Size       00000509 (1289)\n-111E9 Uncompressed Size     00000E7E (3710)\n-111ED Filename Length       0050 (80)\n-111EF Extra Length          0000 (0)\n-111F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+113C0 Compression Method    0008 (8) 'Deflated'\n+113C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+113C6 CRC                   85FEC00A (2248065034)\n+113CA Compressed Size       00000515 (1301)\n+113CE Uncompressed Size     00000ED7 (3799)\n+113D2 Filename Length       0050 (80)\n+113D4 Extra Length          0000 (0)\n+113D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x111F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x113D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11241 PAYLOAD\n+11426 PAYLOAD\n \n-1174A LOCAL HEADER #75      04034B50 (67324752)\n-1174E Extract Zip Spec      14 (20) '2.0'\n-1174F Extract OS            00 (0) 'MS-DOS'\n-11750 General Purpose Flag  0800 (2048)\n+1193B LOCAL HEADER #75      04034B50 (67324752)\n+1193F Extract Zip Spec      14 (20) '2.0'\n+11940 Extract OS            00 (0) 'MS-DOS'\n+11941 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11752 Compression Method    0008 (8) 'Deflated'\n-11754 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-11758 CRC                   BE3056BF (3190838975)\n-1175C Compressed Size       0000035B (859)\n-11760 Uncompressed Size     00000848 (2120)\n-11764 Filename Length       0048 (72)\n-11766 Extra Length          0000 (0)\n-11768 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11943 Compression Method    0008 (8) 'Deflated'\n+11945 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+11949 CRC                   ACB394E1 (2897450209)\n+1194D Compressed Size       00000367 (871)\n+11951 Uncompressed Size     0000087F (2175)\n+11955 Filename Length       0048 (72)\n+11957 Extra Length          0000 (0)\n+11959 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11768: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11959: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-117B0 PAYLOAD\n+119A1 PAYLOAD\n \n-11B0B LOCAL HEADER #76      04034B50 (67324752)\n-11B0F Extract Zip Spec      14 (20) '2.0'\n-11B10 Extract OS            00 (0) 'MS-DOS'\n-11B11 General Purpose Flag  0800 (2048)\n+11D08 LOCAL HEADER #76      04034B50 (67324752)\n+11D0C Extract Zip Spec      14 (20) '2.0'\n+11D0D Extract OS            00 (0) 'MS-DOS'\n+11D0E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-11B13 Compression Method    0008 (8) 'Deflated'\n-11B15 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-11B19 CRC                   E322696B (3810683243)\n-11B1D Compressed Size       00000B90 (2960)\n-11B21 Uncompressed Size     00002E62 (11874)\n-11B25 Filename Length       0054 (84)\n-11B27 Extra Length          0000 (0)\n-11B29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+11D10 Compression Method    0008 (8) 'Deflated'\n+11D12 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+11D16 CRC                   AF38F813 (2939746323)\n+11D1A Compressed Size       00000BA6 (2982)\n+11D1E Uncompressed Size     00002F8F (12175)\n+11D22 Filename Length       0054 (84)\n+11D24 Extra Length          0000 (0)\n+11D26 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x11B29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x11D26: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-11B7D PAYLOAD\n+11D7A PAYLOAD\n \n-1270D LOCAL HEADER #77      04034B50 (67324752)\n-12711 Extract Zip Spec      14 (20) '2.0'\n-12712 Extract OS            00 (0) 'MS-DOS'\n-12713 General Purpose Flag  0800 (2048)\n+12920 LOCAL HEADER #77      04034B50 (67324752)\n+12924 Extract Zip Spec      14 (20) '2.0'\n+12925 Extract OS            00 (0) 'MS-DOS'\n+12926 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12715 Compression Method    0008 (8) 'Deflated'\n-12717 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1271B CRC                   6CE6F13F (1827074367)\n-1271F Compressed Size       000007BE (1982)\n-12723 Uncompressed Size     00001D8A (7562)\n-12727 Filename Length       004E (78)\n-12729 Extra Length          0000 (0)\n-1272B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+12928 Compression Method    0008 (8) 'Deflated'\n+1292A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1292E CRC                   6659263F (1717118527)\n+12932 Compressed Size       000007CA (1994)\n+12936 Uncompressed Size     00001E19 (7705)\n+1293A Filename Length       004E (78)\n+1293C Extra Length          0000 (0)\n+1293E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1272B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1293E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12779 PAYLOAD\n+1298C PAYLOAD\n \n-12F37 LOCAL HEADER #78      04034B50 (67324752)\n-12F3B Extract Zip Spec      14 (20) '2.0'\n-12F3C Extract OS            00 (0) 'MS-DOS'\n-12F3D General Purpose Flag  0800 (2048)\n+13156 LOCAL HEADER #78      04034B50 (67324752)\n+1315A Extract Zip Spec      14 (20) '2.0'\n+1315B Extract OS            00 (0) 'MS-DOS'\n+1315C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-12F3F Compression Method    0008 (8) 'Deflated'\n-12F41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-12F45 CRC                   C9115A1F (3373357599)\n-12F49 Compressed Size       0000048B (1163)\n-12F4D Uncompressed Size     00000C95 (3221)\n-12F51 Filename Length       0051 (81)\n-12F53 Extra Length          0000 (0)\n-12F55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1315E Compression Method    0008 (8) 'Deflated'\n+13160 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13164 CRC                   1E182794 (504899476)\n+13168 Compressed Size       00000495 (1173)\n+1316C Uncompressed Size     00000CDF (3295)\n+13170 Filename Length       0051 (81)\n+13172 Extra Length          0000 (0)\n+13174 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x12F55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13174: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-12FA6 PAYLOAD\n+131C5 PAYLOAD\n \n-13431 LOCAL HEADER #79      04034B50 (67324752)\n-13435 Extract Zip Spec      14 (20) '2.0'\n-13436 Extract OS            00 (0) 'MS-DOS'\n-13437 General Purpose Flag  0800 (2048)\n+1365A LOCAL HEADER #79      04034B50 (67324752)\n+1365E Extract Zip Spec      14 (20) '2.0'\n+1365F Extract OS            00 (0) 'MS-DOS'\n+13660 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13439 Compression Method    0008 (8) 'Deflated'\n-1343B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1343F CRC                   2197D7D3 (563599315)\n-13443 Compressed Size       00000210 (528)\n-13447 Uncompressed Size     00000398 (920)\n-1344B Filename Length       0047 (71)\n-1344D Extra Length          0000 (0)\n-1344F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13662 Compression Method    0008 (8) 'Deflated'\n+13664 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13668 CRC                   6D847AE7 (1837398759)\n+1366C Compressed Size       00000215 (533)\n+13670 Uncompressed Size     000003AC (940)\n+13674 Filename Length       0047 (71)\n+13676 Extra Length          0000 (0)\n+13678 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1344F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13678: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-13496 PAYLOAD\n+136BF PAYLOAD\n \n-136A6 LOCAL HEADER #80      04034B50 (67324752)\n-136AA Extract Zip Spec      14 (20) '2.0'\n-136AB Extract OS            00 (0) 'MS-DOS'\n-136AC General Purpose Flag  0800 (2048)\n+138D4 LOCAL HEADER #80      04034B50 (67324752)\n+138D8 Extract Zip Spec      14 (20) '2.0'\n+138D9 Extract OS            00 (0) 'MS-DOS'\n+138DA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-136AE Compression Method    0008 (8) 'Deflated'\n-136B0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-136B4 CRC                   D03865FF (3493357055)\n-136B8 Compressed Size       0000025B (603)\n-136BC Uncompressed Size     00000454 (1108)\n-136C0 Filename Length       004A (74)\n-136C2 Extra Length          0000 (0)\n-136C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+138DC Compression Method    0008 (8) 'Deflated'\n+138DE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+138E2 CRC                   21E16F63 (568422243)\n+138E6 Compressed Size       00000264 (612)\n+138EA Uncompressed Size     0000046D (1133)\n+138EE Filename Length       004A (74)\n+138F0 Extra Length          0000 (0)\n+138F2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x136C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x138F2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1370E PAYLOAD\n+1393C PAYLOAD\n \n-13969 LOCAL HEADER #81      04034B50 (67324752)\n-1396D Extract Zip Spec      14 (20) '2.0'\n-1396E Extract OS            00 (0) 'MS-DOS'\n-1396F General Purpose Flag  0800 (2048)\n+13BA0 LOCAL HEADER #81      04034B50 (67324752)\n+13BA4 Extract Zip Spec      14 (20) '2.0'\n+13BA5 Extract OS            00 (0) 'MS-DOS'\n+13BA6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-13971 Compression Method    0008 (8) 'Deflated'\n-13973 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-13977 CRC                   D6056B09 (3590679305)\n-1397B Compressed Size       00000A5D (2653)\n-1397F Uncompressed Size     000039C3 (14787)\n-13983 Filename Length       0040 (64)\n-13985 Extra Length          0000 (0)\n-13987 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+13BA8 Compression Method    0008 (8) 'Deflated'\n+13BAA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+13BAE CRC                   0709B18C (118075788)\n+13BB2 Compressed Size       00000A71 (2673)\n+13BB6 Uncompressed Size     00003B49 (15177)\n+13BBA Filename Length       0040 (64)\n+13BBC Extra Length          0000 (0)\n+13BBE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x13987: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x13BBE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-139C7 PAYLOAD\n+13BFE PAYLOAD\n \n-14424 LOCAL HEADER #82      04034B50 (67324752)\n-14428 Extract Zip Spec      14 (20) '2.0'\n-14429 Extract OS            00 (0) 'MS-DOS'\n-1442A General Purpose Flag  0800 (2048)\n+1466F LOCAL HEADER #82      04034B50 (67324752)\n+14673 Extract Zip Spec      14 (20) '2.0'\n+14674 Extract OS            00 (0) 'MS-DOS'\n+14675 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1442C Compression Method    0008 (8) 'Deflated'\n-1442E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14432 CRC                   8A132C8F (2316512399)\n-14436 Compressed Size       000003EF (1007)\n-1443A Uncompressed Size     00000AB9 (2745)\n-1443E Filename Length       0044 (68)\n-14440 Extra Length          0000 (0)\n-14442 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14677 Compression Method    0008 (8) 'Deflated'\n+14679 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1467D CRC                   E2477A52 (3796335186)\n+14681 Compressed Size       000003FA (1018)\n+14685 Uncompressed Size     00000B00 (2816)\n+14689 Filename Length       0044 (68)\n+1468B Extra Length          0000 (0)\n+1468D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14442: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1468D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14486 PAYLOAD\n+146D1 PAYLOAD\n \n-14875 LOCAL HEADER #83      04034B50 (67324752)\n-14879 Extract Zip Spec      14 (20) '2.0'\n-1487A Extract OS            00 (0) 'MS-DOS'\n-1487B General Purpose Flag  0800 (2048)\n+14ACB LOCAL HEADER #83      04034B50 (67324752)\n+14ACF Extract Zip Spec      14 (20) '2.0'\n+14AD0 Extract OS            00 (0) 'MS-DOS'\n+14AD1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1487D Compression Method    0008 (8) 'Deflated'\n-1487F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14883 CRC                   F9713EB9 (4184948409)\n-14887 Compressed Size       000005A2 (1442)\n-1488B Uncompressed Size     00001198 (4504)\n-1488F Filename Length       0045 (69)\n-14891 Extra Length          0000 (0)\n-14893 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+14AD3 Compression Method    0008 (8) 'Deflated'\n+14AD5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+14AD9 CRC                   00160E4A (1445450)\n+14ADD Compressed Size       000005B2 (1458)\n+14AE1 Uncompressed Size     00001208 (4616)\n+14AE5 Filename Length       0045 (69)\n+14AE7 Extra Length          0000 (0)\n+14AE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14893: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x14AE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-148D8 PAYLOAD\n+14B2E PAYLOAD\n \n-14E7A LOCAL HEADER #84      04034B50 (67324752)\n-14E7E Extract Zip Spec      14 (20) '2.0'\n-14E7F Extract OS            00 (0) 'MS-DOS'\n-14E80 General Purpose Flag  0800 (2048)\n+150E0 LOCAL HEADER #84      04034B50 (67324752)\n+150E4 Extract Zip Spec      14 (20) '2.0'\n+150E5 Extract OS            00 (0) 'MS-DOS'\n+150E6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-14E82 Compression Method    0008 (8) 'Deflated'\n-14E84 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-14E88 CRC                   5914D57F (1494537599)\n-14E8C Compressed Size       000003F4 (1012)\n-14E90 Uncompressed Size     00000A34 (2612)\n-14E94 Filename Length       0050 (80)\n-14E96 Extra Length          0000 (0)\n-14E98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+150E8 Compression Method    0008 (8) 'Deflated'\n+150EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+150EE CRC                   6EF68498 (1861649560)\n+150F2 Compressed Size       000003FD (1021)\n+150F6 Uncompressed Size     00000A70 (2672)\n+150FA Filename Length       0050 (80)\n+150FC Extra Length          0000 (0)\n+150FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x14E98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x150FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-14EE8 PAYLOAD\n+1514E PAYLOAD\n \n-152DC LOCAL HEADER #85      04034B50 (67324752)\n-152E0 Extract Zip Spec      14 (20) '2.0'\n-152E1 Extract OS            00 (0) 'MS-DOS'\n-152E2 General Purpose Flag  0800 (2048)\n+1554B LOCAL HEADER #85      04034B50 (67324752)\n+1554F Extract Zip Spec      14 (20) '2.0'\n+15550 Extract OS            00 (0) 'MS-DOS'\n+15551 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-152E4 Compression Method    0008 (8) 'Deflated'\n-152E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-152EA CRC                   F9948D9B (4187262363)\n-152EE Compressed Size       00000247 (583)\n-152F2 Uncompressed Size     00000403 (1027)\n-152F6 Filename Length       0032 (50)\n-152F8 Extra Length          0000 (0)\n-152FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15553 Compression Method    0008 (8) 'Deflated'\n+15555 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15559 CRC                   0DCE7BD6 (231635926)\n+1555D Compressed Size       0000024D (589)\n+15561 Uncompressed Size     00000419 (1049)\n+15565 Filename Length       0032 (50)\n+15567 Extra Length          0000 (0)\n+15569 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x152FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15569: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1532C PAYLOAD\n+1559B PAYLOAD\n \n-15573 LOCAL HEADER #86      04034B50 (67324752)\n-15577 Extract Zip Spec      14 (20) '2.0'\n-15578 Extract OS            00 (0) 'MS-DOS'\n-15579 General Purpose Flag  0800 (2048)\n+157E8 LOCAL HEADER #86      04034B50 (67324752)\n+157EC Extract Zip Spec      14 (20) '2.0'\n+157ED Extract OS            00 (0) 'MS-DOS'\n+157EE General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1557B Compression Method    0008 (8) 'Deflated'\n-1557D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15581 CRC                   D0D8B588 (3503863176)\n-15585 Compressed Size       00000314 (788)\n-15589 Uncompressed Size     000006A9 (1705)\n-1558D Filename Length       004C (76)\n-1558F Extra Length          0000 (0)\n-15591 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+157F0 Compression Method    0008 (8) 'Deflated'\n+157F2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+157F6 CRC                   3EC7C431 (1053279281)\n+157FA Compressed Size       0000031E (798)\n+157FE Uncompressed Size     000006D8 (1752)\n+15802 Filename Length       004C (76)\n+15804 Extra Length          0000 (0)\n+15806 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15591: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15806: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-155DD PAYLOAD\n+15852 PAYLOAD\n \n-158F1 LOCAL HEADER #87      04034B50 (67324752)\n-158F5 Extract Zip Spec      14 (20) '2.0'\n-158F6 Extract OS            00 (0) 'MS-DOS'\n-158F7 General Purpose Flag  0800 (2048)\n+15B70 LOCAL HEADER #87      04034B50 (67324752)\n+15B74 Extract Zip Spec      14 (20) '2.0'\n+15B75 Extract OS            00 (0) 'MS-DOS'\n+15B76 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-158F9 Compression Method    0008 (8) 'Deflated'\n-158FB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-158FF CRC                   DDD86D2D (3721948461)\n-15903 Compressed Size       000002F5 (757)\n-15907 Uncompressed Size     000006A3 (1699)\n-1590B Filename Length       0046 (70)\n-1590D Extra Length          0000 (0)\n-1590F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15B78 Compression Method    0008 (8) 'Deflated'\n+15B7A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15B7E CRC                   0AF6711C (183922972)\n+15B82 Compressed Size       000002FF (767)\n+15B86 Uncompressed Size     000006CE (1742)\n+15B8A Filename Length       0046 (70)\n+15B8C Extra Length          0000 (0)\n+15B8E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1590F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15B8E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15955 PAYLOAD\n+15BD4 PAYLOAD\n \n-15C4A LOCAL HEADER #88      04034B50 (67324752)\n-15C4E Extract Zip Spec      14 (20) '2.0'\n-15C4F Extract OS            00 (0) 'MS-DOS'\n-15C50 General Purpose Flag  0800 (2048)\n+15ED3 LOCAL HEADER #88      04034B50 (67324752)\n+15ED7 Extract Zip Spec      14 (20) '2.0'\n+15ED8 Extract OS            00 (0) 'MS-DOS'\n+15ED9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-15C52 Compression Method    0008 (8) 'Deflated'\n-15C54 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-15C58 CRC                   F2CE052F (4073588015)\n-15C5C Compressed Size       00000546 (1350)\n-15C60 Uncompressed Size     00000F34 (3892)\n-15C64 Filename Length       0047 (71)\n-15C66 Extra Length          0000 (0)\n-15C68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+15EDB Compression Method    0008 (8) 'Deflated'\n+15EDD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+15EE1 CRC                   AA7692A4 (2859897508)\n+15EE5 Compressed Size       00000552 (1362)\n+15EE9 Uncompressed Size     00000F95 (3989)\n+15EED Filename Length       0047 (71)\n+15EEF Extra Length          0000 (0)\n+15EF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x15C68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x15EF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-15CAF PAYLOAD\n+15F38 PAYLOAD\n \n-161F5 LOCAL HEADER #89      04034B50 (67324752)\n-161F9 Extract Zip Spec      14 (20) '2.0'\n-161FA Extract OS            00 (0) 'MS-DOS'\n-161FB General Purpose Flag  0800 (2048)\n+1648A LOCAL HEADER #89      04034B50 (67324752)\n+1648E Extract Zip Spec      14 (20) '2.0'\n+1648F Extract OS            00 (0) 'MS-DOS'\n+16490 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-161FD Compression Method    0008 (8) 'Deflated'\n-161FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-16203 CRC                   BF63BCF2 (3210984690)\n-16207 Compressed Size       00000B50 (2896)\n-1620B Uncompressed Size     00002BFC (11260)\n-1620F Filename Length       003B (59)\n-16211 Extra Length          0000 (0)\n-16213 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+16492 Compression Method    0008 (8) 'Deflated'\n+16494 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+16498 CRC                   B7357AFB (3073735419)\n+1649C Compressed Size       00000B61 (2913)\n+164A0 Uncompressed Size     00002D19 (11545)\n+164A4 Filename Length       003B (59)\n+164A6 Extra Length          0000 (0)\n+164A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16213: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x164A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1624E PAYLOAD\n+164E3 PAYLOAD\n \n-16D9E LOCAL HEADER #90      04034B50 (67324752)\n-16DA2 Extract Zip Spec      14 (20) '2.0'\n-16DA3 Extract OS            00 (0) 'MS-DOS'\n-16DA4 General Purpose Flag  0800 (2048)\n+17044 LOCAL HEADER #90      04034B50 (67324752)\n+17048 Extract Zip Spec      14 (20) '2.0'\n+17049 Extract OS            00 (0) 'MS-DOS'\n+1704A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-16DA6 Compression Method    0008 (8) 'Deflated'\n-16DA8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-16DAC CRC                   E2D6B20B (3805721099)\n-16DB0 Compressed Size       0000041E (1054)\n-16DB4 Uncompressed Size     00000CC3 (3267)\n-16DB8 Filename Length       004E (78)\n-16DBA Extra Length          0000 (0)\n-16DBC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1704C Compression Method    0008 (8) 'Deflated'\n+1704E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+17052 CRC                   C79AC1A5 (3348808101)\n+17056 Compressed Size       00000429 (1065)\n+1705A Uncompressed Size     00000D0C (3340)\n+1705E Filename Length       004E (78)\n+17060 Extra Length          0000 (0)\n+17062 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x16DBC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x17062: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-16E0A PAYLOAD\n+170B0 PAYLOAD\n \n-17228 LOCAL HEADER #91      04034B50 (67324752)\n-1722C Extract Zip Spec      14 (20) '2.0'\n-1722D Extract OS            00 (0) 'MS-DOS'\n-1722E General Purpose Flag  0800 (2048)\n+174D9 LOCAL HEADER #91      04034B50 (67324752)\n+174DD Extract Zip Spec      14 (20) '2.0'\n+174DE Extract OS            00 (0) 'MS-DOS'\n+174DF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-17230 Compression Method    0008 (8) 'Deflated'\n-17232 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-17236 CRC                   ACAF58B5 (2897172661)\n-1723A Compressed Size       0000020D (525)\n-1723E Uncompressed Size     00000394 (916)\n-17242 Filename Length       0042 (66)\n-17244 Extra Length          0000 (0)\n-17246 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+174E1 Compression Method    0008 (8) 'Deflated'\n+174E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+174E7 CRC                   09C52AF8 (163916536)\n+174EB Compressed Size       00000213 (531)\n+174EF Uncompressed Size     000003A9 (937)\n+174F3 Filename Length       0042 (66)\n+174F5 Extra Length          0000 (0)\n+174F7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x17246: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x174F7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-17288 PAYLOAD\n+17539 PAYLOAD\n \n-17495 LOCAL HEADER #92      04034B50 (67324752)\n-17499 Extract Zip Spec      14 (20) '2.0'\n-1749A Extract OS            00 (0) 'MS-DOS'\n-1749B General Purpose Flag  0800 (2048)\n+1774C LOCAL HEADER #92      04034B50 (67324752)\n+17750 Extract Zip Spec      14 (20) '2.0'\n+17751 Extract OS            00 (0) 'MS-DOS'\n+17752 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1749D Compression Method    0008 (8) 'Deflated'\n-1749F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-174A3 CRC                   963EDCDB (2520702171)\n-174A7 Compressed Size       00001A00 (6656)\n-174AB Uncompressed Size     0000723A (29242)\n-174AF Filename Length       003C (60)\n-174B1 Extra Length          0000 (0)\n-174B3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+17754 Compression Method    0008 (8) 'Deflated'\n+17756 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1775A CRC                   963EDCDB (2520702171)\n+1775E Compressed Size       00001A00 (6656)\n+17762 Uncompressed Size     0000723A (29242)\n+17766 Filename Length       003C (60)\n+17768 Extra Length          0000 (0)\n+1776A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x174B3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1776A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-174EF PAYLOAD\n+177A6 PAYLOAD\n \n-18EEF LOCAL HEADER #93      04034B50 (67324752)\n-18EF3 Extract Zip Spec      14 (20) '2.0'\n-18EF4 Extract OS            00 (0) 'MS-DOS'\n-18EF5 General Purpose Flag  0800 (2048)\n+191A6 LOCAL HEADER #93      04034B50 (67324752)\n+191AA Extract Zip Spec      14 (20) '2.0'\n+191AB Extract OS            00 (0) 'MS-DOS'\n+191AC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-18EF7 Compression Method    0008 (8) 'Deflated'\n-18EF9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-18EFD CRC                   FA47221B (4198965787)\n-18F01 Compressed Size       00001EE4 (7908)\n-18F05 Uncompressed Size     0000926E (37486)\n-18F09 Filename Length       003B (59)\n-18F0B Extra Length          0000 (0)\n-18F0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+191AE Compression Method    0008 (8) 'Deflated'\n+191B0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+191B4 CRC                   180ADDBE (403365310)\n+191B8 Compressed Size       00001F09 (7945)\n+191BC Uncompressed Size     000095B9 (38329)\n+191C0 Filename Length       003B (59)\n+191C2 Extra Length          0000 (0)\n+191C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x18F0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x191C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-18F48 PAYLOAD\n+191FF PAYLOAD\n \n-1AE2C LOCAL HEADER #94      04034B50 (67324752)\n-1AE30 Extract Zip Spec      14 (20) '2.0'\n-1AE31 Extract OS            00 (0) 'MS-DOS'\n-1AE32 General Purpose Flag  0800 (2048)\n+1B108 LOCAL HEADER #94      04034B50 (67324752)\n+1B10C Extract Zip Spec      14 (20) '2.0'\n+1B10D Extract OS            00 (0) 'MS-DOS'\n+1B10E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1AE34 Compression Method    0008 (8) 'Deflated'\n-1AE36 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1AE3A CRC                   14A86D48 (346582344)\n-1AE3E Compressed Size       00000360 (864)\n-1AE42 Uncompressed Size     0000082F (2095)\n-1AE46 Filename Length       0043 (67)\n-1AE48 Extra Length          0000 (0)\n-1AE4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B110 Compression Method    0008 (8) 'Deflated'\n+1B112 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B116 CRC                   7701B7FD (1996601341)\n+1B11A Compressed Size       0000036E (878)\n+1B11E Uncompressed Size     00000864 (2148)\n+1B122 Filename Length       0043 (67)\n+1B124 Extra Length          0000 (0)\n+1B126 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1AE4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B126: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1AE8D PAYLOAD\n+1B169 PAYLOAD\n \n-1B1ED LOCAL HEADER #95      04034B50 (67324752)\n-1B1F1 Extract Zip Spec      14 (20) '2.0'\n-1B1F2 Extract OS            00 (0) 'MS-DOS'\n-1B1F3 General Purpose Flag  0800 (2048)\n+1B4D7 LOCAL HEADER #95      04034B50 (67324752)\n+1B4DB Extract Zip Spec      14 (20) '2.0'\n+1B4DC Extract OS            00 (0) 'MS-DOS'\n+1B4DD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B1F5 Compression Method    0008 (8) 'Deflated'\n-1B1F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B1FB CRC                   A7748368 (2809430888)\n-1B1FF Compressed Size       000005DF (1503)\n-1B203 Uncompressed Size     00001148 (4424)\n-1B207 Filename Length       0036 (54)\n-1B209 Extra Length          0000 (0)\n-1B20B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1B4DF Compression Method    0008 (8) 'Deflated'\n+1B4E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1B4E5 CRC                   B5B90B55 (3048803157)\n+1B4E9 Compressed Size       000005EC (1516)\n+1B4ED Uncompressed Size     000011CD (4557)\n+1B4F1 Filename Length       0036 (54)\n+1B4F3 Extra Length          0000 (0)\n+1B4F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B20B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1B4F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B241 PAYLOAD\n+1B52B PAYLOAD\n \n-1B820 LOCAL HEADER #96      04034B50 (67324752)\n-1B824 Extract Zip Spec      14 (20) '2.0'\n-1B825 Extract OS            00 (0) 'MS-DOS'\n-1B826 General Purpose Flag  0800 (2048)\n+1BB17 LOCAL HEADER #96      04034B50 (67324752)\n+1BB1B Extract Zip Spec      14 (20) '2.0'\n+1BB1C Extract OS            00 (0) 'MS-DOS'\n+1BB1D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1B828 Compression Method    0008 (8) 'Deflated'\n-1B82A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1B82E CRC                   5117C509 (1360512265)\n-1B832 Compressed Size       000002C3 (707)\n-1B836 Uncompressed Size     000005CF (1487)\n-1B83A Filename Length       0039 (57)\n-1B83C Extra Length          0000 (0)\n-1B83E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1BB1F Compression Method    0008 (8) 'Deflated'\n+1BB21 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1BB25 CRC                   5117C509 (1360512265)\n+1BB29 Compressed Size       000002C3 (707)\n+1BB2D Uncompressed Size     000005CF (1487)\n+1BB31 Filename Length       0039 (57)\n+1BB33 Extra Length          0000 (0)\n+1BB35 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1B83E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BB35: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1B877 PAYLOAD\n+1BB6E PAYLOAD\n \n-1BB3A LOCAL HEADER #97      04034B50 (67324752)\n-1BB3E Extract Zip Spec      14 (20) '2.0'\n-1BB3F Extract OS            00 (0) 'MS-DOS'\n-1BB40 General Purpose Flag  0800 (2048)\n+1BE31 LOCAL HEADER #97      04034B50 (67324752)\n+1BE35 Extract Zip Spec      14 (20) '2.0'\n+1BE36 Extract OS            00 (0) 'MS-DOS'\n+1BE37 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BB42 Compression Method    0008 (8) 'Deflated'\n-1BB44 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1BB48 CRC                   FCC4145B (4240708699)\n-1BB4C Compressed Size       00000315 (789)\n-1BB50 Uncompressed Size     000006E0 (1760)\n-1BB54 Filename Length       0039 (57)\n-1BB56 Extra Length          0000 (0)\n-1BB58 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1BE39 Compression Method    0008 (8) 'Deflated'\n+1BE3B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1BE3F CRC                   FCC4145B (4240708699)\n+1BE43 Compressed Size       00000315 (789)\n+1BE47 Uncompressed Size     000006E0 (1760)\n+1BE4B Filename Length       0039 (57)\n+1BE4D Extra Length          0000 (0)\n+1BE4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BB58: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1BE4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BB91 PAYLOAD\n+1BE88 PAYLOAD\n \n-1BEA6 LOCAL HEADER #98      04034B50 (67324752)\n-1BEAA Extract Zip Spec      14 (20) '2.0'\n-1BEAB Extract OS            00 (0) 'MS-DOS'\n-1BEAC General Purpose Flag  0800 (2048)\n+1C19D LOCAL HEADER #98      04034B50 (67324752)\n+1C1A1 Extract Zip Spec      14 (20) '2.0'\n+1C1A2 Extract OS            00 (0) 'MS-DOS'\n+1C1A3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1BEAE Compression Method    0008 (8) 'Deflated'\n-1BEB0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1BEB4 CRC                   A6BC7A6B (2797369963)\n-1BEB8 Compressed Size       000002C6 (710)\n-1BEBC Uncompressed Size     000005DB (1499)\n-1BEC0 Filename Length       003B (59)\n-1BEC2 Extra Length          0000 (0)\n-1BEC4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C1A5 Compression Method    0008 (8) 'Deflated'\n+1C1A7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C1AB CRC                   A6BC7A6B (2797369963)\n+1C1AF Compressed Size       000002C6 (710)\n+1C1B3 Uncompressed Size     000005DB (1499)\n+1C1B7 Filename Length       003B (59)\n+1C1B9 Extra Length          0000 (0)\n+1C1BB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1BEC4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C1BB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1BEFF PAYLOAD\n+1C1F6 PAYLOAD\n \n-1C1C5 LOCAL HEADER #99      04034B50 (67324752)\n-1C1C9 Extract Zip Spec      14 (20) '2.0'\n-1C1CA Extract OS            00 (0) 'MS-DOS'\n-1C1CB General Purpose Flag  0800 (2048)\n+1C4BC LOCAL HEADER #99      04034B50 (67324752)\n+1C4C0 Extract Zip Spec      14 (20) '2.0'\n+1C4C1 Extract OS            00 (0) 'MS-DOS'\n+1C4C2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C1CD Compression Method    0008 (8) 'Deflated'\n-1C1CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C1D3 CRC                   CDD77CC5 (3453451461)\n-1C1D7 Compressed Size       00000317 (791)\n-1C1DB Uncompressed Size     000006EA (1770)\n-1C1DF Filename Length       003B (59)\n-1C1E1 Extra Length          0000 (0)\n-1C1E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C4C4 Compression Method    0008 (8) 'Deflated'\n+1C4C6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C4CA CRC                   CDD77CC5 (3453451461)\n+1C4CE Compressed Size       00000317 (791)\n+1C4D2 Uncompressed Size     000006EA (1770)\n+1C4D6 Filename Length       003B (59)\n+1C4D8 Extra Length          0000 (0)\n+1C4DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C1E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C4DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C21E PAYLOAD\n+1C515 PAYLOAD\n \n-1C535 LOCAL HEADER #100     04034B50 (67324752)\n-1C539 Extract Zip Spec      14 (20) '2.0'\n-1C53A Extract OS            00 (0) 'MS-DOS'\n-1C53B General Purpose Flag  0800 (2048)\n+1C82C LOCAL HEADER #100     04034B50 (67324752)\n+1C830 Extract Zip Spec      14 (20) '2.0'\n+1C831 Extract OS            00 (0) 'MS-DOS'\n+1C832 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C53D Compression Method    0008 (8) 'Deflated'\n-1C53F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C543 CRC                   1D384067 (490225767)\n-1C547 Compressed Size       000002C5 (709)\n-1C54B Uncompressed Size     0000059E (1438)\n-1C54F Filename Length       0031 (49)\n-1C551 Extra Length          0000 (0)\n-1C553 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1C834 Compression Method    0008 (8) 'Deflated'\n+1C836 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1C83A CRC                   5112EBCA (1360194506)\n+1C83E Compressed Size       000002CC (716)\n+1C842 Uncompressed Size     000005C7 (1479)\n+1C846 Filename Length       0031 (49)\n+1C848 Extra Length          0000 (0)\n+1C84A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C553: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1C84A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C584 PAYLOAD\n+1C87B PAYLOAD\n \n-1C849 LOCAL HEADER #101     04034B50 (67324752)\n-1C84D Extract Zip Spec      14 (20) '2.0'\n-1C84E Extract OS            00 (0) 'MS-DOS'\n-1C84F General Purpose Flag  0800 (2048)\n+1CB47 LOCAL HEADER #101     04034B50 (67324752)\n+1CB4B Extract Zip Spec      14 (20) '2.0'\n+1CB4C Extract OS            00 (0) 'MS-DOS'\n+1CB4D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1C851 Compression Method    0008 (8) 'Deflated'\n-1C853 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1C857 CRC                   F2E8FAB9 (4075354809)\n-1C85B Compressed Size       00000369 (873)\n-1C85F Uncompressed Size     00000826 (2086)\n-1C863 Filename Length       003B (59)\n-1C865 Extra Length          0000 (0)\n-1C867 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CB4F Compression Method    0008 (8) 'Deflated'\n+1CB51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1CB55 CRC                   F2E8FAB9 (4075354809)\n+1CB59 Compressed Size       00000369 (873)\n+1CB5D Uncompressed Size     00000826 (2086)\n+1CB61 Filename Length       003B (59)\n+1CB63 Extra Length          0000 (0)\n+1CB65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1C867: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CB65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1C8A2 PAYLOAD\n+1CBA0 PAYLOAD\n \n-1CC0B LOCAL HEADER #102     04034B50 (67324752)\n-1CC0F Extract Zip Spec      14 (20) '2.0'\n-1CC10 Extract OS            00 (0) 'MS-DOS'\n-1CC11 General Purpose Flag  0800 (2048)\n+1CF09 LOCAL HEADER #102     04034B50 (67324752)\n+1CF0D Extract Zip Spec      14 (20) '2.0'\n+1CF0E Extract OS            00 (0) 'MS-DOS'\n+1CF0F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1CC13 Compression Method    0008 (8) 'Deflated'\n-1CC15 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1CC19 CRC                   5DDCD4C5 (1574753477)\n-1CC1D Compressed Size       0000124E (4686)\n-1CC21 Uncompressed Size     0000537F (21375)\n-1CC25 Filename Length       0037 (55)\n-1CC27 Extra Length          0000 (0)\n-1CC29 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1CF11 Compression Method    0008 (8) 'Deflated'\n+1CF13 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1CF17 CRC                   5DDCD4C5 (1574753477)\n+1CF1B Compressed Size       0000124E (4686)\n+1CF1F Uncompressed Size     0000537F (21375)\n+1CF23 Filename Length       0037 (55)\n+1CF25 Extra Length          0000 (0)\n+1CF27 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1CC29: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1CF27: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1CC60 PAYLOAD\n+1CF5E PAYLOAD\n \n-1DEAE LOCAL HEADER #103     04034B50 (67324752)\n-1DEB2 Extract Zip Spec      14 (20) '2.0'\n-1DEB3 Extract OS            00 (0) 'MS-DOS'\n-1DEB4 General Purpose Flag  0800 (2048)\n+1E1AC LOCAL HEADER #103     04034B50 (67324752)\n+1E1B0 Extract Zip Spec      14 (20) '2.0'\n+1E1B1 Extract OS            00 (0) 'MS-DOS'\n+1E1B2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1DEB6 Compression Method    0008 (8) 'Deflated'\n-1DEB8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1DEBC CRC                   5BC81E29 (1539841577)\n-1DEC0 Compressed Size       000008C4 (2244)\n-1DEC4 Uncompressed Size     00001D8A (7562)\n-1DEC8 Filename Length       003E (62)\n-1DECA Extra Length          0000 (0)\n-1DECC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1E1B4 Compression Method    0008 (8) 'Deflated'\n+1E1B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1E1BA CRC                   5BC81E29 (1539841577)\n+1E1BE Compressed Size       000008C4 (2244)\n+1E1C2 Uncompressed Size     00001D8A (7562)\n+1E1C6 Filename Length       003E (62)\n+1E1C8 Extra Length          0000 (0)\n+1E1CA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1DECC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1E1CA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1DF0A PAYLOAD\n+1E208 PAYLOAD\n \n-1E7CE LOCAL HEADER #104     04034B50 (67324752)\n-1E7D2 Extract Zip Spec      14 (20) '2.0'\n-1E7D3 Extract OS            00 (0) 'MS-DOS'\n-1E7D4 General Purpose Flag  0800 (2048)\n+1EACC LOCAL HEADER #104     04034B50 (67324752)\n+1EAD0 Extract Zip Spec      14 (20) '2.0'\n+1EAD1 Extract OS            00 (0) 'MS-DOS'\n+1EAD2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1E7D6 Compression Method    0008 (8) 'Deflated'\n-1E7D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1E7DC CRC                   A266F3B2 (2724656050)\n-1E7E0 Compressed Size       00000BED (3053)\n-1E7E4 Uncompressed Size     0000462E (17966)\n-1E7E8 Filename Length       0037 (55)\n-1E7EA Extra Length          0000 (0)\n-1E7EC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1EAD4 Compression Method    0008 (8) 'Deflated'\n+1EAD6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1EADA CRC                   A266F3B2 (2724656050)\n+1EADE Compressed Size       00000BED (3053)\n+1EAE2 Uncompressed Size     0000462E (17966)\n+1EAE6 Filename Length       0037 (55)\n+1EAE8 Extra Length          0000 (0)\n+1EAEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1E7EC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1EAEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1E823 PAYLOAD\n+1EB21 PAYLOAD\n \n-1F410 LOCAL HEADER #105     04034B50 (67324752)\n-1F414 Extract Zip Spec      14 (20) '2.0'\n-1F415 Extract OS            00 (0) 'MS-DOS'\n-1F416 General Purpose Flag  0800 (2048)\n+1F70E LOCAL HEADER #105     04034B50 (67324752)\n+1F712 Extract Zip Spec      14 (20) '2.0'\n+1F713 Extract OS            00 (0) 'MS-DOS'\n+1F714 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F418 Compression Method    0008 (8) 'Deflated'\n-1F41A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F41E CRC                   952E3CF5 (2502835445)\n-1F422 Compressed Size       000002C7 (711)\n-1F426 Uncompressed Size     00000552 (1362)\n-1F42A Filename Length       0043 (67)\n-1F42C Extra Length          0000 (0)\n-1F42E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1F716 Compression Method    0008 (8) 'Deflated'\n+1F718 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1F71C CRC                   952E3CF5 (2502835445)\n+1F720 Compressed Size       000002C7 (711)\n+1F724 Uncompressed Size     00000552 (1362)\n+1F728 Filename Length       0043 (67)\n+1F72A Extra Length          0000 (0)\n+1F72C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F42E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1F72C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F471 PAYLOAD\n+1F76F PAYLOAD\n \n-1F738 LOCAL HEADER #106     04034B50 (67324752)\n-1F73C Extract Zip Spec      14 (20) '2.0'\n-1F73D Extract OS            00 (0) 'MS-DOS'\n-1F73E General Purpose Flag  0800 (2048)\n+1FA36 LOCAL HEADER #106     04034B50 (67324752)\n+1FA3A Extract Zip Spec      14 (20) '2.0'\n+1FA3B Extract OS            00 (0) 'MS-DOS'\n+1FA3C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F740 Compression Method    0008 (8) 'Deflated'\n-1F742 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F746 CRC                   764EE4B3 (1984881843)\n-1F74A Compressed Size       00000033 (51)\n-1F74E Uncompressed Size     0000003F (63)\n-1F752 Filename Length       0044 (68)\n-1F754 Extra Length          0000 (0)\n-1F756 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FA3E Compression Method    0008 (8) 'Deflated'\n+1FA40 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FA44 CRC                   764EE4B3 (1984881843)\n+1FA48 Compressed Size       00000033 (51)\n+1FA4C Uncompressed Size     0000003F (63)\n+1FA50 Filename Length       0044 (68)\n+1FA52 Extra Length          0000 (0)\n+1FA54 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F756: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FA54: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F79A PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FA98 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1F7CD LOCAL HEADER #107     04034B50 (67324752)\n-1F7D1 Extract Zip Spec      14 (20) '2.0'\n-1F7D2 Extract OS            00 (0) 'MS-DOS'\n-1F7D3 General Purpose Flag  0800 (2048)\n+1FACB LOCAL HEADER #107     04034B50 (67324752)\n+1FACF Extract Zip Spec      14 (20) '2.0'\n+1FAD0 Extract OS            00 (0) 'MS-DOS'\n+1FAD1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F7D5 Compression Method    0008 (8) 'Deflated'\n-1F7D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F7DB CRC                   0FE2368F (266483343)\n-1F7DF Compressed Size       00000043 (67)\n-1F7E3 Uncompressed Size     00000055 (85)\n-1F7E7 Filename Length       003C (60)\n-1F7E9 Extra Length          0000 (0)\n-1F7EB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FAD3 Compression Method    0008 (8) 'Deflated'\n+1FAD5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FAD9 CRC                   0FE2368F (266483343)\n+1FADD Compressed Size       00000043 (67)\n+1FAE1 Uncompressed Size     00000055 (85)\n+1FAE5 Filename Length       003C (60)\n+1FAE7 Extra Length          0000 (0)\n+1FAE9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F7EB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FAE9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F827 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FB25 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1F86A LOCAL HEADER #108     04034B50 (67324752)\n-1F86E Extract Zip Spec      14 (20) '2.0'\n-1F86F Extract OS            00 (0) 'MS-DOS'\n-1F870 General Purpose Flag  0800 (2048)\n+1FB68 LOCAL HEADER #108     04034B50 (67324752)\n+1FB6C Extract Zip Spec      14 (20) '2.0'\n+1FB6D Extract OS            00 (0) 'MS-DOS'\n+1FB6E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F872 Compression Method    0008 (8) 'Deflated'\n-1F874 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F878 CRC                   93CA6C9E (2479516830)\n-1F87C Compressed Size       00000044 (68)\n-1F880 Uncompressed Size     0000004D (77)\n-1F884 Filename Length       0044 (68)\n-1F886 Extra Length          0000 (0)\n-1F888 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FB70 Compression Method    0008 (8) 'Deflated'\n+1FB72 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FB76 CRC                   93CA6C9E (2479516830)\n+1FB7A Compressed Size       00000044 (68)\n+1FB7E Uncompressed Size     0000004D (77)\n+1FB82 Filename Length       0044 (68)\n+1FB84 Extra Length          0000 (0)\n+1FB86 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F888: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FB86: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F8CC PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FBCA PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1F910 LOCAL HEADER #109     04034B50 (67324752)\n-1F914 Extract Zip Spec      14 (20) '2.0'\n-1F915 Extract OS            00 (0) 'MS-DOS'\n-1F916 General Purpose Flag  0800 (2048)\n+1FC0E LOCAL HEADER #109     04034B50 (67324752)\n+1FC12 Extract Zip Spec      14 (20) '2.0'\n+1FC13 Extract OS            00 (0) 'MS-DOS'\n+1FC14 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F918 Compression Method    0008 (8) 'Deflated'\n-1F91A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F91E CRC                   4B7CAED5 (1266462421)\n-1F922 Compressed Size       0000004D (77)\n-1F926 Uncompressed Size     00000057 (87)\n-1F92A Filename Length       0049 (73)\n-1F92C Extra Length          0000 (0)\n-1F92E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FC16 Compression Method    0008 (8) 'Deflated'\n+1FC18 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FC1C CRC                   4B7CAED5 (1266462421)\n+1FC20 Compressed Size       0000004D (77)\n+1FC24 Uncompressed Size     00000057 (87)\n+1FC28 Filename Length       0049 (73)\n+1FC2A Extra Length          0000 (0)\n+1FC2C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F92E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FC2C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1F977 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FC75 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1F9C4 LOCAL HEADER #110     04034B50 (67324752)\n-1F9C8 Extract Zip Spec      14 (20) '2.0'\n-1F9C9 Extract OS            00 (0) 'MS-DOS'\n-1F9CA General Purpose Flag  0800 (2048)\n+1FCC2 LOCAL HEADER #110     04034B50 (67324752)\n+1FCC6 Extract Zip Spec      14 (20) '2.0'\n+1FCC7 Extract OS            00 (0) 'MS-DOS'\n+1FCC8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1F9CC Compression Method    0008 (8) 'Deflated'\n-1F9CE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1F9D2 CRC                   83C8809D (2210955421)\n-1F9D6 Compressed Size       00000057 (87)\n-1F9DA Uncompressed Size     00000094 (148)\n-1F9DE Filename Length       0041 (65)\n-1F9E0 Extra Length          0000 (0)\n-1F9E2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FCCA Compression Method    0008 (8) 'Deflated'\n+1FCCC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FCD0 CRC                   CDA6F1A6 (3450270118)\n+1FCD4 Compressed Size       00000058 (88)\n+1FCD8 Uncompressed Size     00000095 (149)\n+1FCDC Filename Length       0041 (65)\n+1FCDE Extra Length          0000 (0)\n+1FCE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1F9E2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FCE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FA23 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FD21 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FA7A LOCAL HEADER #111     04034B50 (67324752)\n-1FA7E Extract Zip Spec      14 (20) '2.0'\n-1FA7F Extract OS            00 (0) 'MS-DOS'\n-1FA80 General Purpose Flag  0800 (2048)\n+1FD79 LOCAL HEADER #111     04034B50 (67324752)\n+1FD7D Extract Zip Spec      14 (20) '2.0'\n+1FD7E Extract OS            00 (0) 'MS-DOS'\n+1FD7F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FA82 Compression Method    0008 (8) 'Deflated'\n-1FA84 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FA88 CRC                   290EDBFF (688839679)\n-1FA8C Compressed Size       00000040 (64)\n-1FA90 Uncompressed Size     00000049 (73)\n-1FA94 Filename Length       0052 (82)\n-1FA96 Extra Length          0000 (0)\n-1FA98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FD81 Compression Method    0008 (8) 'Deflated'\n+1FD83 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FD87 CRC                   290EDBFF (688839679)\n+1FD8B Compressed Size       00000040 (64)\n+1FD8F Uncompressed Size     00000049 (73)\n+1FD93 Filename Length       0052 (82)\n+1FD95 Extra Length          0000 (0)\n+1FD97 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FA98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FD97: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FAEA PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FDE9 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FB2A LOCAL HEADER #112     04034B50 (67324752)\n-1FB2E Extract Zip Spec      14 (20) '2.0'\n-1FB2F Extract OS            00 (0) 'MS-DOS'\n-1FB30 General Purpose Flag  0800 (2048)\n+1FE29 LOCAL HEADER #112     04034B50 (67324752)\n+1FE2D Extract Zip Spec      14 (20) '2.0'\n+1FE2E Extract OS            00 (0) 'MS-DOS'\n+1FE2F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FB32 Compression Method    0008 (8) 'Deflated'\n-1FB34 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FB38 CRC                   1BD83592 (467154322)\n-1FB3C Compressed Size       00000040 (64)\n-1FB40 Uncompressed Size     00000040 (64)\n-1FB44 Filename Length       0049 (73)\n-1FB46 Extra Length          0000 (0)\n-1FB48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FE31 Compression Method    0008 (8) 'Deflated'\n+1FE33 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FE37 CRC                   1BD83592 (467154322)\n+1FE3B Compressed Size       00000040 (64)\n+1FE3F Uncompressed Size     00000040 (64)\n+1FE43 Filename Length       0049 (73)\n+1FE45 Extra Length          0000 (0)\n+1FE47 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FB48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FE47: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FB91 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FE90 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FBD1 LOCAL HEADER #113     04034B50 (67324752)\n-1FBD5 Extract Zip Spec      14 (20) '2.0'\n-1FBD6 Extract OS            00 (0) 'MS-DOS'\n-1FBD7 General Purpose Flag  0800 (2048)\n+1FED0 LOCAL HEADER #113     04034B50 (67324752)\n+1FED4 Extract Zip Spec      14 (20) '2.0'\n+1FED5 Extract OS            00 (0) 'MS-DOS'\n+1FED6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FBD9 Compression Method    0008 (8) 'Deflated'\n-1FBDB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FBDF CRC                   C6FA5A39 (3338295865)\n-1FBE3 Compressed Size       00000044 (68)\n-1FBE7 Uncompressed Size     00000047 (71)\n-1FBEB Filename Length       0050 (80)\n-1FBED Extra Length          0000 (0)\n-1FBEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FED8 Compression Method    0008 (8) 'Deflated'\n+1FEDA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FEDE CRC                   C6FA5A39 (3338295865)\n+1FEE2 Compressed Size       00000044 (68)\n+1FEE6 Uncompressed Size     00000047 (71)\n+1FEEA Filename Length       0050 (80)\n+1FEEC Extra Length          0000 (0)\n+1FEEE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FBEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FEEE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FC3F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FF3E PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FC83 LOCAL HEADER #114     04034B50 (67324752)\n-1FC87 Extract Zip Spec      14 (20) '2.0'\n-1FC88 Extract OS            00 (0) 'MS-DOS'\n-1FC89 General Purpose Flag  0800 (2048)\n+1FF82 LOCAL HEADER #114     04034B50 (67324752)\n+1FF86 Extract Zip Spec      14 (20) '2.0'\n+1FF87 Extract OS            00 (0) 'MS-DOS'\n+1FF88 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FC8B Compression Method    0008 (8) 'Deflated'\n-1FC8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FC91 CRC                   2E8D92A5 (781030053)\n-1FC95 Compressed Size       000000AF (175)\n-1FC99 Uncompressed Size     00000238 (568)\n-1FC9D Filename Length       0052 (82)\n-1FC9F Extra Length          0000 (0)\n-1FCA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+1FF8A Compression Method    0008 (8) 'Deflated'\n+1FF8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+1FF90 CRC                   059BF276 (94106230)\n+1FF94 Compressed Size       000000B0 (176)\n+1FF98 Uncompressed Size     0000023E (574)\n+1FF9C Filename Length       0052 (82)\n+1FF9E Extra Length          0000 (0)\n+1FFA0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FCA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x1FFA0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FCF3 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n-                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+1FFF2 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+                            XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FDA2 LOCAL HEADER #115     04034B50 (67324752)\n-1FDA6 Extract Zip Spec      14 (20) '2.0'\n-1FDA7 Extract OS            00 (0) 'MS-DOS'\n-1FDA8 General Purpose Flag  0800 (2048)\n+200A2 LOCAL HEADER #115     04034B50 (67324752)\n+200A6 Extract Zip Spec      14 (20) '2.0'\n+200A7 Extract OS            00 (0) 'MS-DOS'\n+200A8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FDAA Compression Method    0008 (8) 'Deflated'\n-1FDAC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FDB0 CRC                   2937F90B (691534091)\n-1FDB4 Compressed Size       0000005F (95)\n-1FDB8 Uncompressed Size     000000B0 (176)\n-1FDBC Filename Length       005B (91)\n-1FDBE Extra Length          0000 (0)\n-1FDC0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+200AA Compression Method    0008 (8) 'Deflated'\n+200AC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+200B0 CRC                   043D8CD3 (71142611)\n+200B4 Compressed Size       00000061 (97)\n+200B8 Uncompressed Size     000000B1 (177)\n+200BC Filename Length       005B (91)\n+200BE Extra Length          0000 (0)\n+200C0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FDC0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x200C0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FE1B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+2011B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FE7A LOCAL HEADER #116     04034B50 (67324752)\n-1FE7E Extract Zip Spec      14 (20) '2.0'\n-1FE7F Extract OS            00 (0) 'MS-DOS'\n-1FE80 General Purpose Flag  0800 (2048)\n+2017C LOCAL HEADER #116     04034B50 (67324752)\n+20180 Extract Zip Spec      14 (20) '2.0'\n+20181 Extract OS            00 (0) 'MS-DOS'\n+20182 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FE82 Compression Method    0008 (8) 'Deflated'\n-1FE84 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FE88 CRC                   A49FCF77 (2761936759)\n-1FE8C Compressed Size       0000004D (77)\n-1FE90 Uncompressed Size     00000054 (84)\n-1FE94 Filename Length       005B (91)\n-1FE96 Extra Length          0000 (0)\n-1FE98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20184 Compression Method    0008 (8) 'Deflated'\n+20186 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2018A CRC                   A49FCF77 (2761936759)\n+2018E Compressed Size       0000004D (77)\n+20192 Uncompressed Size     00000054 (84)\n+20196 Filename Length       005B (91)\n+20198 Extra Length          0000 (0)\n+2019A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FE98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2019A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FEF3 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+201F5 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-1FF40 LOCAL HEADER #117     04034B50 (67324752)\n-1FF44 Extract Zip Spec      14 (20) '2.0'\n-1FF45 Extract OS            00 (0) 'MS-DOS'\n-1FF46 General Purpose Flag  0800 (2048)\n+20242 LOCAL HEADER #117     04034B50 (67324752)\n+20246 Extract Zip Spec      14 (20) '2.0'\n+20247 Extract OS            00 (0) 'MS-DOS'\n+20248 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-1FF48 Compression Method    0008 (8) 'Deflated'\n-1FF4A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1FF4E CRC                   F515114D (4111798605)\n-1FF52 Compressed Size       00000049 (73)\n-1FF56 Uncompressed Size     00000054 (84)\n-1FF5A Filename Length       005D (93)\n-1FF5C Extra Length          0000 (0)\n-1FF5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2024A Compression Method    0008 (8) 'Deflated'\n+2024C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20250 CRC                   F515114D (4111798605)\n+20254 Compressed Size       00000049 (73)\n+20258 Uncompressed Size     00000054 (84)\n+2025C Filename Length       005D (93)\n+2025E Extra Length          0000 (0)\n+20260 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x1FF5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20260: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-1FFBB PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+202BD PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-20004 LOCAL HEADER #118     04034B50 (67324752)\n-20008 Extract Zip Spec      14 (20) '2.0'\n-20009 Extract OS            00 (0) 'MS-DOS'\n-2000A General Purpose Flag  0800 (2048)\n+20306 LOCAL HEADER #118     04034B50 (67324752)\n+2030A Extract Zip Spec      14 (20) '2.0'\n+2030B Extract OS            00 (0) 'MS-DOS'\n+2030C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2000C Compression Method    0008 (8) 'Deflated'\n-2000E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20012 CRC                   285254BA (676484282)\n-20016 Compressed Size       00000045 (69)\n-2001A Uncompressed Size     0000004E (78)\n-2001E Filename Length       0059 (89)\n-20020 Extra Length          0000 (0)\n-20022 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2030E Compression Method    0008 (8) 'Deflated'\n+20310 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20314 CRC                   285254BA (676484282)\n+20318 Compressed Size       00000045 (69)\n+2031C Uncompressed Size     0000004E (78)\n+20320 Filename Length       0059 (89)\n+20322 Extra Length          0000 (0)\n+20324 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20022: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20324: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2007B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+2037D PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-200C0 LOCAL HEADER #119     04034B50 (67324752)\n-200C4 Extract Zip Spec      14 (20) '2.0'\n-200C5 Extract OS            00 (0) 'MS-DOS'\n-200C6 General Purpose Flag  0800 (2048)\n+203C2 LOCAL HEADER #119     04034B50 (67324752)\n+203C6 Extract Zip Spec      14 (20) '2.0'\n+203C7 Extract OS            00 (0) 'MS-DOS'\n+203C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-200C8 Compression Method    0008 (8) 'Deflated'\n-200CA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-200CE CRC                   9DAB4985 (2645248389)\n-200D2 Compressed Size       0000003E (62)\n-200D6 Uncompressed Size     0000004A (74)\n-200DA Filename Length       0056 (86)\n-200DC Extra Length          0000 (0)\n-200DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+203CA Compression Method    0008 (8) 'Deflated'\n+203CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+203D0 CRC                   9DAB4985 (2645248389)\n+203D4 Compressed Size       0000003E (62)\n+203D8 Uncompressed Size     0000004A (74)\n+203DC Filename Length       0056 (86)\n+203DE Extra Length          0000 (0)\n+203E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x200DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x203E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-20134 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+20436 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-20172 LOCAL HEADER #120     04034B50 (67324752)\n-20176 Extract Zip Spec      14 (20) '2.0'\n-20177 Extract OS            00 (0) 'MS-DOS'\n-20178 General Purpose Flag  0800 (2048)\n+20474 LOCAL HEADER #120     04034B50 (67324752)\n+20478 Extract Zip Spec      14 (20) '2.0'\n+20479 Extract OS            00 (0) 'MS-DOS'\n+2047A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2017A Compression Method    0008 (8) 'Deflated'\n-2017C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20180 CRC                   7DCDDED9 (2110643929)\n-20184 Compressed Size       0000005D (93)\n-20188 Uncompressed Size     000000A4 (164)\n-2018C Filename Length       0035 (53)\n-2018E Extra Length          0000 (0)\n-20190 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2047C Compression Method    0008 (8) 'Deflated'\n+2047E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20482 CRC                   B5A015DF (3047167455)\n+20486 Compressed Size       0000005F (95)\n+2048A Uncompressed Size     000000A5 (165)\n+2048E Filename Length       0035 (53)\n+20490 Extra Length          0000 (0)\n+20492 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20190: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20492: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-201C5 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+204C7 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-20222 LOCAL HEADER #121     04034B50 (67324752)\n-20226 Extract Zip Spec      14 (20) '2.0'\n-20227 Extract OS            00 (0) 'MS-DOS'\n-20228 General Purpose Flag  0800 (2048)\n+20526 LOCAL HEADER #121     04034B50 (67324752)\n+2052A Extract Zip Spec      14 (20) '2.0'\n+2052B Extract OS            00 (0) 'MS-DOS'\n+2052C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2022A Compression Method    0008 (8) 'Deflated'\n-2022C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20230 CRC                   050B85C5 (84641221)\n-20234 Compressed Size       000003F2 (1010)\n-20238 Uncompressed Size     00000CF1 (3313)\n-2023C Filename Length       003A (58)\n-2023E Extra Length          0000 (0)\n-20240 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2052E Compression Method    0008 (8) 'Deflated'\n+20530 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20534 CRC                   C9D6A7C1 (3386288065)\n+20538 Compressed Size       000003E9 (1001)\n+2053C Uncompressed Size     00000C99 (3225)\n+20540 Filename Length       003A (58)\n+20542 Extra Length          0000 (0)\n+20544 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20240: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20544: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2027A PAYLOAD\n+2057E PAYLOAD\n \n-2066C LOCAL HEADER #122     04034B50 (67324752)\n-20670 Extract Zip Spec      14 (20) '2.0'\n-20671 Extract OS            00 (0) 'MS-DOS'\n-20672 General Purpose Flag  0800 (2048)\n+20967 LOCAL HEADER #122     04034B50 (67324752)\n+2096B Extract Zip Spec      14 (20) '2.0'\n+2096C Extract OS            00 (0) 'MS-DOS'\n+2096D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20674 Compression Method    0008 (8) 'Deflated'\n-20676 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2067A CRC                   30325669 (808605289)\n-2067E Compressed Size       00000047 (71)\n-20682 Uncompressed Size     00000049 (73)\n-20686 Filename Length       0041 (65)\n-20688 Extra Length          0000 (0)\n-2068A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2096F Compression Method    0008 (8) 'Deflated'\n+20971 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20975 CRC                   30325669 (808605289)\n+20979 Compressed Size       00000047 (71)\n+2097D Uncompressed Size     00000049 (73)\n+20981 Filename Length       0041 (65)\n+20983 Extra Length          0000 (0)\n+20985 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2068A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20985: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-206CB PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+209C6 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-20712 CENTRAL HEADER #1     02014B50 (33639248)\n-20716 Created Zip Spec      14 (20) '2.0'\n-20717 Created OS            03 (3) 'Unix'\n-20718 Extract Zip Spec      14 (20) '2.0'\n-20719 Extract OS            00 (0) 'MS-DOS'\n-2071A General Purpose Flag  0800 (2048)\n+20A0D CENTRAL HEADER #1     02014B50 (33639248)\n+20A11 Created Zip Spec      14 (20) '2.0'\n+20A12 Created OS            03 (3) 'Unix'\n+20A13 Extract Zip Spec      14 (20) '2.0'\n+20A14 Extract OS            00 (0) 'MS-DOS'\n+20A15 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2071C Compression Method    0008 (8) 'Deflated'\n-2071E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20722 CRC                   A689EB18 (2794056472)\n-20726 Compressed Size       00000042 (66)\n-2072A Uncompressed Size     00000040 (64)\n-2072E Filename Length       0014 (20)\n-20730 Extra Length          0000 (0)\n-20732 Comment Length        0000 (0)\n-20734 Disk Start            0000 (0)\n-20736 Int File Attributes   0000 (0)\n+20A17 Compression Method    0008 (8) 'Deflated'\n+20A19 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20A1D CRC                   A689EB18 (2794056472)\n+20A21 Compressed Size       00000042 (66)\n+20A25 Uncompressed Size     00000040 (64)\n+20A29 Filename Length       0014 (20)\n+20A2B Extra Length          0000 (0)\n+20A2D Comment Length        0000 (0)\n+20A2F Disk Start            0000 (0)\n+20A31 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20738 Ext File Attributes   81A40000 (2175008768)\n+20A33 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2073C Local Header Offset   00000000 (0)\n-20740 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+20A37 Local Header Offset   00000000 (0)\n+20A3B Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20740: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20A3B: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20754 CENTRAL HEADER #2     02014B50 (33639248)\n-20758 Created Zip Spec      14 (20) '2.0'\n-20759 Created OS            03 (3) 'Unix'\n-2075A Extract Zip Spec      0A (10) '1.0'\n-2075B Extract OS            00 (0) 'MS-DOS'\n-2075C General Purpose Flag  0800 (2048)\n+20A4F CENTRAL HEADER #2     02014B50 (33639248)\n+20A53 Created Zip Spec      14 (20) '2.0'\n+20A54 Created OS            03 (3) 'Unix'\n+20A55 Extract Zip Spec      0A (10) '1.0'\n+20A56 Extract OS            00 (0) 'MS-DOS'\n+20A57 General Purpose Flag  0800 (2048)\n       [Bit 11]              1 'Language Encoding'\n-2075E Compression Method    0000 (0) 'Stored'\n-20760 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20764 CRC                   00000000 (0)\n-20768 Compressed Size       00000000 (0)\n-2076C Uncompressed Size     00000000 (0)\n-20770 Filename Length       0009 (9)\n-20772 Extra Length          0000 (0)\n-20774 Comment Length        0000 (0)\n-20776 Disk Start            0000 (0)\n-20778 Int File Attributes   0000 (0)\n+20A59 Compression Method    0000 (0) 'Stored'\n+20A5B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20A5F CRC                   00000000 (0)\n+20A63 Compressed Size       00000000 (0)\n+20A67 Uncompressed Size     00000000 (0)\n+20A6B Filename Length       0009 (9)\n+20A6D Extra Length          0000 (0)\n+20A6F Comment Length        0000 (0)\n+20A71 Disk Start            0000 (0)\n+20A73 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2077A Ext File Attributes   41ED0010 (1106051088)\n+20A75 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-2077E Local Header Offset   00000074 (116)\n-20782 Filename              'XXXXXXXXX'\n+20A79 Local Header Offset   00000074 (116)\n+20A7D Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x20782: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x20A7D: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20782: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20A7D: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x2075A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x20A55: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-2078B CENTRAL HEADER #3     02014B50 (33639248)\n-2078F Created Zip Spec      14 (20) '2.0'\n-20790 Created OS            03 (3) 'Unix'\n-20791 Extract Zip Spec      0A (10) '1.0'\n-20792 Extract OS            00 (0) 'MS-DOS'\n-20793 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20795 Compression Method    0000 (0) 'Stored'\n-20797 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2079B CRC                   00000000 (0)\n-2079F Compressed Size       00000000 (0)\n-207A3 Uncompressed Size     00000000 (0)\n-207A7 Filename Length       0004 (4)\n-207A9 Extra Length          0000 (0)\n-207AB Comment Length        0000 (0)\n-207AD Disk Start            0000 (0)\n-207AF Int File Attributes   0000 (0)\n+20A86 CENTRAL HEADER #3     02014B50 (33639248)\n+20A8A Created Zip Spec      14 (20) '2.0'\n+20A8B Created OS            03 (3) 'Unix'\n+20A8C Extract Zip Spec      0A (10) '1.0'\n+20A8D Extract OS            00 (0) 'MS-DOS'\n+20A8E General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20A90 Compression Method    0000 (0) 'Stored'\n+20A92 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20A96 CRC                   00000000 (0)\n+20A9A Compressed Size       00000000 (0)\n+20A9E Uncompressed Size     00000000 (0)\n+20AA2 Filename Length       0004 (4)\n+20AA4 Extra Length          0000 (0)\n+20AA6 Comment Length        0000 (0)\n+20AA8 Disk Start            0000 (0)\n+20AAA Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-207B1 Ext File Attributes   41ED0010 (1106051088)\n+20AAC Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-207B5 Local Header Offset   0000009B (155)\n-207B9 Filename              'XXXX'\n+20AB0 Local Header Offset   0000009B (155)\n+20AB4 Filename              'XXXX'\n #\n-# WARNING: Offset 0x207B9: Filename 'XXXX'\n+# WARNING: Offset 0x20AB4: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x207B9: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x20AB4: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20791: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x20A8C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-207BD CENTRAL HEADER #4     02014B50 (33639248)\n-207C1 Created Zip Spec      14 (20) '2.0'\n-207C2 Created OS            03 (3) 'Unix'\n-207C3 Extract Zip Spec      0A (10) '1.0'\n-207C4 Extract OS            00 (0) 'MS-DOS'\n-207C5 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-207C7 Compression Method    0000 (0) 'Stored'\n-207C9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-207CD CRC                   00000000 (0)\n-207D1 Compressed Size       00000000 (0)\n-207D5 Uncompressed Size     00000000 (0)\n-207D9 Filename Length       000B (11)\n-207DB Extra Length          0000 (0)\n-207DD Comment Length        0000 (0)\n-207DF Disk Start            0000 (0)\n-207E1 Int File Attributes   0000 (0)\n+20AB8 CENTRAL HEADER #4     02014B50 (33639248)\n+20ABC Created Zip Spec      14 (20) '2.0'\n+20ABD Created OS            03 (3) 'Unix'\n+20ABE Extract Zip Spec      0A (10) '1.0'\n+20ABF Extract OS            00 (0) 'MS-DOS'\n+20AC0 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20AC2 Compression Method    0000 (0) 'Stored'\n+20AC4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20AC8 CRC                   00000000 (0)\n+20ACC Compressed Size       00000000 (0)\n+20AD0 Uncompressed Size     00000000 (0)\n+20AD4 Filename Length       000B (11)\n+20AD6 Extra Length          0000 (0)\n+20AD8 Comment Length        0000 (0)\n+20ADA Disk Start            0000 (0)\n+20ADC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-207E3 Ext File Attributes   41ED0010 (1106051088)\n+20ADE Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-207E7 Local Header Offset   000000BD (189)\n-207EB Filename              'XXXXXXXXXXX'\n+20AE2 Local Header Offset   000000BD (189)\n+20AE6 Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x207EB: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x20AE6: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x207EB: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20AE6: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x207C3: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x20ABE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-207F6 CENTRAL HEADER #5     02014B50 (33639248)\n-207FA Created Zip Spec      14 (20) '2.0'\n-207FB Created OS            03 (3) 'Unix'\n-207FC Extract Zip Spec      0A (10) '1.0'\n-207FD Extract OS            00 (0) 'MS-DOS'\n-207FE General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20800 Compression Method    0000 (0) 'Stored'\n-20802 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20806 CRC                   00000000 (0)\n-2080A Compressed Size       00000000 (0)\n-2080E Uncompressed Size     00000000 (0)\n-20812 Filename Length       0011 (17)\n-20814 Extra Length          0000 (0)\n-20816 Comment Length        0000 (0)\n-20818 Disk Start            0000 (0)\n-2081A Int File Attributes   0000 (0)\n+20AF1 CENTRAL HEADER #5     02014B50 (33639248)\n+20AF5 Created Zip Spec      14 (20) '2.0'\n+20AF6 Created OS            03 (3) 'Unix'\n+20AF7 Extract Zip Spec      0A (10) '1.0'\n+20AF8 Extract OS            00 (0) 'MS-DOS'\n+20AF9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20AFB Compression Method    0000 (0) 'Stored'\n+20AFD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20B01 CRC                   00000000 (0)\n+20B05 Compressed Size       00000000 (0)\n+20B09 Uncompressed Size     00000000 (0)\n+20B0D Filename Length       0011 (17)\n+20B0F Extra Length          0000 (0)\n+20B11 Comment Length        0000 (0)\n+20B13 Disk Start            0000 (0)\n+20B15 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2081C Ext File Attributes   41ED0010 (1106051088)\n+20B17 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20820 Local Header Offset   000000E6 (230)\n-20824 Filename              'XXXXXXXXXXXXXXXXX'\n+20B1B Local Header Offset   000000E6 (230)\n+20B1F Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20824: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20B1F: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20824: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20B1F: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x207FC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20AF7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-20835 CENTRAL HEADER #6     02014B50 (33639248)\n-20839 Created Zip Spec      14 (20) '2.0'\n-2083A Created OS            03 (3) 'Unix'\n-2083B Extract Zip Spec      0A (10) '1.0'\n-2083C Extract OS            00 (0) 'MS-DOS'\n-2083D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-2083F Compression Method    0000 (0) 'Stored'\n-20841 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20845 CRC                   00000000 (0)\n-20849 Compressed Size       00000000 (0)\n-2084D Uncompressed Size     00000000 (0)\n-20851 Filename Length       001A (26)\n-20853 Extra Length          0000 (0)\n-20855 Comment Length        0000 (0)\n-20857 Disk Start            0000 (0)\n-20859 Int File Attributes   0000 (0)\n+20B30 CENTRAL HEADER #6     02014B50 (33639248)\n+20B34 Created Zip Spec      14 (20) '2.0'\n+20B35 Created OS            03 (3) 'Unix'\n+20B36 Extract Zip Spec      0A (10) '1.0'\n+20B37 Extract OS            00 (0) 'MS-DOS'\n+20B38 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20B3A Compression Method    0000 (0) 'Stored'\n+20B3C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20B40 CRC                   00000000 (0)\n+20B44 Compressed Size       00000000 (0)\n+20B48 Uncompressed Size     00000000 (0)\n+20B4C Filename Length       001A (26)\n+20B4E Extra Length          0000 (0)\n+20B50 Comment Length        0000 (0)\n+20B52 Disk Start            0000 (0)\n+20B54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2085B Ext File Attributes   41ED0010 (1106051088)\n+20B56 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-2085F Local Header Offset   00000115 (277)\n-20863 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20B5A Local Header Offset   00000115 (277)\n+20B5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20863: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20B5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20863: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20B5E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x2083B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20B36: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-2087D CENTRAL HEADER #7     02014B50 (33639248)\n-20881 Created Zip Spec      14 (20) '2.0'\n-20882 Created OS            03 (3) 'Unix'\n-20883 Extract Zip Spec      0A (10) '1.0'\n-20884 Extract OS            00 (0) 'MS-DOS'\n-20885 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20887 Compression Method    0000 (0) 'Stored'\n-20889 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2088D CRC                   00000000 (0)\n-20891 Compressed Size       00000000 (0)\n-20895 Uncompressed Size     00000000 (0)\n-20899 Filename Length       0021 (33)\n-2089B Extra Length          0000 (0)\n-2089D Comment Length        0000 (0)\n-2089F Disk Start            0000 (0)\n-208A1 Int File Attributes   0000 (0)\n+20B78 CENTRAL HEADER #7     02014B50 (33639248)\n+20B7C Created Zip Spec      14 (20) '2.0'\n+20B7D Created OS            03 (3) 'Unix'\n+20B7E Extract Zip Spec      0A (10) '1.0'\n+20B7F Extract OS            00 (0) 'MS-DOS'\n+20B80 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20B82 Compression Method    0000 (0) 'Stored'\n+20B84 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20B88 CRC                   00000000 (0)\n+20B8C Compressed Size       00000000 (0)\n+20B90 Uncompressed Size     00000000 (0)\n+20B94 Filename Length       0021 (33)\n+20B96 Extra Length          0000 (0)\n+20B98 Comment Length        0000 (0)\n+20B9A Disk Start            0000 (0)\n+20B9C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-208A3 Ext File Attributes   41ED0010 (1106051088)\n+20B9E Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-208A7 Local Header Offset   0000014D (333)\n-208AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20BA2 Local Header Offset   0000014D (333)\n+20BA6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x208AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20BA6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x208AB: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20BA6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20883: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20B7E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-208CC CENTRAL HEADER #8     02014B50 (33639248)\n-208D0 Created Zip Spec      14 (20) '2.0'\n-208D1 Created OS            03 (3) 'Unix'\n-208D2 Extract Zip Spec      0A (10) '1.0'\n-208D3 Extract OS            00 (0) 'MS-DOS'\n-208D4 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-208D6 Compression Method    0000 (0) 'Stored'\n-208D8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-208DC CRC                   00000000 (0)\n-208E0 Compressed Size       00000000 (0)\n-208E4 Uncompressed Size     00000000 (0)\n-208E8 Filename Length       0027 (39)\n-208EA Extra Length          0000 (0)\n-208EC Comment Length        0000 (0)\n-208EE Disk Start            0000 (0)\n-208F0 Int File Attributes   0000 (0)\n+20BC7 CENTRAL HEADER #8     02014B50 (33639248)\n+20BCB Created Zip Spec      14 (20) '2.0'\n+20BCC Created OS            03 (3) 'Unix'\n+20BCD Extract Zip Spec      0A (10) '1.0'\n+20BCE Extract OS            00 (0) 'MS-DOS'\n+20BCF General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20BD1 Compression Method    0000 (0) 'Stored'\n+20BD3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20BD7 CRC                   00000000 (0)\n+20BDB Compressed Size       00000000 (0)\n+20BDF Uncompressed Size     00000000 (0)\n+20BE3 Filename Length       0027 (39)\n+20BE5 Extra Length          0000 (0)\n+20BE7 Comment Length        0000 (0)\n+20BE9 Disk Start            0000 (0)\n+20BEB Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-208F2 Ext File Attributes   41ED0010 (1106051088)\n+20BED Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-208F6 Local Header Offset   0000018C (396)\n-208FA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20BF1 Local Header Offset   0000018C (396)\n+20BF5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x208FA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20BF5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x208FA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20BF5: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x208D2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20BCD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20921 CENTRAL HEADER #9     02014B50 (33639248)\n-20925 Created Zip Spec      14 (20) '2.0'\n-20926 Created OS            03 (3) 'Unix'\n-20927 Extract Zip Spec      0A (10) '1.0'\n-20928 Extract OS            00 (0) 'MS-DOS'\n-20929 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-2092B Compression Method    0000 (0) 'Stored'\n-2092D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20931 CRC                   00000000 (0)\n-20935 Compressed Size       00000000 (0)\n-20939 Uncompressed Size     00000000 (0)\n-2093D Filename Length       0030 (48)\n-2093F Extra Length          0000 (0)\n-20941 Comment Length        0000 (0)\n-20943 Disk Start            0000 (0)\n-20945 Int File Attributes   0000 (0)\n+20C1C CENTRAL HEADER #9     02014B50 (33639248)\n+20C20 Created Zip Spec      14 (20) '2.0'\n+20C21 Created OS            03 (3) 'Unix'\n+20C22 Extract Zip Spec      0A (10) '1.0'\n+20C23 Extract OS            00 (0) 'MS-DOS'\n+20C24 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20C26 Compression Method    0000 (0) 'Stored'\n+20C28 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20C2C CRC                   00000000 (0)\n+20C30 Compressed Size       00000000 (0)\n+20C34 Uncompressed Size     00000000 (0)\n+20C38 Filename Length       0030 (48)\n+20C3A Extra Length          0000 (0)\n+20C3C Comment Length        0000 (0)\n+20C3E Disk Start            0000 (0)\n+20C40 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20947 Ext File Attributes   41ED0010 (1106051088)\n+20C42 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-2094B Local Header Offset   000001D1 (465)\n-2094F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20C46 Local Header Offset   000001D1 (465)\n+20C4A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2094F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20C4A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x2094F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20C4A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20927: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20C22: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-2097F CENTRAL HEADER #10    02014B50 (33639248)\n-20983 Created Zip Spec      14 (20) '2.0'\n-20984 Created OS            03 (3) 'Unix'\n-20985 Extract Zip Spec      0A (10) '1.0'\n-20986 Extract OS            00 (0) 'MS-DOS'\n-20987 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20989 Compression Method    0000 (0) 'Stored'\n-2098B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2098F CRC                   00000000 (0)\n-20993 Compressed Size       00000000 (0)\n-20997 Uncompressed Size     00000000 (0)\n-2099B Filename Length       002A (42)\n-2099D Extra Length          0000 (0)\n-2099F Comment Length        0000 (0)\n-209A1 Disk Start            0000 (0)\n-209A3 Int File Attributes   0000 (0)\n+20C7A CENTRAL HEADER #10    02014B50 (33639248)\n+20C7E Created Zip Spec      14 (20) '2.0'\n+20C7F Created OS            03 (3) 'Unix'\n+20C80 Extract Zip Spec      0A (10) '1.0'\n+20C81 Extract OS            00 (0) 'MS-DOS'\n+20C82 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20C84 Compression Method    0000 (0) 'Stored'\n+20C86 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20C8A CRC                   00000000 (0)\n+20C8E Compressed Size       00000000 (0)\n+20C92 Uncompressed Size     00000000 (0)\n+20C96 Filename Length       002A (42)\n+20C98 Extra Length          0000 (0)\n+20C9A Comment Length        0000 (0)\n+20C9C Disk Start            0000 (0)\n+20C9E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-209A5 Ext File Attributes   41ED0010 (1106051088)\n+20CA0 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-209A9 Local Header Offset   0000021F (543)\n-209AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20CA4 Local Header Offset   0000021F (543)\n+20CA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x209AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20CA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x209AD: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20CA8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20985: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20C80: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-209D7 CENTRAL HEADER #11    02014B50 (33639248)\n-209DB Created Zip Spec      14 (20) '2.0'\n-209DC Created OS            03 (3) 'Unix'\n-209DD Extract Zip Spec      0A (10) '1.0'\n-209DE Extract OS            00 (0) 'MS-DOS'\n-209DF General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-209E1 Compression Method    0000 (0) 'Stored'\n-209E3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-209E7 CRC                   00000000 (0)\n-209EB Compressed Size       00000000 (0)\n-209EF Uncompressed Size     00000000 (0)\n-209F3 Filename Length       0030 (48)\n-209F5 Extra Length          0000 (0)\n-209F7 Comment Length        0000 (0)\n-209F9 Disk Start            0000 (0)\n-209FB Int File Attributes   0000 (0)\n+20CD2 CENTRAL HEADER #11    02014B50 (33639248)\n+20CD6 Created Zip Spec      14 (20) '2.0'\n+20CD7 Created OS            03 (3) 'Unix'\n+20CD8 Extract Zip Spec      0A (10) '1.0'\n+20CD9 Extract OS            00 (0) 'MS-DOS'\n+20CDA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20CDC Compression Method    0000 (0) 'Stored'\n+20CDE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20CE2 CRC                   00000000 (0)\n+20CE6 Compressed Size       00000000 (0)\n+20CEA Uncompressed Size     00000000 (0)\n+20CEE Filename Length       0030 (48)\n+20CF0 Extra Length          0000 (0)\n+20CF2 Comment Length        0000 (0)\n+20CF4 Disk Start            0000 (0)\n+20CF6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-209FD Ext File Attributes   41ED0010 (1106051088)\n+20CF8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20A01 Local Header Offset   00000267 (615)\n-20A05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20CFC Local Header Offset   00000267 (615)\n+20D00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20A05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20D00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20A05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20D00: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x209DD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20CD8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20A35 CENTRAL HEADER #12    02014B50 (33639248)\n-20A39 Created Zip Spec      14 (20) '2.0'\n-20A3A Created OS            03 (3) 'Unix'\n-20A3B Extract Zip Spec      0A (10) '1.0'\n-20A3C Extract OS            00 (0) 'MS-DOS'\n-20A3D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20A3F Compression Method    0000 (0) 'Stored'\n-20A41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20A45 CRC                   00000000 (0)\n-20A49 Compressed Size       00000000 (0)\n-20A4D Uncompressed Size     00000000 (0)\n-20A51 Filename Length       002B (43)\n-20A53 Extra Length          0000 (0)\n-20A55 Comment Length        0000 (0)\n-20A57 Disk Start            0000 (0)\n-20A59 Int File Attributes   0000 (0)\n+20D30 CENTRAL HEADER #12    02014B50 (33639248)\n+20D34 Created Zip Spec      14 (20) '2.0'\n+20D35 Created OS            03 (3) 'Unix'\n+20D36 Extract Zip Spec      0A (10) '1.0'\n+20D37 Extract OS            00 (0) 'MS-DOS'\n+20D38 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20D3A Compression Method    0000 (0) 'Stored'\n+20D3C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20D40 CRC                   00000000 (0)\n+20D44 Compressed Size       00000000 (0)\n+20D48 Uncompressed Size     00000000 (0)\n+20D4C Filename Length       002B (43)\n+20D4E Extra Length          0000 (0)\n+20D50 Comment Length        0000 (0)\n+20D52 Disk Start            0000 (0)\n+20D54 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20A5B Ext File Attributes   41ED0010 (1106051088)\n+20D56 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20A5F Local Header Offset   000002B5 (693)\n-20A63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20D5A Local Header Offset   000002B5 (693)\n+20D5E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20A63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20D5E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20A63: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20D5E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20A3B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20D36: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20A8E CENTRAL HEADER #13    02014B50 (33639248)\n-20A92 Created Zip Spec      14 (20) '2.0'\n-20A93 Created OS            03 (3) 'Unix'\n-20A94 Extract Zip Spec      0A (10) '1.0'\n-20A95 Extract OS            00 (0) 'MS-DOS'\n-20A96 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20A98 Compression Method    0000 (0) 'Stored'\n-20A9A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20A9E CRC                   00000000 (0)\n-20AA2 Compressed Size       00000000 (0)\n-20AA6 Uncompressed Size     00000000 (0)\n-20AAA Filename Length       002A (42)\n-20AAC Extra Length          0000 (0)\n-20AAE Comment Length        0000 (0)\n-20AB0 Disk Start            0000 (0)\n-20AB2 Int File Attributes   0000 (0)\n+20D89 CENTRAL HEADER #13    02014B50 (33639248)\n+20D8D Created Zip Spec      14 (20) '2.0'\n+20D8E Created OS            03 (3) 'Unix'\n+20D8F Extract Zip Spec      0A (10) '1.0'\n+20D90 Extract OS            00 (0) 'MS-DOS'\n+20D91 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20D93 Compression Method    0000 (0) 'Stored'\n+20D95 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20D99 CRC                   00000000 (0)\n+20D9D Compressed Size       00000000 (0)\n+20DA1 Uncompressed Size     00000000 (0)\n+20DA5 Filename Length       002A (42)\n+20DA7 Extra Length          0000 (0)\n+20DA9 Comment Length        0000 (0)\n+20DAB Disk Start            0000 (0)\n+20DAD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20AB4 Ext File Attributes   41ED0010 (1106051088)\n+20DAF Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20AB8 Local Header Offset   000002FE (766)\n-20ABC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20DB3 Local Header Offset   000002FE (766)\n+20DB7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20ABC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20DB7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20ABC: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20DB7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20A94: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20D8F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20AE6 CENTRAL HEADER #14    02014B50 (33639248)\n-20AEA Created Zip Spec      14 (20) '2.0'\n-20AEB Created OS            03 (3) 'Unix'\n-20AEC Extract Zip Spec      0A (10) '1.0'\n-20AED Extract OS            00 (0) 'MS-DOS'\n-20AEE General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20AF0 Compression Method    0000 (0) 'Stored'\n-20AF2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20AF6 CRC                   00000000 (0)\n-20AFA Compressed Size       00000000 (0)\n-20AFE Uncompressed Size     00000000 (0)\n-20B02 Filename Length       0026 (38)\n-20B04 Extra Length          0000 (0)\n-20B06 Comment Length        0000 (0)\n-20B08 Disk Start            0000 (0)\n-20B0A Int File Attributes   0000 (0)\n+20DE1 CENTRAL HEADER #14    02014B50 (33639248)\n+20DE5 Created Zip Spec      14 (20) '2.0'\n+20DE6 Created OS            03 (3) 'Unix'\n+20DE7 Extract Zip Spec      0A (10) '1.0'\n+20DE8 Extract OS            00 (0) 'MS-DOS'\n+20DE9 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20DEB Compression Method    0000 (0) 'Stored'\n+20DED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20DF1 CRC                   00000000 (0)\n+20DF5 Compressed Size       00000000 (0)\n+20DF9 Uncompressed Size     00000000 (0)\n+20DFD Filename Length       0026 (38)\n+20DFF Extra Length          0000 (0)\n+20E01 Comment Length        0000 (0)\n+20E03 Disk Start            0000 (0)\n+20E05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20B0C Ext File Attributes   41ED0010 (1106051088)\n+20E07 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20B10 Local Header Offset   00000346 (838)\n-20B14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20E0B Local Header Offset   00000346 (838)\n+20E0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20B14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20E0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20B14: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20E0F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20AEC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20DE7: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20B3A CENTRAL HEADER #15    02014B50 (33639248)\n-20B3E Created Zip Spec      14 (20) '2.0'\n-20B3F Created OS            03 (3) 'Unix'\n-20B40 Extract Zip Spec      0A (10) '1.0'\n-20B41 Extract OS            00 (0) 'MS-DOS'\n-20B42 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20B44 Compression Method    0000 (0) 'Stored'\n-20B46 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20B4A CRC                   00000000 (0)\n-20B4E Compressed Size       00000000 (0)\n-20B52 Uncompressed Size     00000000 (0)\n-20B56 Filename Length       0020 (32)\n-20B58 Extra Length          0000 (0)\n-20B5A Comment Length        0000 (0)\n-20B5C Disk Start            0000 (0)\n-20B5E Int File Attributes   0000 (0)\n+20E35 CENTRAL HEADER #15    02014B50 (33639248)\n+20E39 Created Zip Spec      14 (20) '2.0'\n+20E3A Created OS            03 (3) 'Unix'\n+20E3B Extract Zip Spec      0A (10) '1.0'\n+20E3C Extract OS            00 (0) 'MS-DOS'\n+20E3D General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20E3F Compression Method    0000 (0) 'Stored'\n+20E41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20E45 CRC                   00000000 (0)\n+20E49 Compressed Size       00000000 (0)\n+20E4D Uncompressed Size     00000000 (0)\n+20E51 Filename Length       0020 (32)\n+20E53 Extra Length          0000 (0)\n+20E55 Comment Length        0000 (0)\n+20E57 Disk Start            0000 (0)\n+20E59 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20B60 Ext File Attributes   41ED0010 (1106051088)\n+20E5B Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20B64 Local Header Offset   0000038A (906)\n-20B68 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20E5F Local Header Offset   0000038A (906)\n+20E63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20B68: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20E63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20B68: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20E63: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20B40: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20E3B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20B88 CENTRAL HEADER #16    02014B50 (33639248)\n-20B8C Created Zip Spec      14 (20) '2.0'\n-20B8D Created OS            03 (3) 'Unix'\n-20B8E Extract Zip Spec      0A (10) '1.0'\n-20B8F Extract OS            00 (0) 'MS-DOS'\n-20B90 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20B92 Compression Method    0000 (0) 'Stored'\n-20B94 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20B98 CRC                   00000000 (0)\n-20B9C Compressed Size       00000000 (0)\n-20BA0 Uncompressed Size     00000000 (0)\n-20BA4 Filename Length       0021 (33)\n-20BA6 Extra Length          0000 (0)\n-20BA8 Comment Length        0000 (0)\n-20BAA Disk Start            0000 (0)\n-20BAC Int File Attributes   0000 (0)\n+20E83 CENTRAL HEADER #16    02014B50 (33639248)\n+20E87 Created Zip Spec      14 (20) '2.0'\n+20E88 Created OS            03 (3) 'Unix'\n+20E89 Extract Zip Spec      0A (10) '1.0'\n+20E8A Extract OS            00 (0) 'MS-DOS'\n+20E8B General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20E8D Compression Method    0000 (0) 'Stored'\n+20E8F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20E93 CRC                   00000000 (0)\n+20E97 Compressed Size       00000000 (0)\n+20E9B Uncompressed Size     00000000 (0)\n+20E9F Filename Length       0021 (33)\n+20EA1 Extra Length          0000 (0)\n+20EA3 Comment Length        0000 (0)\n+20EA5 Disk Start            0000 (0)\n+20EA7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20BAE Ext File Attributes   41ED0010 (1106051088)\n+20EA9 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20BB2 Local Header Offset   000003C8 (968)\n-20BB6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20EAD Local Header Offset   000003C8 (968)\n+20EB1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20BB6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20EB1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20BB6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20EB1: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20B8E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20E89: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20BD7 CENTRAL HEADER #17    02014B50 (33639248)\n-20BDB Created Zip Spec      14 (20) '2.0'\n-20BDC Created OS            03 (3) 'Unix'\n-20BDD Extract Zip Spec      0A (10) '1.0'\n-20BDE Extract OS            00 (0) 'MS-DOS'\n-20BDF General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20BE1 Compression Method    0000 (0) 'Stored'\n-20BE3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20BE7 CRC                   00000000 (0)\n-20BEB Compressed Size       00000000 (0)\n-20BEF Uncompressed Size     00000000 (0)\n-20BF3 Filename Length       0022 (34)\n-20BF5 Extra Length          0000 (0)\n-20BF7 Comment Length        0000 (0)\n-20BF9 Disk Start            0000 (0)\n-20BFB Int File Attributes   0000 (0)\n+20ED2 CENTRAL HEADER #17    02014B50 (33639248)\n+20ED6 Created Zip Spec      14 (20) '2.0'\n+20ED7 Created OS            03 (3) 'Unix'\n+20ED8 Extract Zip Spec      0A (10) '1.0'\n+20ED9 Extract OS            00 (0) 'MS-DOS'\n+20EDA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20EDC Compression Method    0000 (0) 'Stored'\n+20EDE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20EE2 CRC                   00000000 (0)\n+20EE6 Compressed Size       00000000 (0)\n+20EEA Uncompressed Size     00000000 (0)\n+20EEE Filename Length       0022 (34)\n+20EF0 Extra Length          0000 (0)\n+20EF2 Comment Length        0000 (0)\n+20EF4 Disk Start            0000 (0)\n+20EF6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20BFD Ext File Attributes   41ED0010 (1106051088)\n+20EF8 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20C01 Local Header Offset   00000407 (1031)\n-20C05 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+20EFC Local Header Offset   00000407 (1031)\n+20F00 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20C05: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20F00: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20C05: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20F00: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20BDD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20ED8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20C27 CENTRAL HEADER #18    02014B50 (33639248)\n-20C2B Created Zip Spec      14 (20) '2.0'\n-20C2C Created OS            03 (3) 'Unix'\n-20C2D Extract Zip Spec      0A (10) '1.0'\n-20C2E Extract OS            00 (0) 'MS-DOS'\n-20C2F General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20C31 Compression Method    0000 (0) 'Stored'\n-20C33 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20C37 CRC                   00000000 (0)\n-20C3B Compressed Size       00000000 (0)\n-20C3F Uncompressed Size     00000000 (0)\n-20C43 Filename Length       000F (15)\n-20C45 Extra Length          0000 (0)\n-20C47 Comment Length        0000 (0)\n-20C49 Disk Start            0000 (0)\n-20C4B Int File Attributes   0000 (0)\n+20F22 CENTRAL HEADER #18    02014B50 (33639248)\n+20F26 Created Zip Spec      14 (20) '2.0'\n+20F27 Created OS            03 (3) 'Unix'\n+20F28 Extract Zip Spec      0A (10) '1.0'\n+20F29 Extract OS            00 (0) 'MS-DOS'\n+20F2A General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20F2C Compression Method    0000 (0) 'Stored'\n+20F2E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20F32 CRC                   00000000 (0)\n+20F36 Compressed Size       00000000 (0)\n+20F3A Uncompressed Size     00000000 (0)\n+20F3E Filename Length       000F (15)\n+20F40 Extra Length          0000 (0)\n+20F42 Comment Length        0000 (0)\n+20F44 Disk Start            0000 (0)\n+20F46 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20C4D Ext File Attributes   41ED0010 (1106051088)\n+20F48 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20C51 Local Header Offset   00000447 (1095)\n-20C55 Filename              'XXXXXXXXXXXXXXX'\n+20F4C Local Header Offset   00000447 (1095)\n+20F50 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20C55: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20F50: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20C55: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20F50: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20C2D: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20F28: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-20C64 CENTRAL HEADER #19    02014B50 (33639248)\n-20C68 Created Zip Spec      14 (20) '2.0'\n-20C69 Created OS            03 (3) 'Unix'\n-20C6A Extract Zip Spec      0A (10) '1.0'\n-20C6B Extract OS            00 (0) 'MS-DOS'\n-20C6C General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20C6E Compression Method    0000 (0) 'Stored'\n-20C70 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20C74 CRC                   00000000 (0)\n-20C78 Compressed Size       00000000 (0)\n-20C7C Uncompressed Size     00000000 (0)\n-20C80 Filename Length       0018 (24)\n-20C82 Extra Length          0000 (0)\n-20C84 Comment Length        0000 (0)\n-20C86 Disk Start            0000 (0)\n-20C88 Int File Attributes   0000 (0)\n+20F5F CENTRAL HEADER #19    02014B50 (33639248)\n+20F63 Created Zip Spec      14 (20) '2.0'\n+20F64 Created OS            03 (3) 'Unix'\n+20F65 Extract Zip Spec      0A (10) '1.0'\n+20F66 Extract OS            00 (0) 'MS-DOS'\n+20F67 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20F69 Compression Method    0000 (0) 'Stored'\n+20F6B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20F6F CRC                   00000000 (0)\n+20F73 Compressed Size       00000000 (0)\n+20F77 Uncompressed Size     00000000 (0)\n+20F7B Filename Length       0018 (24)\n+20F7D Extra Length          0000 (0)\n+20F7F Comment Length        0000 (0)\n+20F81 Disk Start            0000 (0)\n+20F83 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20C8A Ext File Attributes   41ED0010 (1106051088)\n+20F85 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20C8E Local Header Offset   00000474 (1140)\n-20C92 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+20F89 Local Header Offset   00000474 (1140)\n+20F8D Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20C92: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20F8D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20C92: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20F8D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20C6A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20F65: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20CAA CENTRAL HEADER #20    02014B50 (33639248)\n-20CAE Created Zip Spec      14 (20) '2.0'\n-20CAF Created OS            03 (3) 'Unix'\n-20CB0 Extract Zip Spec      0A (10) '1.0'\n-20CB1 Extract OS            00 (0) 'MS-DOS'\n-20CB2 General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20CB4 Compression Method    0000 (0) 'Stored'\n-20CB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20CBA CRC                   00000000 (0)\n-20CBE Compressed Size       00000000 (0)\n-20CC2 Uncompressed Size     00000000 (0)\n-20CC6 Filename Length       000F (15)\n-20CC8 Extra Length          0000 (0)\n-20CCA Comment Length        0000 (0)\n-20CCC Disk Start            0000 (0)\n-20CCE Int File Attributes   0000 (0)\n+20FA5 CENTRAL HEADER #20    02014B50 (33639248)\n+20FA9 Created Zip Spec      14 (20) '2.0'\n+20FAA Created OS            03 (3) 'Unix'\n+20FAB Extract Zip Spec      0A (10) '1.0'\n+20FAC Extract OS            00 (0) 'MS-DOS'\n+20FAD General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20FAF Compression Method    0000 (0) 'Stored'\n+20FB1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20FB5 CRC                   00000000 (0)\n+20FB9 Compressed Size       00000000 (0)\n+20FBD Uncompressed Size     00000000 (0)\n+20FC1 Filename Length       000F (15)\n+20FC3 Extra Length          0000 (0)\n+20FC5 Comment Length        0000 (0)\n+20FC7 Disk Start            0000 (0)\n+20FC9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20CD0 Ext File Attributes   41ED0010 (1106051088)\n+20FCB Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20CD4 Local Header Offset   000004AA (1194)\n-20CD8 Filename              'XXXXXXXXXXXXXXX'\n+20FCF Local Header Offset   000004AA (1194)\n+20FD3 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20CD8: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20FD3: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20CD8: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x20FD3: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20CB0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20FAB: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-20CE7 CENTRAL HEADER #21    02014B50 (33639248)\n-20CEB Created Zip Spec      14 (20) '2.0'\n-20CEC Created OS            03 (3) 'Unix'\n-20CED Extract Zip Spec      0A (10) '1.0'\n-20CEE Extract OS            00 (0) 'MS-DOS'\n-20CEF General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20CF1 Compression Method    0000 (0) 'Stored'\n-20CF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20CF7 CRC                   00000000 (0)\n-20CFB Compressed Size       00000000 (0)\n-20CFF Uncompressed Size     00000000 (0)\n-20D03 Filename Length       0020 (32)\n-20D05 Extra Length          0000 (0)\n-20D07 Comment Length        0000 (0)\n-20D09 Disk Start            0000 (0)\n-20D0B Int File Attributes   0000 (0)\n+20FE2 CENTRAL HEADER #21    02014B50 (33639248)\n+20FE6 Created Zip Spec      14 (20) '2.0'\n+20FE7 Created OS            03 (3) 'Unix'\n+20FE8 Extract Zip Spec      0A (10) '1.0'\n+20FE9 Extract OS            00 (0) 'MS-DOS'\n+20FEA General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+20FEC Compression Method    0000 (0) 'Stored'\n+20FEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+20FF2 CRC                   00000000 (0)\n+20FF6 Compressed Size       00000000 (0)\n+20FFA Uncompressed Size     00000000 (0)\n+20FFE Filename Length       0020 (32)\n+21000 Extra Length          0000 (0)\n+21002 Comment Length        0000 (0)\n+21004 Disk Start            0000 (0)\n+21006 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20D0D Ext File Attributes   41ED0010 (1106051088)\n+21008 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20D11 Local Header Offset   000004D7 (1239)\n-20D15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2100C Local Header Offset   000004D7 (1239)\n+21010 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20D15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21010: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20D15: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x21010: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20CED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x20FE8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20D35 CENTRAL HEADER #22    02014B50 (33639248)\n-20D39 Created Zip Spec      14 (20) '2.0'\n-20D3A Created OS            03 (3) 'Unix'\n-20D3B Extract Zip Spec      0A (10) '1.0'\n-20D3C Extract OS            00 (0) 'MS-DOS'\n-20D3D General Purpose Flag  0800 (2048)\n-      [Bit 11]              1 'Language Encoding'\n-20D3F Compression Method    0000 (0) 'Stored'\n-20D41 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20D45 CRC                   00000000 (0)\n-20D49 Compressed Size       00000000 (0)\n-20D4D Uncompressed Size     00000000 (0)\n-20D51 Filename Length       0033 (51)\n-20D53 Extra Length          0000 (0)\n-20D55 Comment Length        0000 (0)\n-20D57 Disk Start            0000 (0)\n-20D59 Int File Attributes   0000 (0)\n+21030 CENTRAL HEADER #22    02014B50 (33639248)\n+21034 Created Zip Spec      14 (20) '2.0'\n+21035 Created OS            03 (3) 'Unix'\n+21036 Extract Zip Spec      0A (10) '1.0'\n+21037 Extract OS            00 (0) 'MS-DOS'\n+21038 General Purpose Flag  0800 (2048)\n+      [Bit 11]              1 'Language Encoding'\n+2103A Compression Method    0000 (0) 'Stored'\n+2103C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21040 CRC                   00000000 (0)\n+21044 Compressed Size       00000000 (0)\n+21048 Uncompressed Size     00000000 (0)\n+2104C Filename Length       0033 (51)\n+2104E Extra Length          0000 (0)\n+21050 Comment Length        0000 (0)\n+21052 Disk Start            0000 (0)\n+21054 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20D5B Ext File Attributes   41ED0010 (1106051088)\n+21056 Ext File Attributes   41ED0010 (1106051088)\n       [Bit 4]               Directory\n       [Bits 16-24]          01ED (493) 'Unix attrib: rwxr-xr-x'\n       [Bits 28-31]          04 (4) 'Directory'\n-20D5F Local Header Offset   00000515 (1301)\n-20D63 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2105A Local Header Offset   00000515 (1301)\n+2105E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20D63: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2105E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x20D63: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x2105E: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x20D3B: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21036: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-20D96 CENTRAL HEADER #23    02014B50 (33639248)\n-20D9A Created Zip Spec      14 (20) '2.0'\n-20D9B Created OS            03 (3) 'Unix'\n-20D9C Extract Zip Spec      14 (20) '2.0'\n-20D9D Extract OS            00 (0) 'MS-DOS'\n-20D9E General Purpose Flag  0800 (2048)\n+21091 CENTRAL HEADER #23    02014B50 (33639248)\n+21095 Created Zip Spec      14 (20) '2.0'\n+21096 Created OS            03 (3) 'Unix'\n+21097 Extract Zip Spec      14 (20) '2.0'\n+21098 Extract OS            00 (0) 'MS-DOS'\n+21099 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20DA0 Compression Method    0008 (8) 'Deflated'\n-20DA2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20DA6 CRC                   85C487C6 (2244249542)\n-20DAA Compressed Size       00000356 (854)\n-20DAE Uncompressed Size     00000EA6 (3750)\n-20DB2 Filename Length       0015 (21)\n-20DB4 Extra Length          0000 (0)\n-20DB6 Comment Length        0000 (0)\n-20DB8 Disk Start            0000 (0)\n-20DBA Int File Attributes   0000 (0)\n+2109B Compression Method    0008 (8) 'Deflated'\n+2109D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+210A1 CRC                   85C487C6 (2244249542)\n+210A5 Compressed Size       00000356 (854)\n+210A9 Uncompressed Size     00000EA6 (3750)\n+210AD Filename Length       0015 (21)\n+210AF Extra Length          0000 (0)\n+210B1 Comment Length        0000 (0)\n+210B3 Disk Start            0000 (0)\n+210B5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20DBC Ext File Attributes   81A40000 (2175008768)\n+210B7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20DC0 Local Header Offset   00000566 (1382)\n-20DC4 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+210BB Local Header Offset   00000566 (1382)\n+210BF Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20DC4: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x210BF: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20DD9 CENTRAL HEADER #24    02014B50 (33639248)\n-20DDD Created Zip Spec      14 (20) '2.0'\n-20DDE Created OS            03 (3) 'Unix'\n-20DDF Extract Zip Spec      14 (20) '2.0'\n-20DE0 Extract OS            00 (0) 'MS-DOS'\n-20DE1 General Purpose Flag  0800 (2048)\n+210D4 CENTRAL HEADER #24    02014B50 (33639248)\n+210D8 Created Zip Spec      14 (20) '2.0'\n+210D9 Created OS            03 (3) 'Unix'\n+210DA Extract Zip Spec      14 (20) '2.0'\n+210DB Extract OS            00 (0) 'MS-DOS'\n+210DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20DE3 Compression Method    0008 (8) 'Deflated'\n-20DE5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20DE9 CRC                   86E2B4B4 (2263004340)\n-20DED Compressed Size       00000F6D (3949)\n-20DF1 Uncompressed Size     00002C5E (11358)\n-20DF5 Filename Length       0010 (16)\n-20DF7 Extra Length          0000 (0)\n-20DF9 Comment Length        0000 (0)\n-20DFB Disk Start            0000 (0)\n-20DFD Int File Attributes   0000 (0)\n+210DE Compression Method    0008 (8) 'Deflated'\n+210E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+210E4 CRC                   86E2B4B4 (2263004340)\n+210E8 Compressed Size       00000F6D (3949)\n+210EC Uncompressed Size     00002C5E (11358)\n+210F0 Filename Length       0010 (16)\n+210F2 Extra Length          0000 (0)\n+210F4 Comment Length        0000 (0)\n+210F6 Disk Start            0000 (0)\n+210F8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20DFF Ext File Attributes   81A40000 (2175008768)\n+210FA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20E03 Local Header Offset   000008EF (2287)\n-20E07 Filename              'XXXXXXXXXXXXXXXX'\n+210FE Local Header Offset   000008EF (2287)\n+21102 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20E07: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21102: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20E17 CENTRAL HEADER #25    02014B50 (33639248)\n-20E1B Created Zip Spec      14 (20) '2.0'\n-20E1C Created OS            03 (3) 'Unix'\n-20E1D Extract Zip Spec      14 (20) '2.0'\n-20E1E Extract OS            00 (0) 'MS-DOS'\n-20E1F General Purpose Flag  0800 (2048)\n+21112 CENTRAL HEADER #25    02014B50 (33639248)\n+21116 Created Zip Spec      14 (20) '2.0'\n+21117 Created OS            03 (3) 'Unix'\n+21118 Extract Zip Spec      14 (20) '2.0'\n+21119 Extract OS            00 (0) 'MS-DOS'\n+2111A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20E21 Compression Method    0008 (8) 'Deflated'\n-20E23 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20E27 CRC                   EA9E0E3C (3936226876)\n-20E2B Compressed Size       0000007F (127)\n-20E2F Uncompressed Size     000000AF (175)\n-20E33 Filename Length       000F (15)\n-20E35 Extra Length          0000 (0)\n-20E37 Comment Length        0000 (0)\n-20E39 Disk Start            0000 (0)\n-20E3B Int File Attributes   0000 (0)\n+2111C Compression Method    0008 (8) 'Deflated'\n+2111E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21122 CRC                   EA9E0E3C (3936226876)\n+21126 Compressed Size       0000007F (127)\n+2112A Uncompressed Size     000000AF (175)\n+2112E Filename Length       000F (15)\n+21130 Extra Length          0000 (0)\n+21132 Comment Length        0000 (0)\n+21134 Disk Start            0000 (0)\n+21136 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20E3D Ext File Attributes   81A40000 (2175008768)\n+21138 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20E41 Local Header Offset   0000188A (6282)\n-20E45 Filename              'XXXXXXXXXXXXXXX'\n+2113C Local Header Offset   0000188A (6282)\n+21140 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20E45: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21140: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20E54 CENTRAL HEADER #26    02014B50 (33639248)\n-20E58 Created Zip Spec      14 (20) '2.0'\n-20E59 Created OS            03 (3) 'Unix'\n-20E5A Extract Zip Spec      14 (20) '2.0'\n-20E5B Extract OS            00 (0) 'MS-DOS'\n-20E5C General Purpose Flag  0800 (2048)\n+2114F CENTRAL HEADER #26    02014B50 (33639248)\n+21153 Created Zip Spec      14 (20) '2.0'\n+21154 Created OS            03 (3) 'Unix'\n+21155 Extract Zip Spec      14 (20) '2.0'\n+21156 Extract OS            00 (0) 'MS-DOS'\n+21157 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20E5E Compression Method    0008 (8) 'Deflated'\n-20E60 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20E64 CRC                   D4B8B1A6 (3568873894)\n-20E68 Compressed Size       00000299 (665)\n-20E6C Uncompressed Size     00000520 (1312)\n-20E70 Filename Length       002E (46)\n-20E72 Extra Length          0000 (0)\n-20E74 Comment Length        0000 (0)\n-20E76 Disk Start            0000 (0)\n-20E78 Int File Attributes   0000 (0)\n+21159 Compression Method    0008 (8) 'Deflated'\n+2115B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2115F CRC                   D8E4F331 (3638883121)\n+21163 Compressed Size       000002A3 (675)\n+21167 Uncompressed Size     00000544 (1348)\n+2116B Filename Length       002E (46)\n+2116D Extra Length          0000 (0)\n+2116F Comment Length        0000 (0)\n+21171 Disk Start            0000 (0)\n+21173 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20E7A Ext File Attributes   81A40000 (2175008768)\n+21175 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20E7E Local Header Offset   00001936 (6454)\n-20E82 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21179 Local Header Offset   00001936 (6454)\n+2117D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20E82: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2117D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20EB0 CENTRAL HEADER #27    02014B50 (33639248)\n-20EB4 Created Zip Spec      14 (20) '2.0'\n-20EB5 Created OS            03 (3) 'Unix'\n-20EB6 Extract Zip Spec      14 (20) '2.0'\n-20EB7 Extract OS            00 (0) 'MS-DOS'\n-20EB8 General Purpose Flag  0800 (2048)\n+211AB CENTRAL HEADER #27    02014B50 (33639248)\n+211AF Created Zip Spec      14 (20) '2.0'\n+211B0 Created OS            03 (3) 'Unix'\n+211B1 Extract Zip Spec      14 (20) '2.0'\n+211B2 Extract OS            00 (0) 'MS-DOS'\n+211B3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20EBA Compression Method    0008 (8) 'Deflated'\n-20EBC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20EC0 CRC                   9303661A (2466473498)\n-20EC4 Compressed Size       0000043D (1085)\n-20EC8 Uncompressed Size     00000A6D (2669)\n-20ECC Filename Length       0028 (40)\n-20ECE Extra Length          0000 (0)\n-20ED0 Comment Length        0000 (0)\n-20ED2 Disk Start            0000 (0)\n-20ED4 Int File Attributes   0000 (0)\n+211B5 Compression Method    0008 (8) 'Deflated'\n+211B7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+211BB CRC                   C7E99B2E (3353975598)\n+211BF Compressed Size       00000448 (1096)\n+211C3 Uncompressed Size     00000ACD (2765)\n+211C7 Filename Length       0028 (40)\n+211C9 Extra Length          0000 (0)\n+211CB Comment Length        0000 (0)\n+211CD Disk Start            0000 (0)\n+211CF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20ED6 Ext File Attributes   81A40000 (2175008768)\n+211D1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20EDA Local Header Offset   00001C1B (7195)\n-20EDE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+211D5 Local Header Offset   00001C25 (7205)\n+211D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20EDE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x211D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20F06 CENTRAL HEADER #28    02014B50 (33639248)\n-20F0A Created Zip Spec      14 (20) '2.0'\n-20F0B Created OS            03 (3) 'Unix'\n-20F0C Extract Zip Spec      14 (20) '2.0'\n-20F0D Extract OS            00 (0) 'MS-DOS'\n-20F0E General Purpose Flag  0800 (2048)\n+21201 CENTRAL HEADER #28    02014B50 (33639248)\n+21205 Created Zip Spec      14 (20) '2.0'\n+21206 Created OS            03 (3) 'Unix'\n+21207 Extract Zip Spec      14 (20) '2.0'\n+21208 Extract OS            00 (0) 'MS-DOS'\n+21209 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20F10 Compression Method    0008 (8) 'Deflated'\n-20F12 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20F16 CRC                   8391A9ED (2207361517)\n-20F1A Compressed Size       00000421 (1057)\n-20F1E Uncompressed Size     00001419 (5145)\n-20F22 Filename Length       0036 (54)\n-20F24 Extra Length          0000 (0)\n-20F26 Comment Length        0000 (0)\n-20F28 Disk Start            0000 (0)\n-20F2A Int File Attributes   0000 (0)\n+2120B Compression Method    0008 (8) 'Deflated'\n+2120D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21211 CRC                   A4BC4964 (2763802980)\n+21215 Compressed Size       0000042E (1070)\n+21219 Uncompressed Size     000014B7 (5303)\n+2121D Filename Length       0036 (54)\n+2121F Extra Length          0000 (0)\n+21221 Comment Length        0000 (0)\n+21223 Disk Start            0000 (0)\n+21225 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20F2C Ext File Attributes   81A40000 (2175008768)\n+21227 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20F30 Local Header Offset   0000209E (8350)\n-20F34 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2122B Local Header Offset   000020B3 (8371)\n+2122F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20F34: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2122F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20F6A CENTRAL HEADER #29    02014B50 (33639248)\n-20F6E Created Zip Spec      14 (20) '2.0'\n-20F6F Created OS            03 (3) 'Unix'\n-20F70 Extract Zip Spec      14 (20) '2.0'\n-20F71 Extract OS            00 (0) 'MS-DOS'\n-20F72 General Purpose Flag  0800 (2048)\n+21265 CENTRAL HEADER #29    02014B50 (33639248)\n+21269 Created Zip Spec      14 (20) '2.0'\n+2126A Created OS            03 (3) 'Unix'\n+2126B Extract Zip Spec      14 (20) '2.0'\n+2126C Extract OS            00 (0) 'MS-DOS'\n+2126D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20F74 Compression Method    0008 (8) 'Deflated'\n-20F76 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20F7A CRC                   4C19B653 (1276753491)\n-20F7E Compressed Size       000004BF (1215)\n-20F82 Uncompressed Size     00000A34 (2612)\n-20F86 Filename Length       002D (45)\n-20F88 Extra Length          0000 (0)\n-20F8A Comment Length        0000 (0)\n-20F8C Disk Start            0000 (0)\n-20F8E Int File Attributes   0000 (0)\n+2126F Compression Method    0008 (8) 'Deflated'\n+21271 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21275 CRC                   4C19B653 (1276753491)\n+21279 Compressed Size       000004BF (1215)\n+2127D Uncompressed Size     00000A34 (2612)\n+21281 Filename Length       002D (45)\n+21283 Extra Length          0000 (0)\n+21285 Comment Length        0000 (0)\n+21287 Disk Start            0000 (0)\n+21289 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20F90 Ext File Attributes   81A40000 (2175008768)\n+2128B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20F94 Local Header Offset   00002513 (9491)\n-20F98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2128F Local Header Offset   00002535 (9525)\n+21293 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20F98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21293: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-20FC5 CENTRAL HEADER #30    02014B50 (33639248)\n-20FC9 Created Zip Spec      14 (20) '2.0'\n-20FCA Created OS            03 (3) 'Unix'\n-20FCB Extract Zip Spec      14 (20) '2.0'\n-20FCC Extract OS            00 (0) 'MS-DOS'\n-20FCD General Purpose Flag  0800 (2048)\n+212C0 CENTRAL HEADER #30    02014B50 (33639248)\n+212C4 Created Zip Spec      14 (20) '2.0'\n+212C5 Created OS            03 (3) 'Unix'\n+212C6 Extract Zip Spec      14 (20) '2.0'\n+212C7 Extract OS            00 (0) 'MS-DOS'\n+212C8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-20FCF Compression Method    0008 (8) 'Deflated'\n-20FD1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-20FD5 CRC                   92D33C56 (2463317078)\n-20FD9 Compressed Size       00000290 (656)\n-20FDD Uncompressed Size     0000053A (1338)\n-20FE1 Filename Length       0027 (39)\n-20FE3 Extra Length          0000 (0)\n-20FE5 Comment Length        0000 (0)\n-20FE7 Disk Start            0000 (0)\n-20FE9 Int File Attributes   0000 (0)\n+212CA Compression Method    0008 (8) 'Deflated'\n+212CC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+212D0 CRC                   92D33C56 (2463317078)\n+212D4 Compressed Size       00000290 (656)\n+212D8 Uncompressed Size     0000053A (1338)\n+212DC Filename Length       0027 (39)\n+212DE Extra Length          0000 (0)\n+212E0 Comment Length        0000 (0)\n+212E2 Disk Start            0000 (0)\n+212E4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-20FEB Ext File Attributes   81A40000 (2175008768)\n+212E6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-20FEF Local Header Offset   00002A1D (10781)\n-20FF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+212EA Local Header Offset   00002A3F (10815)\n+212EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x20FF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x212EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2101A CENTRAL HEADER #31    02014B50 (33639248)\n-2101E Created Zip Spec      14 (20) '2.0'\n-2101F Created OS            03 (3) 'Unix'\n-21020 Extract Zip Spec      14 (20) '2.0'\n-21021 Extract OS            00 (0) 'MS-DOS'\n-21022 General Purpose Flag  0800 (2048)\n+21315 CENTRAL HEADER #31    02014B50 (33639248)\n+21319 Created Zip Spec      14 (20) '2.0'\n+2131A Created OS            03 (3) 'Unix'\n+2131B Extract Zip Spec      14 (20) '2.0'\n+2131C Extract OS            00 (0) 'MS-DOS'\n+2131D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21024 Compression Method    0008 (8) 'Deflated'\n-21026 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2102A CRC                   8AC6D7E1 (2328287201)\n-2102E Compressed Size       000003BB (955)\n-21032 Uncompressed Size     000007D3 (2003)\n-21036 Filename Length       002E (46)\n-21038 Extra Length          0000 (0)\n-2103A Comment Length        0000 (0)\n-2103C Disk Start            0000 (0)\n-2103E Int File Attributes   0000 (0)\n+2131F Compression Method    0008 (8) 'Deflated'\n+21321 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21325 CRC                   8AC6D7E1 (2328287201)\n+21329 Compressed Size       000003BB (955)\n+2132D Uncompressed Size     000007D3 (2003)\n+21331 Filename Length       002E (46)\n+21333 Extra Length          0000 (0)\n+21335 Comment Length        0000 (0)\n+21337 Disk Start            0000 (0)\n+21339 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21040 Ext File Attributes   81A40000 (2175008768)\n+2133B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21044 Local Header Offset   00002CF2 (11506)\n-21048 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2133F Local Header Offset   00002D14 (11540)\n+21343 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21048: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21343: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21076 CENTRAL HEADER #32    02014B50 (33639248)\n-2107A Created Zip Spec      14 (20) '2.0'\n-2107B Created OS            03 (3) 'Unix'\n-2107C Extract Zip Spec      14 (20) '2.0'\n-2107D Extract OS            00 (0) 'MS-DOS'\n-2107E General Purpose Flag  0800 (2048)\n+21371 CENTRAL HEADER #32    02014B50 (33639248)\n+21375 Created Zip Spec      14 (20) '2.0'\n+21376 Created OS            03 (3) 'Unix'\n+21377 Extract Zip Spec      14 (20) '2.0'\n+21378 Extract OS            00 (0) 'MS-DOS'\n+21379 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21080 Compression Method    0008 (8) 'Deflated'\n-21082 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21086 CRC                   BDE39003 (3185807363)\n-2108A Compressed Size       000002C2 (706)\n-2108E Uncompressed Size     000005F9 (1529)\n-21092 Filename Length       0035 (53)\n-21094 Extra Length          0000 (0)\n-21096 Comment Length        0000 (0)\n-21098 Disk Start            0000 (0)\n-2109A Int File Attributes   0000 (0)\n+2137B Compression Method    0008 (8) 'Deflated'\n+2137D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21381 CRC                   12C409E5 (314837477)\n+21385 Compressed Size       000002C9 (713)\n+21389 Uncompressed Size     0000061F (1567)\n+2138D Filename Length       0035 (53)\n+2138F Extra Length          0000 (0)\n+21391 Comment Length        0000 (0)\n+21393 Disk Start            0000 (0)\n+21395 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2109C Ext File Attributes   81A40000 (2175008768)\n+21397 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-210A0 Local Header Offset   000030F9 (12537)\n-210A4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2139B Local Header Offset   0000311B (12571)\n+2139F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x210A4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2139F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-210D9 CENTRAL HEADER #33    02014B50 (33639248)\n-210DD Created Zip Spec      14 (20) '2.0'\n-210DE Created OS            03 (3) 'Unix'\n-210DF Extract Zip Spec      14 (20) '2.0'\n-210E0 Extract OS            00 (0) 'MS-DOS'\n-210E1 General Purpose Flag  0800 (2048)\n+213D4 CENTRAL HEADER #33    02014B50 (33639248)\n+213D8 Created Zip Spec      14 (20) '2.0'\n+213D9 Created OS            03 (3) 'Unix'\n+213DA Extract Zip Spec      14 (20) '2.0'\n+213DB Extract OS            00 (0) 'MS-DOS'\n+213DC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-210E3 Compression Method    0008 (8) 'Deflated'\n-210E5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-210E9 CRC                   6C2E2D81 (1814965633)\n-210ED Compressed Size       00000739 (1849)\n-210F1 Uncompressed Size     00001602 (5634)\n-210F5 Filename Length       002E (46)\n-210F7 Extra Length          0000 (0)\n-210F9 Comment Length        0000 (0)\n-210FB Disk Start            0000 (0)\n-210FD Int File Attributes   0000 (0)\n+213DE Compression Method    0008 (8) 'Deflated'\n+213E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+213E4 CRC                   6C2E2D81 (1814965633)\n+213E8 Compressed Size       00000739 (1849)\n+213EC Uncompressed Size     00001602 (5634)\n+213F0 Filename Length       002E (46)\n+213F2 Extra Length          0000 (0)\n+213F4 Comment Length        0000 (0)\n+213F6 Disk Start            0000 (0)\n+213F8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-210FF Ext File Attributes   81A40000 (2175008768)\n+213FA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21103 Local Header Offset   0000340E (13326)\n-21107 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+213FE Local Header Offset   00003437 (13367)\n+21402 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21107: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21402: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21135 CENTRAL HEADER #34    02014B50 (33639248)\n-21139 Created Zip Spec      14 (20) '2.0'\n-2113A Created OS            03 (3) 'Unix'\n-2113B Extract Zip Spec      14 (20) '2.0'\n-2113C Extract OS            00 (0) 'MS-DOS'\n-2113D General Purpose Flag  0800 (2048)\n+21430 CENTRAL HEADER #34    02014B50 (33639248)\n+21434 Created Zip Spec      14 (20) '2.0'\n+21435 Created OS            03 (3) 'Unix'\n+21436 Extract Zip Spec      14 (20) '2.0'\n+21437 Extract OS            00 (0) 'MS-DOS'\n+21438 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2113F Compression Method    0008 (8) 'Deflated'\n-21141 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21145 CRC                   350310AE (889393326)\n-21149 Compressed Size       0000024A (586)\n-2114D Uncompressed Size     0000048E (1166)\n-21151 Filename Length       0036 (54)\n-21153 Extra Length          0000 (0)\n-21155 Comment Length        0000 (0)\n-21157 Disk Start            0000 (0)\n-21159 Int File Attributes   0000 (0)\n+2143A Compression Method    0008 (8) 'Deflated'\n+2143C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21440 CRC                   ED9B9E6B (3986398827)\n+21444 Compressed Size       00000255 (597)\n+21448 Uncompressed Size     000004B7 (1207)\n+2144C Filename Length       0036 (54)\n+2144E Extra Length          0000 (0)\n+21450 Comment Length        0000 (0)\n+21452 Disk Start            0000 (0)\n+21454 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2115B Ext File Attributes   81A40000 (2175008768)\n+21456 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2115F Local Header Offset   00003B93 (15251)\n-21163 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2145A Local Header Offset   00003BBC (15292)\n+2145E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21163: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2145E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21199 CENTRAL HEADER #35    02014B50 (33639248)\n-2119D Created Zip Spec      14 (20) '2.0'\n-2119E Created OS            03 (3) 'Unix'\n-2119F Extract Zip Spec      14 (20) '2.0'\n-211A0 Extract OS            00 (0) 'MS-DOS'\n-211A1 General Purpose Flag  0800 (2048)\n+21494 CENTRAL HEADER #35    02014B50 (33639248)\n+21498 Created Zip Spec      14 (20) '2.0'\n+21499 Created OS            03 (3) 'Unix'\n+2149A Extract Zip Spec      14 (20) '2.0'\n+2149B Extract OS            00 (0) 'MS-DOS'\n+2149C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-211A3 Compression Method    0008 (8) 'Deflated'\n-211A5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-211A9 CRC                   D05840B7 (3495444663)\n-211AD Compressed Size       0000030B (779)\n-211B1 Uncompressed Size     00000833 (2099)\n-211B5 Filename Length       003E (62)\n-211B7 Extra Length          0000 (0)\n-211B9 Comment Length        0000 (0)\n-211BB Disk Start            0000 (0)\n-211BD Int File Attributes   0000 (0)\n+2149E Compression Method    0008 (8) 'Deflated'\n+214A0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+214A4 CRC                   3799B565 (932820325)\n+214A8 Compressed Size       00000312 (786)\n+214AC Uncompressed Size     0000086B (2155)\n+214B0 Filename Length       003E (62)\n+214B2 Extra Length          0000 (0)\n+214B4 Comment Length        0000 (0)\n+214B6 Disk Start            0000 (0)\n+214B8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-211BF Ext File Attributes   81A40000 (2175008768)\n+214BA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-211C3 Local Header Offset   00003E31 (15921)\n-211C7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+214BE Local Header Offset   00003E65 (15973)\n+214C2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x211C7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x214C2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21205 CENTRAL HEADER #36    02014B50 (33639248)\n-21209 Created Zip Spec      14 (20) '2.0'\n-2120A Created OS            03 (3) 'Unix'\n-2120B Extract Zip Spec      14 (20) '2.0'\n-2120C Extract OS            00 (0) 'MS-DOS'\n-2120D General Purpose Flag  0800 (2048)\n+21500 CENTRAL HEADER #36    02014B50 (33639248)\n+21504 Created Zip Spec      14 (20) '2.0'\n+21505 Created OS            03 (3) 'Unix'\n+21506 Extract Zip Spec      14 (20) '2.0'\n+21507 Extract OS            00 (0) 'MS-DOS'\n+21508 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2120F Compression Method    0008 (8) 'Deflated'\n-21211 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21215 CRC                   D9AD2407 (3652002823)\n-21219 Compressed Size       0000032E (814)\n-2121D Uncompressed Size     000006C3 (1731)\n-21221 Filename Length       0045 (69)\n-21223 Extra Length          0000 (0)\n-21225 Comment Length        0000 (0)\n-21227 Disk Start            0000 (0)\n-21229 Int File Attributes   0000 (0)\n+2150A Compression Method    0008 (8) 'Deflated'\n+2150C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21510 CRC                   0B335580 (187913600)\n+21514 Compressed Size       00000337 (823)\n+21518 Uncompressed Size     000006ED (1773)\n+2151C Filename Length       0045 (69)\n+2151E Extra Length          0000 (0)\n+21520 Comment Length        0000 (0)\n+21522 Disk Start            0000 (0)\n+21524 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2122B Ext File Attributes   81A40000 (2175008768)\n+21526 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2122F Local Header Offset   00004198 (16792)\n-21233 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2152A Local Header Offset   000041D3 (16851)\n+2152E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21233: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2152E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21278 CENTRAL HEADER #37    02014B50 (33639248)\n-2127C Created Zip Spec      14 (20) '2.0'\n-2127D Created OS            03 (3) 'Unix'\n-2127E Extract Zip Spec      14 (20) '2.0'\n-2127F Extract OS            00 (0) 'MS-DOS'\n-21280 General Purpose Flag  0800 (2048)\n+21573 CENTRAL HEADER #37    02014B50 (33639248)\n+21577 Created Zip Spec      14 (20) '2.0'\n+21578 Created OS            03 (3) 'Unix'\n+21579 Extract Zip Spec      14 (20) '2.0'\n+2157A Extract OS            00 (0) 'MS-DOS'\n+2157B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21282 Compression Method    0008 (8) 'Deflated'\n-21284 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21288 CRC                   6AAAC02C (1789575212)\n-2128C Compressed Size       00000294 (660)\n-21290 Uncompressed Size     00000565 (1381)\n-21294 Filename Length       0046 (70)\n-21296 Extra Length          0000 (0)\n-21298 Comment Length        0000 (0)\n-2129A Disk Start            0000 (0)\n-2129C Int File Attributes   0000 (0)\n+2157D Compression Method    0008 (8) 'Deflated'\n+2157F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21583 CRC                   4E9CD747 (1318901575)\n+21587 Compressed Size       0000029C (668)\n+2158B Uncompressed Size     00000587 (1415)\n+2158F Filename Length       0046 (70)\n+21591 Extra Length          0000 (0)\n+21593 Comment Length        0000 (0)\n+21595 Disk Start            0000 (0)\n+21597 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2129E Ext File Attributes   81A40000 (2175008768)\n+21599 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-212A2 Local Header Offset   00004529 (17705)\n-212A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2159D Local Header Offset   0000456D (17773)\n+215A1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x212A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x215A1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-212EC CENTRAL HEADER #38    02014B50 (33639248)\n-212F0 Created Zip Spec      14 (20) '2.0'\n-212F1 Created OS            03 (3) 'Unix'\n-212F2 Extract Zip Spec      14 (20) '2.0'\n-212F3 Extract OS            00 (0) 'MS-DOS'\n-212F4 General Purpose Flag  0800 (2048)\n+215E7 CENTRAL HEADER #38    02014B50 (33639248)\n+215EB Created Zip Spec      14 (20) '2.0'\n+215EC Created OS            03 (3) 'Unix'\n+215ED Extract Zip Spec      14 (20) '2.0'\n+215EE Extract OS            00 (0) 'MS-DOS'\n+215EF General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-212F6 Compression Method    0008 (8) 'Deflated'\n-212F8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-212FC CRC                   5F8855A5 (1602770341)\n-21300 Compressed Size       0000038F (911)\n-21304 Uncompressed Size     00000870 (2160)\n-21308 Filename Length       0044 (68)\n-2130A Extra Length          0000 (0)\n-2130C Comment Length        0000 (0)\n-2130E Disk Start            0000 (0)\n-21310 Int File Attributes   0000 (0)\n+215F1 Compression Method    0008 (8) 'Deflated'\n+215F3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+215F7 CRC                   A92DE3D2 (2838356946)\n+215FB Compressed Size       0000039B (923)\n+215FF Uncompressed Size     000008A1 (2209)\n+21603 Filename Length       0044 (68)\n+21605 Extra Length          0000 (0)\n+21607 Comment Length        0000 (0)\n+21609 Disk Start            0000 (0)\n+2160B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21312 Ext File Attributes   81A40000 (2175008768)\n+2160D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21316 Local Header Offset   00004821 (18465)\n-2131A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21611 Local Header Offset   0000486D (18541)\n+21615 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2131A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21615: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2135E CENTRAL HEADER #39    02014B50 (33639248)\n-21362 Created Zip Spec      14 (20) '2.0'\n-21363 Created OS            03 (3) 'Unix'\n-21364 Extract Zip Spec      14 (20) '2.0'\n-21365 Extract OS            00 (0) 'MS-DOS'\n-21366 General Purpose Flag  0800 (2048)\n+21659 CENTRAL HEADER #39    02014B50 (33639248)\n+2165D Created Zip Spec      14 (20) '2.0'\n+2165E Created OS            03 (3) 'Unix'\n+2165F Extract Zip Spec      14 (20) '2.0'\n+21660 Extract OS            00 (0) 'MS-DOS'\n+21661 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21368 Compression Method    0008 (8) 'Deflated'\n-2136A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2136E CRC                   C2AD0276 (3266118262)\n-21372 Compressed Size       000006C4 (1732)\n-21376 Uncompressed Size     000017B0 (6064)\n-2137A Filename Length       003C (60)\n-2137C Extra Length          0000 (0)\n-2137E Comment Length        0000 (0)\n-21380 Disk Start            0000 (0)\n-21382 Int File Attributes   0000 (0)\n+21663 Compression Method    0008 (8) 'Deflated'\n+21665 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21669 CRC                   B19E4EA6 (2979942054)\n+2166D Compressed Size       000006D3 (1747)\n+21671 Uncompressed Size     0000188D (6285)\n+21675 Filename Length       003C (60)\n+21677 Extra Length          0000 (0)\n+21679 Comment Length        0000 (0)\n+2167B Disk Start            0000 (0)\n+2167D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21384 Ext File Attributes   81A40000 (2175008768)\n+2167F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21388 Local Header Offset   00004C12 (19474)\n-2138C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21683 Local Header Offset   00004C6A (19562)\n+21687 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2138C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21687: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-213C8 CENTRAL HEADER #40    02014B50 (33639248)\n-213CC Created Zip Spec      14 (20) '2.0'\n-213CD Created OS            03 (3) 'Unix'\n-213CE Extract Zip Spec      14 (20) '2.0'\n-213CF Extract OS            00 (0) 'MS-DOS'\n-213D0 General Purpose Flag  0800 (2048)\n+216C3 CENTRAL HEADER #40    02014B50 (33639248)\n+216C7 Created Zip Spec      14 (20) '2.0'\n+216C8 Created OS            03 (3) 'Unix'\n+216C9 Extract Zip Spec      14 (20) '2.0'\n+216CA Extract OS            00 (0) 'MS-DOS'\n+216CB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-213D2 Compression Method    0008 (8) 'Deflated'\n-213D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-213D8 CRC                   77B5952D (2008388909)\n-213DC Compressed Size       00000901 (2305)\n-213E0 Uncompressed Size     00002A27 (10791)\n-213E4 Filename Length       0045 (69)\n-213E6 Extra Length          0000 (0)\n-213E8 Comment Length        0000 (0)\n-213EA Disk Start            0000 (0)\n-213EC Int File Attributes   0000 (0)\n+216CD Compression Method    0008 (8) 'Deflated'\n+216CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+216D3 CRC                   25CCFC5A (634190938)\n+216D7 Compressed Size       00000913 (2323)\n+216DB Uncompressed Size     00002B62 (11106)\n+216DF Filename Length       0045 (69)\n+216E1 Extra Length          0000 (0)\n+216E3 Comment Length        0000 (0)\n+216E5 Disk Start            0000 (0)\n+216E7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-213EE Ext File Attributes   81A40000 (2175008768)\n+216E9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-213F2 Local Header Offset   00005330 (21296)\n-213F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+216ED Local Header Offset   00005397 (21399)\n+216F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x213F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x216F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2143B CENTRAL HEADER #41    02014B50 (33639248)\n-2143F Created Zip Spec      14 (20) '2.0'\n-21440 Created OS            03 (3) 'Unix'\n-21441 Extract Zip Spec      14 (20) '2.0'\n-21442 Extract OS            00 (0) 'MS-DOS'\n-21443 General Purpose Flag  0800 (2048)\n+21736 CENTRAL HEADER #41    02014B50 (33639248)\n+2173A Created Zip Spec      14 (20) '2.0'\n+2173B Created OS            03 (3) 'Unix'\n+2173C Extract Zip Spec      14 (20) '2.0'\n+2173D Extract OS            00 (0) 'MS-DOS'\n+2173E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21445 Compression Method    0008 (8) 'Deflated'\n-21447 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2144B CRC                   013987D8 (20547544)\n-2144F Compressed Size       0000087C (2172)\n-21453 Uncompressed Size     00001FF0 (8176)\n-21457 Filename Length       0040 (64)\n-21459 Extra Length          0000 (0)\n-2145B Comment Length        0000 (0)\n-2145D Disk Start            0000 (0)\n-2145F Int File Attributes   0000 (0)\n+21740 Compression Method    0008 (8) 'Deflated'\n+21742 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21746 CRC                   DEC94C5D (3737734237)\n+2174A Compressed Size       0000088A (2186)\n+2174E Uncompressed Size     000020CD (8397)\n+21752 Filename Length       0040 (64)\n+21754 Extra Length          0000 (0)\n+21756 Comment Length        0000 (0)\n+21758 Disk Start            0000 (0)\n+2175A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21461 Ext File Attributes   81A40000 (2175008768)\n+2175C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21465 Local Header Offset   00005C94 (23700)\n-21469 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21760 Local Header Offset   00005D0D (23821)\n+21764 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21469: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21764: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-214A9 CENTRAL HEADER #42    02014B50 (33639248)\n-214AD Created Zip Spec      14 (20) '2.0'\n-214AE Created OS            03 (3) 'Unix'\n-214AF Extract Zip Spec      14 (20) '2.0'\n-214B0 Extract OS            00 (0) 'MS-DOS'\n-214B1 General Purpose Flag  0800 (2048)\n+217A4 CENTRAL HEADER #42    02014B50 (33639248)\n+217A8 Created Zip Spec      14 (20) '2.0'\n+217A9 Created OS            03 (3) 'Unix'\n+217AA Extract Zip Spec      14 (20) '2.0'\n+217AB Extract OS            00 (0) 'MS-DOS'\n+217AC General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-214B3 Compression Method    0008 (8) 'Deflated'\n-214B5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-214B9 CRC                   E564338A (3848549258)\n-214BD Compressed Size       0000087A (2170)\n-214C1 Uncompressed Size     00002F23 (12067)\n-214C5 Filename Length       0038 (56)\n-214C7 Extra Length          0000 (0)\n-214C9 Comment Length        0000 (0)\n-214CB Disk Start            0000 (0)\n-214CD Int File Attributes   0000 (0)\n+217AE Compression Method    0008 (8) 'Deflated'\n+217B0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+217B4 CRC                   71025D3E (1895980350)\n+217B8 Compressed Size       0000088C (2188)\n+217BC Uncompressed Size     0000309E (12446)\n+217C0 Filename Length       0038 (56)\n+217C2 Extra Length          0000 (0)\n+217C4 Comment Length        0000 (0)\n+217C6 Disk Start            0000 (0)\n+217C8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-214CF Ext File Attributes   81A40000 (2175008768)\n+217CA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-214D3 Local Header Offset   0000656E (25966)\n-214D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+217CE Local Header Offset   000065F5 (26101)\n+217D2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x214D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x217D2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2150F CENTRAL HEADER #43    02014B50 (33639248)\n-21513 Created Zip Spec      14 (20) '2.0'\n-21514 Created OS            03 (3) 'Unix'\n-21515 Extract Zip Spec      14 (20) '2.0'\n-21516 Extract OS            00 (0) 'MS-DOS'\n-21517 General Purpose Flag  0800 (2048)\n+2180A CENTRAL HEADER #43    02014B50 (33639248)\n+2180E Created Zip Spec      14 (20) '2.0'\n+2180F Created OS            03 (3) 'Unix'\n+21810 Extract Zip Spec      14 (20) '2.0'\n+21811 Extract OS            00 (0) 'MS-DOS'\n+21812 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21519 Compression Method    0008 (8) 'Deflated'\n-2151B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2151F CRC                   4D393448 (1295594568)\n-21523 Compressed Size       000002BF (703)\n-21527 Uncompressed Size     000005E0 (1504)\n-2152B Filename Length       003F (63)\n-2152D Extra Length          0000 (0)\n-2152F Comment Length        0000 (0)\n-21531 Disk Start            0000 (0)\n-21533 Int File Attributes   0000 (0)\n+21814 Compression Method    0008 (8) 'Deflated'\n+21816 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2181A CRC                   BE5FB3B5 (3193942965)\n+2181E Compressed Size       000002C9 (713)\n+21822 Uncompressed Size     00000604 (1540)\n+21826 Filename Length       003F (63)\n+21828 Extra Length          0000 (0)\n+2182A Comment Length        0000 (0)\n+2182C Disk Start            0000 (0)\n+2182E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21535 Ext File Attributes   81A40000 (2175008768)\n+21830 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21539 Local Header Offset   00006E3E (28222)\n-2153D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21834 Local Header Offset   00006ED7 (28375)\n+21838 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2153D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21838: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2157C CENTRAL HEADER #44    02014B50 (33639248)\n-21580 Created Zip Spec      14 (20) '2.0'\n-21581 Created OS            03 (3) 'Unix'\n-21582 Extract Zip Spec      14 (20) '2.0'\n-21583 Extract OS            00 (0) 'MS-DOS'\n-21584 General Purpose Flag  0800 (2048)\n+21877 CENTRAL HEADER #44    02014B50 (33639248)\n+2187B Created Zip Spec      14 (20) '2.0'\n+2187C Created OS            03 (3) 'Unix'\n+2187D Extract Zip Spec      14 (20) '2.0'\n+2187E Extract OS            00 (0) 'MS-DOS'\n+2187F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21586 Compression Method    0008 (8) 'Deflated'\n-21588 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2158C CRC                   6E2B9BED (1848351725)\n-21590 Compressed Size       00000A39 (2617)\n-21594 Uncompressed Size     00002EA9 (11945)\n-21598 Filename Length       0036 (54)\n-2159A Extra Length          0000 (0)\n-2159C Comment Length        0000 (0)\n-2159E Disk Start            0000 (0)\n-215A0 Int File Attributes   0000 (0)\n+21881 Compression Method    0008 (8) 'Deflated'\n+21883 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21887 CRC                   ED1E1920 (3978172704)\n+2188B Compressed Size       00000A47 (2631)\n+2188F Uncompressed Size     00002FC8 (12232)\n+21893 Filename Length       0036 (54)\n+21895 Extra Length          0000 (0)\n+21897 Comment Length        0000 (0)\n+21899 Disk Start            0000 (0)\n+2189B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-215A2 Ext File Attributes   81A40000 (2175008768)\n+2189D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-215A6 Local Header Offset   0000715A (29018)\n-215AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+218A1 Local Header Offset   000071FD (29181)\n+218A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x215AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x218A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-215E0 CENTRAL HEADER #45    02014B50 (33639248)\n-215E4 Created Zip Spec      14 (20) '2.0'\n-215E5 Created OS            03 (3) 'Unix'\n-215E6 Extract Zip Spec      14 (20) '2.0'\n-215E7 Extract OS            00 (0) 'MS-DOS'\n-215E8 General Purpose Flag  0800 (2048)\n+218DB CENTRAL HEADER #45    02014B50 (33639248)\n+218DF Created Zip Spec      14 (20) '2.0'\n+218E0 Created OS            03 (3) 'Unix'\n+218E1 Extract Zip Spec      14 (20) '2.0'\n+218E2 Extract OS            00 (0) 'MS-DOS'\n+218E3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-215EA Compression Method    0008 (8) 'Deflated'\n-215EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-215F0 CRC                   9F02351C (2667722012)\n-215F4 Compressed Size       00000327 (807)\n-215F8 Uncompressed Size     000007B6 (1974)\n-215FC Filename Length       003D (61)\n-215FE Extra Length          0000 (0)\n-21600 Comment Length        0000 (0)\n-21602 Disk Start            0000 (0)\n-21604 Int File Attributes   0000 (0)\n+218E5 Compression Method    0008 (8) 'Deflated'\n+218E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+218EB CRC                   9286ACC7 (2458299591)\n+218EF Compressed Size       00000331 (817)\n+218F3 Uncompressed Size     000007EB (2027)\n+218F7 Filename Length       003D (61)\n+218F9 Extra Length          0000 (0)\n+218FB Comment Length        0000 (0)\n+218FD Disk Start            0000 (0)\n+218FF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21606 Ext File Attributes   81A40000 (2175008768)\n+21901 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2160A Local Header Offset   00007BE7 (31719)\n-2160E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21905 Local Header Offset   00007C98 (31896)\n+21909 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2160E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21909: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2164B CENTRAL HEADER #46    02014B50 (33639248)\n-2164F Created Zip Spec      14 (20) '2.0'\n-21650 Created OS            03 (3) 'Unix'\n-21651 Extract Zip Spec      14 (20) '2.0'\n-21652 Extract OS            00 (0) 'MS-DOS'\n-21653 General Purpose Flag  0800 (2048)\n+21946 CENTRAL HEADER #46    02014B50 (33639248)\n+2194A Created Zip Spec      14 (20) '2.0'\n+2194B Created OS            03 (3) 'Unix'\n+2194C Extract Zip Spec      14 (20) '2.0'\n+2194D Extract OS            00 (0) 'MS-DOS'\n+2194E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21655 Compression Method    0008 (8) 'Deflated'\n-21657 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2165B CRC                   88D1E805 (2295457797)\n-2165F Compressed Size       00001221 (4641)\n-21663 Uncompressed Size     0000521E (21022)\n-21667 Filename Length       003E (62)\n-21669 Extra Length          0000 (0)\n-2166B Comment Length        0000 (0)\n-2166D Disk Start            0000 (0)\n-2166F Int File Attributes   0000 (0)\n+21950 Compression Method    0008 (8) 'Deflated'\n+21952 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21956 CRC                   8EF20CD3 (2398227667)\n+2195A Compressed Size       0000123B (4667)\n+2195E Uncompressed Size     00005410 (21520)\n+21962 Filename Length       003E (62)\n+21964 Extra Length          0000 (0)\n+21966 Comment Length        0000 (0)\n+21968 Disk Start            0000 (0)\n+2196A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21671 Ext File Attributes   81A40000 (2175008768)\n+2196C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21675 Local Header Offset   00007F69 (32617)\n-21679 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21970 Local Header Offset   00008024 (32804)\n+21974 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21679: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21974: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-216B7 CENTRAL HEADER #47    02014B50 (33639248)\n-216BB Created Zip Spec      14 (20) '2.0'\n-216BC Created OS            03 (3) 'Unix'\n-216BD Extract Zip Spec      14 (20) '2.0'\n-216BE Extract OS            00 (0) 'MS-DOS'\n-216BF General Purpose Flag  0800 (2048)\n+219B2 CENTRAL HEADER #47    02014B50 (33639248)\n+219B6 Created Zip Spec      14 (20) '2.0'\n+219B7 Created OS            03 (3) 'Unix'\n+219B8 Extract Zip Spec      14 (20) '2.0'\n+219B9 Extract OS            00 (0) 'MS-DOS'\n+219BA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-216C1 Compression Method    0008 (8) 'Deflated'\n-216C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-216C7 CRC                   1C63503A (476270650)\n-216CB Compressed Size       00000C27 (3111)\n-216CF Uncompressed Size     00002CDC (11484)\n-216D3 Filename Length       0047 (71)\n-216D5 Extra Length          0000 (0)\n-216D7 Comment Length        0000 (0)\n-216D9 Disk Start            0000 (0)\n-216DB Int File Attributes   0000 (0)\n+219BC Compression Method    0008 (8) 'Deflated'\n+219BE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+219C2 CRC                   82D7146C (2195133548)\n+219C6 Compressed Size       00000C35 (3125)\n+219CA Uncompressed Size     00002DE5 (11749)\n+219CE Filename Length       0047 (71)\n+219D0 Extra Length          0000 (0)\n+219D2 Comment Length        0000 (0)\n+219D4 Disk Start            0000 (0)\n+219D6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-216DD Ext File Attributes   81A40000 (2175008768)\n+219D8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-216E1 Local Header Offset   000091E6 (37350)\n-216E5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+219DC Local Header Offset   000092BB (37563)\n+219E0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x216E5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x219E0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2172C CENTRAL HEADER #48    02014B50 (33639248)\n-21730 Created Zip Spec      14 (20) '2.0'\n-21731 Created OS            03 (3) 'Unix'\n-21732 Extract Zip Spec      14 (20) '2.0'\n-21733 Extract OS            00 (0) 'MS-DOS'\n-21734 General Purpose Flag  0800 (2048)\n+21A27 CENTRAL HEADER #48    02014B50 (33639248)\n+21A2B Created Zip Spec      14 (20) '2.0'\n+21A2C Created OS            03 (3) 'Unix'\n+21A2D Extract Zip Spec      14 (20) '2.0'\n+21A2E Extract OS            00 (0) 'MS-DOS'\n+21A2F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21736 Compression Method    0008 (8) 'Deflated'\n-21738 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2173C CRC                   A7D42D9C (2815700380)\n-21740 Compressed Size       000002F5 (757)\n-21744 Uncompressed Size     0000068D (1677)\n-21748 Filename Length       0045 (69)\n-2174A Extra Length          0000 (0)\n-2174C Comment Length        0000 (0)\n-2174E Disk Start            0000 (0)\n-21750 Int File Attributes   0000 (0)\n+21A31 Compression Method    0008 (8) 'Deflated'\n+21A33 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21A37 CRC                   988327A2 (2558732194)\n+21A3B Compressed Size       000002FF (767)\n+21A3F Uncompressed Size     000006B3 (1715)\n+21A43 Filename Length       0045 (69)\n+21A45 Extra Length          0000 (0)\n+21A47 Comment Length        0000 (0)\n+21A49 Disk Start            0000 (0)\n+21A4B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21752 Ext File Attributes   81A40000 (2175008768)\n+21A4D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21756 Local Header Offset   00009E72 (40562)\n-2175A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21A51 Local Header Offset   00009F55 (40789)\n+21A55 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2175A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21A55: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2179F CENTRAL HEADER #49    02014B50 (33639248)\n-217A3 Created Zip Spec      14 (20) '2.0'\n-217A4 Created OS            03 (3) 'Unix'\n-217A5 Extract Zip Spec      14 (20) '2.0'\n-217A6 Extract OS            00 (0) 'MS-DOS'\n-217A7 General Purpose Flag  0800 (2048)\n+21A9A CENTRAL HEADER #49    02014B50 (33639248)\n+21A9E Created Zip Spec      14 (20) '2.0'\n+21A9F Created OS            03 (3) 'Unix'\n+21AA0 Extract Zip Spec      14 (20) '2.0'\n+21AA1 Extract OS            00 (0) 'MS-DOS'\n+21AA2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-217A9 Compression Method    0008 (8) 'Deflated'\n-217AB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-217AF CRC                   F623C4B3 (4129539251)\n-217B3 Compressed Size       000004AB (1195)\n-217B7 Uncompressed Size     00000DAA (3498)\n-217BB Filename Length       0035 (53)\n-217BD Extra Length          0000 (0)\n-217BF Comment Length        0000 (0)\n-217C1 Disk Start            0000 (0)\n-217C3 Int File Attributes   0000 (0)\n+21AA4 Compression Method    0008 (8) 'Deflated'\n+21AA6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21AAA CRC                   756EE014 (1970200596)\n+21AAE Compressed Size       000004B5 (1205)\n+21AB2 Uncompressed Size     00000E28 (3624)\n+21AB6 Filename Length       0035 (53)\n+21AB8 Extra Length          0000 (0)\n+21ABA Comment Length        0000 (0)\n+21ABC Disk Start            0000 (0)\n+21ABE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-217C5 Ext File Attributes   81A40000 (2175008768)\n+21AC0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-217C9 Local Header Offset   0000A1CA (41418)\n-217CD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21AC4 Local Header Offset   0000A2B7 (41655)\n+21AC8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x217CD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21AC8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21802 CENTRAL HEADER #50    02014B50 (33639248)\n-21806 Created Zip Spec      14 (20) '2.0'\n-21807 Created OS            03 (3) 'Unix'\n-21808 Extract Zip Spec      14 (20) '2.0'\n-21809 Extract OS            00 (0) 'MS-DOS'\n-2180A General Purpose Flag  0800 (2048)\n+21AFD CENTRAL HEADER #50    02014B50 (33639248)\n+21B01 Created Zip Spec      14 (20) '2.0'\n+21B02 Created OS            03 (3) 'Unix'\n+21B03 Extract Zip Spec      14 (20) '2.0'\n+21B04 Extract OS            00 (0) 'MS-DOS'\n+21B05 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2180C Compression Method    0008 (8) 'Deflated'\n-2180E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21812 CRC                   5B09319E (1527329182)\n-21816 Compressed Size       000002B4 (692)\n-2181A Uncompressed Size     000005D6 (1494)\n-2181E Filename Length       003F (63)\n-21820 Extra Length          0000 (0)\n-21822 Comment Length        0000 (0)\n-21824 Disk Start            0000 (0)\n-21826 Int File Attributes   0000 (0)\n+21B07 Compression Method    0008 (8) 'Deflated'\n+21B09 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21B0D CRC                   3557220F (894902799)\n+21B11 Compressed Size       000002BE (702)\n+21B15 Uncompressed Size     000005FC (1532)\n+21B19 Filename Length       003F (63)\n+21B1B Extra Length          0000 (0)\n+21B1D Comment Length        0000 (0)\n+21B1F Disk Start            0000 (0)\n+21B21 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21828 Ext File Attributes   81A40000 (2175008768)\n+21B23 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2182C Local Header Offset   0000A6C8 (42696)\n-21830 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21B27 Local Header Offset   0000A7BF (42943)\n+21B2B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21830: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21B2B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2186F CENTRAL HEADER #51    02014B50 (33639248)\n-21873 Created Zip Spec      14 (20) '2.0'\n-21874 Created OS            03 (3) 'Unix'\n-21875 Extract Zip Spec      14 (20) '2.0'\n-21876 Extract OS            00 (0) 'MS-DOS'\n-21877 General Purpose Flag  0800 (2048)\n+21B6A CENTRAL HEADER #51    02014B50 (33639248)\n+21B6E Created Zip Spec      14 (20) '2.0'\n+21B6F Created OS            03 (3) 'Unix'\n+21B70 Extract Zip Spec      14 (20) '2.0'\n+21B71 Extract OS            00 (0) 'MS-DOS'\n+21B72 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21879 Compression Method    0008 (8) 'Deflated'\n-2187B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2187F CRC                   504AAFAB (1347071915)\n-21883 Compressed Size       0000027D (637)\n-21887 Uncompressed Size     000004F6 (1270)\n-2188B Filename Length       004A (74)\n-2188D Extra Length          0000 (0)\n-2188F Comment Length        0000 (0)\n-21891 Disk Start            0000 (0)\n-21893 Int File Attributes   0000 (0)\n+21B74 Compression Method    0008 (8) 'Deflated'\n+21B76 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21B7A CRC                   B96C1EAA (3110870698)\n+21B7E Compressed Size       00000285 (645)\n+21B82 Uncompressed Size     00000517 (1303)\n+21B86 Filename Length       004A (74)\n+21B88 Extra Length          0000 (0)\n+21B8A Comment Length        0000 (0)\n+21B8C Disk Start            0000 (0)\n+21B8E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21895 Ext File Attributes   81A40000 (2175008768)\n+21B90 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21899 Local Header Offset   0000A9D9 (43481)\n-2189D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21B94 Local Header Offset   0000AADA (43738)\n+21B98 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2189D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21B98: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-218E7 CENTRAL HEADER #52    02014B50 (33639248)\n-218EB Created Zip Spec      14 (20) '2.0'\n-218EC Created OS            03 (3) 'Unix'\n-218ED Extract Zip Spec      14 (20) '2.0'\n-218EE Extract OS            00 (0) 'MS-DOS'\n-218EF General Purpose Flag  0800 (2048)\n+21BE2 CENTRAL HEADER #52    02014B50 (33639248)\n+21BE6 Created Zip Spec      14 (20) '2.0'\n+21BE7 Created OS            03 (3) 'Unix'\n+21BE8 Extract Zip Spec      14 (20) '2.0'\n+21BE9 Extract OS            00 (0) 'MS-DOS'\n+21BEA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-218F1 Compression Method    0008 (8) 'Deflated'\n-218F3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-218F7 CRC                   24C1B311 (616674065)\n-218FB Compressed Size       00000280 (640)\n-218FF Uncompressed Size     000004FB (1275)\n-21903 Filename Length       004B (75)\n-21905 Extra Length          0000 (0)\n-21907 Comment Length        0000 (0)\n-21909 Disk Start            0000 (0)\n-2190B Int File Attributes   0000 (0)\n+21BEC Compression Method    0008 (8) 'Deflated'\n+21BEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21BF2 CRC                   7934C791 (2033502097)\n+21BF6 Compressed Size       00000287 (647)\n+21BFA Uncompressed Size     0000051C (1308)\n+21BFE Filename Length       004B (75)\n+21C00 Extra Length          0000 (0)\n+21C02 Comment Length        0000 (0)\n+21C04 Disk Start            0000 (0)\n+21C06 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2190D Ext File Attributes   81A40000 (2175008768)\n+21C08 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21911 Local Header Offset   0000ACBE (44222)\n-21915 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21C0C Local Header Offset   0000ADC7 (44487)\n+21C10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21915: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21C10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21960 CENTRAL HEADER #53    02014B50 (33639248)\n-21964 Created Zip Spec      14 (20) '2.0'\n-21965 Created OS            03 (3) 'Unix'\n-21966 Extract Zip Spec      14 (20) '2.0'\n-21967 Extract OS            00 (0) 'MS-DOS'\n-21968 General Purpose Flag  0800 (2048)\n+21C5B CENTRAL HEADER #53    02014B50 (33639248)\n+21C5F Created Zip Spec      14 (20) '2.0'\n+21C60 Created OS            03 (3) 'Unix'\n+21C61 Extract Zip Spec      14 (20) '2.0'\n+21C62 Extract OS            00 (0) 'MS-DOS'\n+21C63 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2196A Compression Method    0008 (8) 'Deflated'\n-2196C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21970 CRC                   F122AA0E (4045580814)\n-21974 Compressed Size       0000035E (862)\n-21978 Uncompressed Size     0000086F (2159)\n-2197C Filename Length       0041 (65)\n-2197E Extra Length          0000 (0)\n-21980 Comment Length        0000 (0)\n-21982 Disk Start            0000 (0)\n-21984 Int File Attributes   0000 (0)\n+21C65 Compression Method    0008 (8) 'Deflated'\n+21C67 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21C6B CRC                   BF357544 (3207951684)\n+21C6F Compressed Size       00000365 (869)\n+21C73 Uncompressed Size     000008B2 (2226)\n+21C77 Filename Length       0041 (65)\n+21C79 Extra Length          0000 (0)\n+21C7B Comment Length        0000 (0)\n+21C7D Disk Start            0000 (0)\n+21C7F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21986 Ext File Attributes   81A40000 (2175008768)\n+21C81 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2198A Local Header Offset   0000AFA7 (44967)\n-2198E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21C85 Local Header Offset   0000B0B7 (45239)\n+21C89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2198E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21C89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-219CF CENTRAL HEADER #54    02014B50 (33639248)\n-219D3 Created Zip Spec      14 (20) '2.0'\n-219D4 Created OS            03 (3) 'Unix'\n-219D5 Extract Zip Spec      14 (20) '2.0'\n-219D6 Extract OS            00 (0) 'MS-DOS'\n-219D7 General Purpose Flag  0800 (2048)\n+21CCA CENTRAL HEADER #54    02014B50 (33639248)\n+21CCE Created Zip Spec      14 (20) '2.0'\n+21CCF Created OS            03 (3) 'Unix'\n+21CD0 Extract Zip Spec      14 (20) '2.0'\n+21CD1 Extract OS            00 (0) 'MS-DOS'\n+21CD2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-219D9 Compression Method    0008 (8) 'Deflated'\n-219DB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-219DF CRC                   267DEE50 (645787216)\n-219E3 Compressed Size       00000308 (776)\n-219E7 Uncompressed Size     0000067B (1659)\n-219EB Filename Length       004A (74)\n-219ED Extra Length          0000 (0)\n-219EF Comment Length        0000 (0)\n-219F1 Disk Start            0000 (0)\n-219F3 Int File Attributes   0000 (0)\n+21CD4 Compression Method    0008 (8) 'Deflated'\n+21CD6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21CDA CRC                   59957DEF (1502969327)\n+21CDE Compressed Size       00000311 (785)\n+21CE2 Uncompressed Size     000006AB (1707)\n+21CE6 Filename Length       004A (74)\n+21CE8 Extra Length          0000 (0)\n+21CEA Comment Length        0000 (0)\n+21CEC Disk Start            0000 (0)\n+21CEE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-219F5 Ext File Attributes   81A40000 (2175008768)\n+21CF0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-219F9 Local Header Offset   0000B364 (45924)\n-219FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21CF4 Local Header Offset   0000B47B (46203)\n+21CF8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x219FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21CF8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21A47 CENTRAL HEADER #55    02014B50 (33639248)\n-21A4B Created Zip Spec      14 (20) '2.0'\n-21A4C Created OS            03 (3) 'Unix'\n-21A4D Extract Zip Spec      14 (20) '2.0'\n-21A4E Extract OS            00 (0) 'MS-DOS'\n-21A4F General Purpose Flag  0800 (2048)\n+21D42 CENTRAL HEADER #55    02014B50 (33639248)\n+21D46 Created Zip Spec      14 (20) '2.0'\n+21D47 Created OS            03 (3) 'Unix'\n+21D48 Extract Zip Spec      14 (20) '2.0'\n+21D49 Extract OS            00 (0) 'MS-DOS'\n+21D4A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21A51 Compression Method    0008 (8) 'Deflated'\n-21A53 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21A57 CRC                   398D4C03 (965561347)\n-21A5B Compressed Size       0000028E (654)\n-21A5F Uncompressed Size     00000524 (1316)\n-21A63 Filename Length       004C (76)\n-21A65 Extra Length          0000 (0)\n-21A67 Comment Length        0000 (0)\n-21A69 Disk Start            0000 (0)\n-21A6B Int File Attributes   0000 (0)\n+21D4C Compression Method    0008 (8) 'Deflated'\n+21D4E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21D52 CRC                   30CE65FD (818832893)\n+21D56 Compressed Size       00000298 (664)\n+21D5A Uncompressed Size     00000545 (1349)\n+21D5E Filename Length       004C (76)\n+21D60 Extra Length          0000 (0)\n+21D62 Comment Length        0000 (0)\n+21D64 Disk Start            0000 (0)\n+21D66 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21A6D Ext File Attributes   81A40000 (2175008768)\n+21D68 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21A71 Local Header Offset   0000B6D4 (46804)\n-21A75 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21D6C Local Header Offset   0000B7F4 (47092)\n+21D70 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21A75: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21D70: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21AC1 CENTRAL HEADER #56    02014B50 (33639248)\n-21AC5 Created Zip Spec      14 (20) '2.0'\n-21AC6 Created OS            03 (3) 'Unix'\n-21AC7 Extract Zip Spec      14 (20) '2.0'\n-21AC8 Extract OS            00 (0) 'MS-DOS'\n-21AC9 General Purpose Flag  0800 (2048)\n+21DBC CENTRAL HEADER #56    02014B50 (33639248)\n+21DC0 Created Zip Spec      14 (20) '2.0'\n+21DC1 Created OS            03 (3) 'Unix'\n+21DC2 Extract Zip Spec      14 (20) '2.0'\n+21DC3 Extract OS            00 (0) 'MS-DOS'\n+21DC4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21ACB Compression Method    0008 (8) 'Deflated'\n-21ACD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21AD1 CRC                   120048C8 (302008520)\n-21AD5 Compressed Size       00000292 (658)\n-21AD9 Uncompressed Size     0000052A (1322)\n-21ADD Filename Length       004D (77)\n-21ADF Extra Length          0000 (0)\n-21AE1 Comment Length        0000 (0)\n-21AE3 Disk Start            0000 (0)\n-21AE5 Int File Attributes   0000 (0)\n+21DC6 Compression Method    0008 (8) 'Deflated'\n+21DC8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21DCC CRC                   C145F19E (3242586526)\n+21DD0 Compressed Size       0000029B (667)\n+21DD4 Uncompressed Size     0000054B (1355)\n+21DD8 Filename Length       004D (77)\n+21DDA Extra Length          0000 (0)\n+21DDC Comment Length        0000 (0)\n+21DDE Disk Start            0000 (0)\n+21DE0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21AE7 Ext File Attributes   81A40000 (2175008768)\n+21DE2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21AEB Local Header Offset   0000B9CC (47564)\n-21AEF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21DE6 Local Header Offset   0000BAF6 (47862)\n+21DEA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21AEF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21DEA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21B3C CENTRAL HEADER #57    02014B50 (33639248)\n-21B40 Created Zip Spec      14 (20) '2.0'\n-21B41 Created OS            03 (3) 'Unix'\n-21B42 Extract Zip Spec      14 (20) '2.0'\n-21B43 Extract OS            00 (0) 'MS-DOS'\n-21B44 General Purpose Flag  0800 (2048)\n+21E37 CENTRAL HEADER #57    02014B50 (33639248)\n+21E3B Created Zip Spec      14 (20) '2.0'\n+21E3C Created OS            03 (3) 'Unix'\n+21E3D Extract Zip Spec      14 (20) '2.0'\n+21E3E Extract OS            00 (0) 'MS-DOS'\n+21E3F General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21B46 Compression Method    0008 (8) 'Deflated'\n-21B48 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21B4C CRC                   7B9FC9D5 (2074069461)\n-21B50 Compressed Size       000002C9 (713)\n-21B54 Uncompressed Size     00000675 (1653)\n-21B58 Filename Length       0040 (64)\n-21B5A Extra Length          0000 (0)\n-21B5C Comment Length        0000 (0)\n-21B5E Disk Start            0000 (0)\n-21B60 Int File Attributes   0000 (0)\n+21E41 Compression Method    0008 (8) 'Deflated'\n+21E43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21E47 CRC                   511C2CC7 (1360800967)\n+21E4B Compressed Size       000002D1 (721)\n+21E4F Uncompressed Size     000006A4 (1700)\n+21E53 Filename Length       0040 (64)\n+21E55 Extra Length          0000 (0)\n+21E57 Comment Length        0000 (0)\n+21E59 Disk Start            0000 (0)\n+21E5B Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21B62 Ext File Attributes   81A40000 (2175008768)\n+21E5D Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21B66 Local Header Offset   0000BCC9 (48329)\n-21B6A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21E61 Local Header Offset   0000BDFC (48636)\n+21E65 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21B6A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21E65: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21BAA CENTRAL HEADER #58    02014B50 (33639248)\n-21BAE Created Zip Spec      14 (20) '2.0'\n-21BAF Created OS            03 (3) 'Unix'\n-21BB0 Extract Zip Spec      14 (20) '2.0'\n-21BB1 Extract OS            00 (0) 'MS-DOS'\n-21BB2 General Purpose Flag  0800 (2048)\n+21EA5 CENTRAL HEADER #58    02014B50 (33639248)\n+21EA9 Created Zip Spec      14 (20) '2.0'\n+21EAA Created OS            03 (3) 'Unix'\n+21EAB Extract Zip Spec      14 (20) '2.0'\n+21EAC Extract OS            00 (0) 'MS-DOS'\n+21EAD General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21BB4 Compression Method    0008 (8) 'Deflated'\n-21BB6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21BBA CRC                   A2914700 (2727429888)\n-21BBE Compressed Size       00000290 (656)\n-21BC2 Uncompressed Size     00000547 (1351)\n-21BC6 Filename Length       004D (77)\n-21BC8 Extra Length          0000 (0)\n-21BCA Comment Length        0000 (0)\n-21BCC Disk Start            0000 (0)\n-21BCE Int File Attributes   0000 (0)\n+21EAF Compression Method    0008 (8) 'Deflated'\n+21EB1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21EB5 CRC                   B5EBBEE9 (3052125929)\n+21EB9 Compressed Size       00000298 (664)\n+21EBD Uncompressed Size     00000569 (1385)\n+21EC1 Filename Length       004D (77)\n+21EC3 Extra Length          0000 (0)\n+21EC5 Comment Length        0000 (0)\n+21EC7 Disk Start            0000 (0)\n+21EC9 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21BD0 Ext File Attributes   81A40000 (2175008768)\n+21ECB Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21BD4 Local Header Offset   0000BFF0 (49136)\n-21BD8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21ECF Local Header Offset   0000C12B (49451)\n+21ED3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21BD8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21ED3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21C25 CENTRAL HEADER #59    02014B50 (33639248)\n-21C29 Created Zip Spec      14 (20) '2.0'\n-21C2A Created OS            03 (3) 'Unix'\n-21C2B Extract Zip Spec      14 (20) '2.0'\n-21C2C Extract OS            00 (0) 'MS-DOS'\n-21C2D General Purpose Flag  0800 (2048)\n+21F20 CENTRAL HEADER #59    02014B50 (33639248)\n+21F24 Created Zip Spec      14 (20) '2.0'\n+21F25 Created OS            03 (3) 'Unix'\n+21F26 Extract Zip Spec      14 (20) '2.0'\n+21F27 Extract OS            00 (0) 'MS-DOS'\n+21F28 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21C2F Compression Method    0008 (8) 'Deflated'\n-21C31 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21C35 CRC                   A0D533A5 (2698326949)\n-21C39 Compressed Size       00000292 (658)\n-21C3D Uncompressed Size     0000054F (1359)\n-21C41 Filename Length       004F (79)\n-21C43 Extra Length          0000 (0)\n-21C45 Comment Length        0000 (0)\n-21C47 Disk Start            0000 (0)\n-21C49 Int File Attributes   0000 (0)\n+21F2A Compression Method    0008 (8) 'Deflated'\n+21F2C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21F30 CRC                   31557B6E (827685742)\n+21F34 Compressed Size       0000029C (668)\n+21F38 Uncompressed Size     00000571 (1393)\n+21F3C Filename Length       004F (79)\n+21F3E Extra Length          0000 (0)\n+21F40 Comment Length        0000 (0)\n+21F42 Disk Start            0000 (0)\n+21F44 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21C4B Ext File Attributes   81A40000 (2175008768)\n+21F46 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21C4F Local Header Offset   0000C2EB (49899)\n-21C53 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21F4A Local Header Offset   0000C42E (50222)\n+21F4E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21C53: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21F4E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21CA2 CENTRAL HEADER #60    02014B50 (33639248)\n-21CA6 Created Zip Spec      14 (20) '2.0'\n-21CA7 Created OS            03 (3) 'Unix'\n-21CA8 Extract Zip Spec      14 (20) '2.0'\n-21CA9 Extract OS            00 (0) 'MS-DOS'\n-21CAA General Purpose Flag  0800 (2048)\n+21F9D CENTRAL HEADER #60    02014B50 (33639248)\n+21FA1 Created Zip Spec      14 (20) '2.0'\n+21FA2 Created OS            03 (3) 'Unix'\n+21FA3 Extract Zip Spec      14 (20) '2.0'\n+21FA4 Extract OS            00 (0) 'MS-DOS'\n+21FA5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21CAC Compression Method    0008 (8) 'Deflated'\n-21CAE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21CB2 CRC                   DD6C864E (3714877006)\n-21CB6 Compressed Size       0000028D (653)\n-21CBA Uncompressed Size     00000540 (1344)\n-21CBE Filename Length       004A (74)\n-21CC0 Extra Length          0000 (0)\n-21CC2 Comment Length        0000 (0)\n-21CC4 Disk Start            0000 (0)\n-21CC6 Int File Attributes   0000 (0)\n+21FA7 Compression Method    0008 (8) 'Deflated'\n+21FA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+21FAD CRC                   9E00A28D (2650841741)\n+21FB1 Compressed Size       00000295 (661)\n+21FB5 Uncompressed Size     00000562 (1378)\n+21FB9 Filename Length       004A (74)\n+21FBB Extra Length          0000 (0)\n+21FBD Comment Length        0000 (0)\n+21FBF Disk Start            0000 (0)\n+21FC1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21CC8 Ext File Attributes   81A40000 (2175008768)\n+21FC3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21CCC Local Header Offset   0000C5EA (50666)\n-21CD0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+21FC7 Local Header Offset   0000C737 (50999)\n+21FCB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21CD0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x21FCB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21D1A CENTRAL HEADER #61    02014B50 (33639248)\n-21D1E Created Zip Spec      14 (20) '2.0'\n-21D1F Created OS            03 (3) 'Unix'\n-21D20 Extract Zip Spec      14 (20) '2.0'\n-21D21 Extract OS            00 (0) 'MS-DOS'\n-21D22 General Purpose Flag  0800 (2048)\n+22015 CENTRAL HEADER #61    02014B50 (33639248)\n+22019 Created Zip Spec      14 (20) '2.0'\n+2201A Created OS            03 (3) 'Unix'\n+2201B Extract Zip Spec      14 (20) '2.0'\n+2201C Extract OS            00 (0) 'MS-DOS'\n+2201D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21D24 Compression Method    0008 (8) 'Deflated'\n-21D26 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21D2A CRC                   F868DDB6 (4167622070)\n-21D2E Compressed Size       00000298 (664)\n-21D32 Uncompressed Size     00000565 (1381)\n-21D36 Filename Length       004C (76)\n-21D38 Extra Length          0000 (0)\n-21D3A Comment Length        0000 (0)\n-21D3C Disk Start            0000 (0)\n-21D3E Int File Attributes   0000 (0)\n+2201F Compression Method    0008 (8) 'Deflated'\n+22021 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22025 CRC                   B8F3B221 (3102978593)\n+22029 Compressed Size       000002A0 (672)\n+2202D Uncompressed Size     00000588 (1416)\n+22031 Filename Length       004C (76)\n+22033 Extra Length          0000 (0)\n+22035 Comment Length        0000 (0)\n+22037 Disk Start            0000 (0)\n+22039 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21D40 Ext File Attributes   81A40000 (2175008768)\n+2203B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21D44 Local Header Offset   0000C8DF (51423)\n-21D48 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2203F Local Header Offset   0000CA34 (51764)\n+22043 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21D48: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22043: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21D94 CENTRAL HEADER #62    02014B50 (33639248)\n-21D98 Created Zip Spec      14 (20) '2.0'\n-21D99 Created OS            03 (3) 'Unix'\n-21D9A Extract Zip Spec      14 (20) '2.0'\n-21D9B Extract OS            00 (0) 'MS-DOS'\n-21D9C General Purpose Flag  0800 (2048)\n+2208F CENTRAL HEADER #62    02014B50 (33639248)\n+22093 Created Zip Spec      14 (20) '2.0'\n+22094 Created OS            03 (3) 'Unix'\n+22095 Extract Zip Spec      14 (20) '2.0'\n+22096 Extract OS            00 (0) 'MS-DOS'\n+22097 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21D9E Compression Method    0008 (8) 'Deflated'\n-21DA0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21DA4 CRC                   97496C8E (2538171534)\n-21DA8 Compressed Size       00000370 (880)\n-21DAC Uncompressed Size     000008A6 (2214)\n-21DB0 Filename Length       0048 (72)\n-21DB2 Extra Length          0000 (0)\n-21DB4 Comment Length        0000 (0)\n-21DB6 Disk Start            0000 (0)\n-21DB8 Int File Attributes   0000 (0)\n+22099 Compression Method    0008 (8) 'Deflated'\n+2209B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2209F CRC                   A03840DB (2688041179)\n+220A3 Compressed Size       00000379 (889)\n+220A7 Uncompressed Size     000008E6 (2278)\n+220AB Filename Length       0048 (72)\n+220AD Extra Length          0000 (0)\n+220AF Comment Length        0000 (0)\n+220B1 Disk Start            0000 (0)\n+220B3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21DBA Ext File Attributes   81A40000 (2175008768)\n+220B5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21DBE Local Header Offset   0000CBE1 (52193)\n-21DC2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+220B9 Local Header Offset   0000CD3E (52542)\n+220BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21DC2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x220BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21E0A CENTRAL HEADER #63    02014B50 (33639248)\n-21E0E Created Zip Spec      14 (20) '2.0'\n-21E0F Created OS            03 (3) 'Unix'\n-21E10 Extract Zip Spec      14 (20) '2.0'\n-21E11 Extract OS            00 (0) 'MS-DOS'\n-21E12 General Purpose Flag  0800 (2048)\n+22105 CENTRAL HEADER #63    02014B50 (33639248)\n+22109 Created Zip Spec      14 (20) '2.0'\n+2210A Created OS            03 (3) 'Unix'\n+2210B Extract Zip Spec      14 (20) '2.0'\n+2210C Extract OS            00 (0) 'MS-DOS'\n+2210D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21E14 Compression Method    0008 (8) 'Deflated'\n-21E16 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21E1A CRC                   C309C134 (3272196404)\n-21E1E Compressed Size       000003FA (1018)\n-21E22 Uncompressed Size     00000E22 (3618)\n-21E26 Filename Length       0049 (73)\n-21E28 Extra Length          0000 (0)\n-21E2A Comment Length        0000 (0)\n-21E2C Disk Start            0000 (0)\n-21E2E Int File Attributes   0000 (0)\n+2210F Compression Method    0008 (8) 'Deflated'\n+22111 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22115 CRC                   80296188 (2150195592)\n+22119 Compressed Size       00000404 (1028)\n+2211D Uncompressed Size     00000E77 (3703)\n+22121 Filename Length       0049 (73)\n+22123 Extra Length          0000 (0)\n+22125 Comment Length        0000 (0)\n+22127 Disk Start            0000 (0)\n+22129 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21E30 Ext File Attributes   81A40000 (2175008768)\n+2212B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21E34 Local Header Offset   0000CFB7 (53175)\n-21E38 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2212F Local Header Offset   0000D11D (53533)\n+22133 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21E38: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22133: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21E81 CENTRAL HEADER #64    02014B50 (33639248)\n-21E85 Created Zip Spec      14 (20) '2.0'\n-21E86 Created OS            03 (3) 'Unix'\n-21E87 Extract Zip Spec      14 (20) '2.0'\n-21E88 Extract OS            00 (0) 'MS-DOS'\n-21E89 General Purpose Flag  0800 (2048)\n+2217C CENTRAL HEADER #64    02014B50 (33639248)\n+22180 Created Zip Spec      14 (20) '2.0'\n+22181 Created OS            03 (3) 'Unix'\n+22182 Extract Zip Spec      14 (20) '2.0'\n+22183 Extract OS            00 (0) 'MS-DOS'\n+22184 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21E8B Compression Method    0008 (8) 'Deflated'\n-21E8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21E91 CRC                   BD334F2B (3174256427)\n-21E95 Compressed Size       00000B02 (2818)\n-21E99 Uncompressed Size     00002C35 (11317)\n-21E9D Filename Length       0054 (84)\n-21E9F Extra Length          0000 (0)\n-21EA1 Comment Length        0000 (0)\n-21EA3 Disk Start            0000 (0)\n-21EA5 Int File Attributes   0000 (0)\n+22186 Compression Method    0008 (8) 'Deflated'\n+22188 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2218C CRC                   179D40B4 (396181684)\n+22190 Compressed Size       00000B12 (2834)\n+22194 Uncompressed Size     00002D41 (11585)\n+22198 Filename Length       0054 (84)\n+2219A Extra Length          0000 (0)\n+2219C Comment Length        0000 (0)\n+2219E Disk Start            0000 (0)\n+221A0 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21EA7 Ext File Attributes   81A40000 (2175008768)\n+221A2 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21EAB Local Header Offset   0000D418 (54296)\n-21EAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+221A6 Local Header Offset   0000D588 (54664)\n+221AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21EAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x221AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21F03 CENTRAL HEADER #65    02014B50 (33639248)\n-21F07 Created Zip Spec      14 (20) '2.0'\n-21F08 Created OS            03 (3) 'Unix'\n-21F09 Extract Zip Spec      14 (20) '2.0'\n-21F0A Extract OS            00 (0) 'MS-DOS'\n-21F0B General Purpose Flag  0800 (2048)\n+221FE CENTRAL HEADER #65    02014B50 (33639248)\n+22202 Created Zip Spec      14 (20) '2.0'\n+22203 Created OS            03 (3) 'Unix'\n+22204 Extract Zip Spec      14 (20) '2.0'\n+22205 Extract OS            00 (0) 'MS-DOS'\n+22206 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21F0D Compression Method    0008 (8) 'Deflated'\n-21F0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21F13 CRC                   8764F382 (2271540098)\n-21F17 Compressed Size       000004AD (1197)\n-21F1B Uncompressed Size     00000E76 (3702)\n-21F1F Filename Length       0049 (73)\n-21F21 Extra Length          0000 (0)\n-21F23 Comment Length        0000 (0)\n-21F25 Disk Start            0000 (0)\n-21F27 Int File Attributes   0000 (0)\n+22208 Compression Method    0008 (8) 'Deflated'\n+2220A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2220E CRC                   D8B03CE3 (3635428579)\n+22212 Compressed Size       000004B8 (1208)\n+22216 Uncompressed Size     00000ECC (3788)\n+2221A Filename Length       0049 (73)\n+2221C Extra Length          0000 (0)\n+2221E Comment Length        0000 (0)\n+22220 Disk Start            0000 (0)\n+22222 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21F29 Ext File Attributes   81A40000 (2175008768)\n+22224 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21F2D Local Header Offset   0000DF8C (57228)\n-21F31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22228 Local Header Offset   0000E10C (57612)\n+2222C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21F31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2222C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21F7A CENTRAL HEADER #66    02014B50 (33639248)\n-21F7E Created Zip Spec      14 (20) '2.0'\n-21F7F Created OS            03 (3) 'Unix'\n-21F80 Extract Zip Spec      14 (20) '2.0'\n-21F81 Extract OS            00 (0) 'MS-DOS'\n-21F82 General Purpose Flag  0800 (2048)\n+22275 CENTRAL HEADER #66    02014B50 (33639248)\n+22279 Created Zip Spec      14 (20) '2.0'\n+2227A Created OS            03 (3) 'Unix'\n+2227B Extract Zip Spec      14 (20) '2.0'\n+2227C Extract OS            00 (0) 'MS-DOS'\n+2227D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21F84 Compression Method    0008 (8) 'Deflated'\n-21F86 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-21F8A CRC                   E42AC0C2 (3828007106)\n-21F8E Compressed Size       000002E7 (743)\n-21F92 Uncompressed Size     000005D7 (1495)\n-21F96 Filename Length       0048 (72)\n-21F98 Extra Length          0000 (0)\n-21F9A Comment Length        0000 (0)\n-21F9C Disk Start            0000 (0)\n-21F9E Int File Attributes   0000 (0)\n+2227F Compression Method    0008 (8) 'Deflated'\n+22281 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22285 CRC                   EEBAB417 (4005213207)\n+22289 Compressed Size       000002EF (751)\n+2228D Uncompressed Size     000005FF (1535)\n+22291 Filename Length       0048 (72)\n+22293 Extra Length          0000 (0)\n+22295 Comment Length        0000 (0)\n+22297 Disk Start            0000 (0)\n+22299 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-21FA0 Ext File Attributes   81A40000 (2175008768)\n+2229B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-21FA4 Local Header Offset   0000E4A0 (58528)\n-21FA8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2229F Local Header Offset   0000E62B (58923)\n+222A3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x21FA8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x222A3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-21FF0 CENTRAL HEADER #67    02014B50 (33639248)\n-21FF4 Created Zip Spec      14 (20) '2.0'\n-21FF5 Created OS            03 (3) 'Unix'\n-21FF6 Extract Zip Spec      14 (20) '2.0'\n-21FF7 Extract OS            00 (0) 'MS-DOS'\n-21FF8 General Purpose Flag  0800 (2048)\n+222EB CENTRAL HEADER #67    02014B50 (33639248)\n+222EF Created Zip Spec      14 (20) '2.0'\n+222F0 Created OS            03 (3) 'Unix'\n+222F1 Extract Zip Spec      14 (20) '2.0'\n+222F2 Extract OS            00 (0) 'MS-DOS'\n+222F3 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-21FFA Compression Method    0008 (8) 'Deflated'\n-21FFC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22000 CRC                   33C91E00 (868818432)\n-22004 Compressed Size       000003D6 (982)\n-22008 Uncompressed Size     00000AEA (2794)\n-2200C Filename Length       0059 (89)\n-2200E Extra Length          0000 (0)\n-22010 Comment Length        0000 (0)\n-22012 Disk Start            0000 (0)\n-22014 Int File Attributes   0000 (0)\n+222F5 Compression Method    0008 (8) 'Deflated'\n+222F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+222FB CRC                   75D2ADE7 (1976741351)\n+222FF Compressed Size       000003DE (990)\n+22303 Uncompressed Size     00000B2B (2859)\n+22307 Filename Length       0059 (89)\n+22309 Extra Length          0000 (0)\n+2230B Comment Length        0000 (0)\n+2230D Disk Start            0000 (0)\n+2230F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22016 Ext File Attributes   81A40000 (2175008768)\n+22311 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2201A Local Header Offset   0000E7ED (59373)\n-2201E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22315 Local Header Offset   0000E980 (59776)\n+22319 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2201E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22319: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22077 CENTRAL HEADER #68    02014B50 (33639248)\n-2207B Created Zip Spec      14 (20) '2.0'\n-2207C Created OS            03 (3) 'Unix'\n-2207D Extract Zip Spec      14 (20) '2.0'\n-2207E Extract OS            00 (0) 'MS-DOS'\n-2207F General Purpose Flag  0800 (2048)\n+22372 CENTRAL HEADER #68    02014B50 (33639248)\n+22376 Created Zip Spec      14 (20) '2.0'\n+22377 Created OS            03 (3) 'Unix'\n+22378 Extract Zip Spec      14 (20) '2.0'\n+22379 Extract OS            00 (0) 'MS-DOS'\n+2237A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22081 Compression Method    0008 (8) 'Deflated'\n-22083 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22087 CRC                   055EEF97 (90107799)\n-2208B Compressed Size       0000060B (1547)\n-2208F Uncompressed Size     000012A3 (4771)\n-22093 Filename Length       003C (60)\n-22095 Extra Length          0000 (0)\n-22097 Comment Length        0000 (0)\n-22099 Disk Start            0000 (0)\n-2209B Int File Attributes   0000 (0)\n+2237C Compression Method    0008 (8) 'Deflated'\n+2237E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22382 CRC                   755A196E (1968839022)\n+22386 Compressed Size       00000616 (1558)\n+2238A Uncompressed Size     00001309 (4873)\n+2238E Filename Length       003C (60)\n+22390 Extra Length          0000 (0)\n+22392 Comment Length        0000 (0)\n+22394 Disk Start            0000 (0)\n+22396 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2209D Ext File Attributes   81A40000 (2175008768)\n+22398 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-220A1 Local Header Offset   0000EC3A (60474)\n-220A5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2239C Local Header Offset   0000EDD5 (60885)\n+223A0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x220A5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x223A0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-220E1 CENTRAL HEADER #69    02014B50 (33639248)\n-220E5 Created Zip Spec      14 (20) '2.0'\n-220E6 Created OS            03 (3) 'Unix'\n-220E7 Extract Zip Spec      14 (20) '2.0'\n-220E8 Extract OS            00 (0) 'MS-DOS'\n-220E9 General Purpose Flag  0800 (2048)\n+223DC CENTRAL HEADER #69    02014B50 (33639248)\n+223E0 Created Zip Spec      14 (20) '2.0'\n+223E1 Created OS            03 (3) 'Unix'\n+223E2 Extract Zip Spec      14 (20) '2.0'\n+223E3 Extract OS            00 (0) 'MS-DOS'\n+223E4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-220EB Compression Method    0008 (8) 'Deflated'\n-220ED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-220F1 CRC                   02F66D1C (49704220)\n-220F5 Compressed Size       000003CC (972)\n-220F9 Uncompressed Size     000008F8 (2296)\n-220FD Filename Length       004E (78)\n-220FF Extra Length          0000 (0)\n-22101 Comment Length        0000 (0)\n-22103 Disk Start            0000 (0)\n-22105 Int File Attributes   0000 (0)\n+223E6 Compression Method    0008 (8) 'Deflated'\n+223E8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+223EC CRC                   59E1F72D (1507981101)\n+223F0 Compressed Size       000003D7 (983)\n+223F4 Uncompressed Size     0000092F (2351)\n+223F8 Filename Length       004E (78)\n+223FA Extra Length          0000 (0)\n+223FC Comment Length        0000 (0)\n+223FE Disk Start            0000 (0)\n+22400 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22107 Ext File Attributes   81A40000 (2175008768)\n+22402 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2210B Local Header Offset   0000F29F (62111)\n-2210F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22406 Local Header Offset   0000F445 (62533)\n+2240A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2210F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2240A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2215D CENTRAL HEADER #70    02014B50 (33639248)\n-22161 Created Zip Spec      14 (20) '2.0'\n-22162 Created OS            03 (3) 'Unix'\n-22163 Extract Zip Spec      14 (20) '2.0'\n-22164 Extract OS            00 (0) 'MS-DOS'\n-22165 General Purpose Flag  0800 (2048)\n+22458 CENTRAL HEADER #70    02014B50 (33639248)\n+2245C Created Zip Spec      14 (20) '2.0'\n+2245D Created OS            03 (3) 'Unix'\n+2245E Extract Zip Spec      14 (20) '2.0'\n+2245F Extract OS            00 (0) 'MS-DOS'\n+22460 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22167 Compression Method    0008 (8) 'Deflated'\n-22169 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2216D CRC                   0266C937 (40290615)\n-22171 Compressed Size       00000401 (1025)\n-22175 Uncompressed Size     00000AC3 (2755)\n-22179 Filename Length       0054 (84)\n-2217B Extra Length          0000 (0)\n-2217D Comment Length        0000 (0)\n-2217F Disk Start            0000 (0)\n-22181 Int File Attributes   0000 (0)\n+22462 Compression Method    0008 (8) 'Deflated'\n+22464 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22468 CRC                   FB40FD46 (4215340358)\n+2246C Compressed Size       0000040C (1036)\n+22470 Uncompressed Size     00000B06 (2822)\n+22474 Filename Length       0054 (84)\n+22476 Extra Length          0000 (0)\n+22478 Comment Length        0000 (0)\n+2247A Disk Start            0000 (0)\n+2247C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22183 Ext File Attributes   81A40000 (2175008768)\n+2247E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22187 Local Header Offset   0000F6D7 (63191)\n-2218B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22482 Local Header Offset   0000F888 (63624)\n+22486 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2218B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22486: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-221DF CENTRAL HEADER #71    02014B50 (33639248)\n-221E3 Created Zip Spec      14 (20) '2.0'\n-221E4 Created OS            03 (3) 'Unix'\n-221E5 Extract Zip Spec      14 (20) '2.0'\n-221E6 Extract OS            00 (0) 'MS-DOS'\n-221E7 General Purpose Flag  0800 (2048)\n+224DA CENTRAL HEADER #71    02014B50 (33639248)\n+224DE Created Zip Spec      14 (20) '2.0'\n+224DF Created OS            03 (3) 'Unix'\n+224E0 Extract Zip Spec      14 (20) '2.0'\n+224E1 Extract OS            00 (0) 'MS-DOS'\n+224E2 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-221E9 Compression Method    0008 (8) 'Deflated'\n-221EB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-221EF CRC                   BFC681E5 (3217457637)\n-221F3 Compressed Size       00000541 (1345)\n-221F7 Uncompressed Size     00000FB5 (4021)\n-221FB Filename Length       0050 (80)\n-221FD Extra Length          0000 (0)\n-221FF Comment Length        0000 (0)\n-22201 Disk Start            0000 (0)\n-22203 Int File Attributes   0000 (0)\n+224E4 Compression Method    0008 (8) 'Deflated'\n+224E6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+224EA CRC                   53F9F17D (1408889213)\n+224EE Compressed Size       0000054E (1358)\n+224F2 Uncompressed Size     0000100D (4109)\n+224F6 Filename Length       0050 (80)\n+224F8 Extra Length          0000 (0)\n+224FA Comment Length        0000 (0)\n+224FC Disk Start            0000 (0)\n+224FE Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22205 Ext File Attributes   81A40000 (2175008768)\n+22500 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22209 Local Header Offset   0000FB4A (64330)\n-2220D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22504 Local Header Offset   0000FD06 (64774)\n+22508 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2220D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22508: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2225D CENTRAL HEADER #72    02014B50 (33639248)\n-22261 Created Zip Spec      14 (20) '2.0'\n-22262 Created OS            03 (3) 'Unix'\n-22263 Extract Zip Spec      14 (20) '2.0'\n-22264 Extract OS            00 (0) 'MS-DOS'\n-22265 General Purpose Flag  0800 (2048)\n+22558 CENTRAL HEADER #72    02014B50 (33639248)\n+2255C Created Zip Spec      14 (20) '2.0'\n+2255D Created OS            03 (3) 'Unix'\n+2255E Extract Zip Spec      14 (20) '2.0'\n+2255F Extract OS            00 (0) 'MS-DOS'\n+22560 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22267 Compression Method    0008 (8) 'Deflated'\n-22269 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2226D CRC                   3C5C28F1 (1012672753)\n-22271 Compressed Size       00000C22 (3106)\n-22275 Uncompressed Size     0000348D (13453)\n-22279 Filename Length       004B (75)\n-2227B Extra Length          0000 (0)\n-2227D Comment Length        0000 (0)\n-2227F Disk Start            0000 (0)\n-22281 Int File Attributes   0000 (0)\n+22562 Compression Method    0008 (8) 'Deflated'\n+22564 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22568 CRC                   D85C97E6 (3629946854)\n+2256C Compressed Size       00000C35 (3125)\n+22570 Uncompressed Size     000035CB (13771)\n+22574 Filename Length       004B (75)\n+22576 Extra Length          0000 (0)\n+22578 Comment Length        0000 (0)\n+2257A Disk Start            0000 (0)\n+2257C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22283 Ext File Attributes   81A40000 (2175008768)\n+2257E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22287 Local Header Offset   000100F9 (65785)\n-2228B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22582 Local Header Offset   000102C2 (66242)\n+22586 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2228B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22586: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-222D6 CENTRAL HEADER #73    02014B50 (33639248)\n-222DA Created Zip Spec      14 (20) '2.0'\n-222DB Created OS            03 (3) 'Unix'\n-222DC Extract Zip Spec      14 (20) '2.0'\n-222DD Extract OS            00 (0) 'MS-DOS'\n-222DE General Purpose Flag  0800 (2048)\n+225D1 CENTRAL HEADER #73    02014B50 (33639248)\n+225D5 Created Zip Spec      14 (20) '2.0'\n+225D6 Created OS            03 (3) 'Unix'\n+225D7 Extract Zip Spec      14 (20) '2.0'\n+225D8 Extract OS            00 (0) 'MS-DOS'\n+225D9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-222E0 Compression Method    0008 (8) 'Deflated'\n-222E2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-222E6 CRC                   81760C22 (2171997218)\n-222EA Compressed Size       000003DE (990)\n-222EE Uncompressed Size     0000086F (2159)\n-222F2 Filename Length       0053 (83)\n-222F4 Extra Length          0000 (0)\n-222F6 Comment Length        0000 (0)\n-222F8 Disk Start            0000 (0)\n-222FA Int File Attributes   0000 (0)\n+225DB Compression Method    0008 (8) 'Deflated'\n+225DD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+225E1 CRC                   790FD089 (2031079561)\n+225E5 Compressed Size       000003E7 (999)\n+225E9 Uncompressed Size     000008A2 (2210)\n+225ED Filename Length       0053 (83)\n+225EF Extra Length          0000 (0)\n+225F1 Comment Length        0000 (0)\n+225F3 Disk Start            0000 (0)\n+225F5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-222FC Ext File Attributes   81A40000 (2175008768)\n+225F7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22300 Local Header Offset   00010D84 (68996)\n-22304 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+225FB Local Header Offset   00010F60 (69472)\n+225FF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22304: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x225FF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22357 CENTRAL HEADER #74    02014B50 (33639248)\n-2235B Created Zip Spec      14 (20) '2.0'\n-2235C Created OS            03 (3) 'Unix'\n-2235D Extract Zip Spec      14 (20) '2.0'\n-2235E Extract OS            00 (0) 'MS-DOS'\n-2235F General Purpose Flag  0800 (2048)\n+22652 CENTRAL HEADER #74    02014B50 (33639248)\n+22656 Created Zip Spec      14 (20) '2.0'\n+22657 Created OS            03 (3) 'Unix'\n+22658 Extract Zip Spec      14 (20) '2.0'\n+22659 Extract OS            00 (0) 'MS-DOS'\n+2265A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22361 Compression Method    0008 (8) 'Deflated'\n-22363 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22367 CRC                   7D70DC8D (2104548493)\n-2236B Compressed Size       00000509 (1289)\n-2236F Uncompressed Size     00000E7E (3710)\n-22373 Filename Length       0050 (80)\n-22375 Extra Length          0000 (0)\n-22377 Comment Length        0000 (0)\n-22379 Disk Start            0000 (0)\n-2237B Int File Attributes   0000 (0)\n+2265C Compression Method    0008 (8) 'Deflated'\n+2265E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22662 CRC                   85FEC00A (2248065034)\n+22666 Compressed Size       00000515 (1301)\n+2266A Uncompressed Size     00000ED7 (3799)\n+2266E Filename Length       0050 (80)\n+22670 Extra Length          0000 (0)\n+22672 Comment Length        0000 (0)\n+22674 Disk Start            0000 (0)\n+22676 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2237D Ext File Attributes   81A40000 (2175008768)\n+22678 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22381 Local Header Offset   000111D3 (70099)\n-22385 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2267C Local Header Offset   000113B8 (70584)\n+22680 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22385: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22680: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-223D5 CENTRAL HEADER #75    02014B50 (33639248)\n-223D9 Created Zip Spec      14 (20) '2.0'\n-223DA Created OS            03 (3) 'Unix'\n-223DB Extract Zip Spec      14 (20) '2.0'\n-223DC Extract OS            00 (0) 'MS-DOS'\n-223DD General Purpose Flag  0800 (2048)\n+226D0 CENTRAL HEADER #75    02014B50 (33639248)\n+226D4 Created Zip Spec      14 (20) '2.0'\n+226D5 Created OS            03 (3) 'Unix'\n+226D6 Extract Zip Spec      14 (20) '2.0'\n+226D7 Extract OS            00 (0) 'MS-DOS'\n+226D8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-223DF Compression Method    0008 (8) 'Deflated'\n-223E1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-223E5 CRC                   BE3056BF (3190838975)\n-223E9 Compressed Size       0000035B (859)\n-223ED Uncompressed Size     00000848 (2120)\n-223F1 Filename Length       0048 (72)\n-223F3 Extra Length          0000 (0)\n-223F5 Comment Length        0000 (0)\n-223F7 Disk Start            0000 (0)\n-223F9 Int File Attributes   0000 (0)\n+226DA Compression Method    0008 (8) 'Deflated'\n+226DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+226E0 CRC                   ACB394E1 (2897450209)\n+226E4 Compressed Size       00000367 (871)\n+226E8 Uncompressed Size     0000087F (2175)\n+226EC Filename Length       0048 (72)\n+226EE Extra Length          0000 (0)\n+226F0 Comment Length        0000 (0)\n+226F2 Disk Start            0000 (0)\n+226F4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-223FB Ext File Attributes   81A40000 (2175008768)\n+226F6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-223FF Local Header Offset   0001174A (71498)\n-22403 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+226FA Local Header Offset   0001193B (71995)\n+226FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22403: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x226FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2244B CENTRAL HEADER #76    02014B50 (33639248)\n-2244F Created Zip Spec      14 (20) '2.0'\n-22450 Created OS            03 (3) 'Unix'\n-22451 Extract Zip Spec      14 (20) '2.0'\n-22452 Extract OS            00 (0) 'MS-DOS'\n-22453 General Purpose Flag  0800 (2048)\n+22746 CENTRAL HEADER #76    02014B50 (33639248)\n+2274A Created Zip Spec      14 (20) '2.0'\n+2274B Created OS            03 (3) 'Unix'\n+2274C Extract Zip Spec      14 (20) '2.0'\n+2274D Extract OS            00 (0) 'MS-DOS'\n+2274E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22455 Compression Method    0008 (8) 'Deflated'\n-22457 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2245B CRC                   E322696B (3810683243)\n-2245F Compressed Size       00000B90 (2960)\n-22463 Uncompressed Size     00002E62 (11874)\n-22467 Filename Length       0054 (84)\n-22469 Extra Length          0000 (0)\n-2246B Comment Length        0000 (0)\n-2246D Disk Start            0000 (0)\n-2246F Int File Attributes   0000 (0)\n+22750 Compression Method    0008 (8) 'Deflated'\n+22752 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22756 CRC                   AF38F813 (2939746323)\n+2275A Compressed Size       00000BA6 (2982)\n+2275E Uncompressed Size     00002F8F (12175)\n+22762 Filename Length       0054 (84)\n+22764 Extra Length          0000 (0)\n+22766 Comment Length        0000 (0)\n+22768 Disk Start            0000 (0)\n+2276A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22471 Ext File Attributes   81A40000 (2175008768)\n+2276C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22475 Local Header Offset   00011B0B (72459)\n-22479 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22770 Local Header Offset   00011D08 (72968)\n+22774 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22479: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22774: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-224CD CENTRAL HEADER #77    02014B50 (33639248)\n-224D1 Created Zip Spec      14 (20) '2.0'\n-224D2 Created OS            03 (3) 'Unix'\n-224D3 Extract Zip Spec      14 (20) '2.0'\n-224D4 Extract OS            00 (0) 'MS-DOS'\n-224D5 General Purpose Flag  0800 (2048)\n+227C8 CENTRAL HEADER #77    02014B50 (33639248)\n+227CC Created Zip Spec      14 (20) '2.0'\n+227CD Created OS            03 (3) 'Unix'\n+227CE Extract Zip Spec      14 (20) '2.0'\n+227CF Extract OS            00 (0) 'MS-DOS'\n+227D0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-224D7 Compression Method    0008 (8) 'Deflated'\n-224D9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-224DD CRC                   6CE6F13F (1827074367)\n-224E1 Compressed Size       000007BE (1982)\n-224E5 Uncompressed Size     00001D8A (7562)\n-224E9 Filename Length       004E (78)\n-224EB Extra Length          0000 (0)\n-224ED Comment Length        0000 (0)\n-224EF Disk Start            0000 (0)\n-224F1 Int File Attributes   0000 (0)\n+227D2 Compression Method    0008 (8) 'Deflated'\n+227D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+227D8 CRC                   6659263F (1717118527)\n+227DC Compressed Size       000007CA (1994)\n+227E0 Uncompressed Size     00001E19 (7705)\n+227E4 Filename Length       004E (78)\n+227E6 Extra Length          0000 (0)\n+227E8 Comment Length        0000 (0)\n+227EA Disk Start            0000 (0)\n+227EC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-224F3 Ext File Attributes   81A40000 (2175008768)\n+227EE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-224F7 Local Header Offset   0001270D (75533)\n-224FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+227F2 Local Header Offset   00012920 (76064)\n+227F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x224FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x227F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22549 CENTRAL HEADER #78    02014B50 (33639248)\n-2254D Created Zip Spec      14 (20) '2.0'\n-2254E Created OS            03 (3) 'Unix'\n-2254F Extract Zip Spec      14 (20) '2.0'\n-22550 Extract OS            00 (0) 'MS-DOS'\n-22551 General Purpose Flag  0800 (2048)\n+22844 CENTRAL HEADER #78    02014B50 (33639248)\n+22848 Created Zip Spec      14 (20) '2.0'\n+22849 Created OS            03 (3) 'Unix'\n+2284A Extract Zip Spec      14 (20) '2.0'\n+2284B Extract OS            00 (0) 'MS-DOS'\n+2284C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22553 Compression Method    0008 (8) 'Deflated'\n-22555 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22559 CRC                   C9115A1F (3373357599)\n-2255D Compressed Size       0000048B (1163)\n-22561 Uncompressed Size     00000C95 (3221)\n-22565 Filename Length       0051 (81)\n-22567 Extra Length          0000 (0)\n-22569 Comment Length        0000 (0)\n-2256B Disk Start            0000 (0)\n-2256D Int File Attributes   0000 (0)\n+2284E Compression Method    0008 (8) 'Deflated'\n+22850 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22854 CRC                   1E182794 (504899476)\n+22858 Compressed Size       00000495 (1173)\n+2285C Uncompressed Size     00000CDF (3295)\n+22860 Filename Length       0051 (81)\n+22862 Extra Length          0000 (0)\n+22864 Comment Length        0000 (0)\n+22866 Disk Start            0000 (0)\n+22868 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2256F Ext File Attributes   81A40000 (2175008768)\n+2286A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22573 Local Header Offset   00012F37 (77623)\n-22577 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2286E Local Header Offset   00013156 (78166)\n+22872 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22577: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22872: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-225C8 CENTRAL HEADER #79    02014B50 (33639248)\n-225CC Created Zip Spec      14 (20) '2.0'\n-225CD Created OS            03 (3) 'Unix'\n-225CE Extract Zip Spec      14 (20) '2.0'\n-225CF Extract OS            00 (0) 'MS-DOS'\n-225D0 General Purpose Flag  0800 (2048)\n+228C3 CENTRAL HEADER #79    02014B50 (33639248)\n+228C7 Created Zip Spec      14 (20) '2.0'\n+228C8 Created OS            03 (3) 'Unix'\n+228C9 Extract Zip Spec      14 (20) '2.0'\n+228CA Extract OS            00 (0) 'MS-DOS'\n+228CB General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-225D2 Compression Method    0008 (8) 'Deflated'\n-225D4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-225D8 CRC                   2197D7D3 (563599315)\n-225DC Compressed Size       00000210 (528)\n-225E0 Uncompressed Size     00000398 (920)\n-225E4 Filename Length       0047 (71)\n-225E6 Extra Length          0000 (0)\n-225E8 Comment Length        0000 (0)\n-225EA Disk Start            0000 (0)\n-225EC Int File Attributes   0000 (0)\n+228CD Compression Method    0008 (8) 'Deflated'\n+228CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+228D3 CRC                   6D847AE7 (1837398759)\n+228D7 Compressed Size       00000215 (533)\n+228DB Uncompressed Size     000003AC (940)\n+228DF Filename Length       0047 (71)\n+228E1 Extra Length          0000 (0)\n+228E3 Comment Length        0000 (0)\n+228E5 Disk Start            0000 (0)\n+228E7 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-225EE Ext File Attributes   81A40000 (2175008768)\n+228E9 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-225F2 Local Header Offset   00013431 (78897)\n-225F6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+228ED Local Header Offset   0001365A (79450)\n+228F1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x225F6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x228F1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2263D CENTRAL HEADER #80    02014B50 (33639248)\n-22641 Created Zip Spec      14 (20) '2.0'\n-22642 Created OS            03 (3) 'Unix'\n-22643 Extract Zip Spec      14 (20) '2.0'\n-22644 Extract OS            00 (0) 'MS-DOS'\n-22645 General Purpose Flag  0800 (2048)\n+22938 CENTRAL HEADER #80    02014B50 (33639248)\n+2293C Created Zip Spec      14 (20) '2.0'\n+2293D Created OS            03 (3) 'Unix'\n+2293E Extract Zip Spec      14 (20) '2.0'\n+2293F Extract OS            00 (0) 'MS-DOS'\n+22940 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22647 Compression Method    0008 (8) 'Deflated'\n-22649 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2264D CRC                   D03865FF (3493357055)\n-22651 Compressed Size       0000025B (603)\n-22655 Uncompressed Size     00000454 (1108)\n-22659 Filename Length       004A (74)\n-2265B Extra Length          0000 (0)\n-2265D Comment Length        0000 (0)\n-2265F Disk Start            0000 (0)\n-22661 Int File Attributes   0000 (0)\n+22942 Compression Method    0008 (8) 'Deflated'\n+22944 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22948 CRC                   21E16F63 (568422243)\n+2294C Compressed Size       00000264 (612)\n+22950 Uncompressed Size     0000046D (1133)\n+22954 Filename Length       004A (74)\n+22956 Extra Length          0000 (0)\n+22958 Comment Length        0000 (0)\n+2295A Disk Start            0000 (0)\n+2295C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22663 Ext File Attributes   81A40000 (2175008768)\n+2295E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22667 Local Header Offset   000136A6 (79526)\n-2266B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22962 Local Header Offset   000138D4 (80084)\n+22966 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2266B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22966: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-226B5 CENTRAL HEADER #81    02014B50 (33639248)\n-226B9 Created Zip Spec      14 (20) '2.0'\n-226BA Created OS            03 (3) 'Unix'\n-226BB Extract Zip Spec      14 (20) '2.0'\n-226BC Extract OS            00 (0) 'MS-DOS'\n-226BD General Purpose Flag  0800 (2048)\n+229B0 CENTRAL HEADER #81    02014B50 (33639248)\n+229B4 Created Zip Spec      14 (20) '2.0'\n+229B5 Created OS            03 (3) 'Unix'\n+229B6 Extract Zip Spec      14 (20) '2.0'\n+229B7 Extract OS            00 (0) 'MS-DOS'\n+229B8 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-226BF Compression Method    0008 (8) 'Deflated'\n-226C1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-226C5 CRC                   D6056B09 (3590679305)\n-226C9 Compressed Size       00000A5D (2653)\n-226CD Uncompressed Size     000039C3 (14787)\n-226D1 Filename Length       0040 (64)\n-226D3 Extra Length          0000 (0)\n-226D5 Comment Length        0000 (0)\n-226D7 Disk Start            0000 (0)\n-226D9 Int File Attributes   0000 (0)\n+229BA Compression Method    0008 (8) 'Deflated'\n+229BC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+229C0 CRC                   0709B18C (118075788)\n+229C4 Compressed Size       00000A71 (2673)\n+229C8 Uncompressed Size     00003B49 (15177)\n+229CC Filename Length       0040 (64)\n+229CE Extra Length          0000 (0)\n+229D0 Comment Length        0000 (0)\n+229D2 Disk Start            0000 (0)\n+229D4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-226DB Ext File Attributes   81A40000 (2175008768)\n+229D6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-226DF Local Header Offset   00013969 (80233)\n-226E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+229DA Local Header Offset   00013BA0 (80800)\n+229DE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x226E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x229DE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22723 CENTRAL HEADER #82    02014B50 (33639248)\n-22727 Created Zip Spec      14 (20) '2.0'\n-22728 Created OS            03 (3) 'Unix'\n-22729 Extract Zip Spec      14 (20) '2.0'\n-2272A Extract OS            00 (0) 'MS-DOS'\n-2272B General Purpose Flag  0800 (2048)\n+22A1E CENTRAL HEADER #82    02014B50 (33639248)\n+22A22 Created Zip Spec      14 (20) '2.0'\n+22A23 Created OS            03 (3) 'Unix'\n+22A24 Extract Zip Spec      14 (20) '2.0'\n+22A25 Extract OS            00 (0) 'MS-DOS'\n+22A26 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2272D Compression Method    0008 (8) 'Deflated'\n-2272F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22733 CRC                   8A132C8F (2316512399)\n-22737 Compressed Size       000003EF (1007)\n-2273B Uncompressed Size     00000AB9 (2745)\n-2273F Filename Length       0044 (68)\n-22741 Extra Length          0000 (0)\n-22743 Comment Length        0000 (0)\n-22745 Disk Start            0000 (0)\n-22747 Int File Attributes   0000 (0)\n+22A28 Compression Method    0008 (8) 'Deflated'\n+22A2A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22A2E CRC                   E2477A52 (3796335186)\n+22A32 Compressed Size       000003FA (1018)\n+22A36 Uncompressed Size     00000B00 (2816)\n+22A3A Filename Length       0044 (68)\n+22A3C Extra Length          0000 (0)\n+22A3E Comment Length        0000 (0)\n+22A40 Disk Start            0000 (0)\n+22A42 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22749 Ext File Attributes   81A40000 (2175008768)\n+22A44 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2274D Local Header Offset   00014424 (82980)\n-22751 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22A48 Local Header Offset   0001466F (83567)\n+22A4C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22751: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22A4C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22795 CENTRAL HEADER #83    02014B50 (33639248)\n-22799 Created Zip Spec      14 (20) '2.0'\n-2279A Created OS            03 (3) 'Unix'\n-2279B Extract Zip Spec      14 (20) '2.0'\n-2279C Extract OS            00 (0) 'MS-DOS'\n-2279D General Purpose Flag  0800 (2048)\n+22A90 CENTRAL HEADER #83    02014B50 (33639248)\n+22A94 Created Zip Spec      14 (20) '2.0'\n+22A95 Created OS            03 (3) 'Unix'\n+22A96 Extract Zip Spec      14 (20) '2.0'\n+22A97 Extract OS            00 (0) 'MS-DOS'\n+22A98 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2279F Compression Method    0008 (8) 'Deflated'\n-227A1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-227A5 CRC                   F9713EB9 (4184948409)\n-227A9 Compressed Size       000005A2 (1442)\n-227AD Uncompressed Size     00001198 (4504)\n-227B1 Filename Length       0045 (69)\n-227B3 Extra Length          0000 (0)\n-227B5 Comment Length        0000 (0)\n-227B7 Disk Start            0000 (0)\n-227B9 Int File Attributes   0000 (0)\n+22A9A Compression Method    0008 (8) 'Deflated'\n+22A9C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22AA0 CRC                   00160E4A (1445450)\n+22AA4 Compressed Size       000005B2 (1458)\n+22AA8 Uncompressed Size     00001208 (4616)\n+22AAC Filename Length       0045 (69)\n+22AAE Extra Length          0000 (0)\n+22AB0 Comment Length        0000 (0)\n+22AB2 Disk Start            0000 (0)\n+22AB4 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-227BB Ext File Attributes   81A40000 (2175008768)\n+22AB6 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-227BF Local Header Offset   00014875 (84085)\n-227C3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22ABA Local Header Offset   00014ACB (84683)\n+22ABE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x227C3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22ABE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22808 CENTRAL HEADER #84    02014B50 (33639248)\n-2280C Created Zip Spec      14 (20) '2.0'\n-2280D Created OS            03 (3) 'Unix'\n-2280E Extract Zip Spec      14 (20) '2.0'\n-2280F Extract OS            00 (0) 'MS-DOS'\n-22810 General Purpose Flag  0800 (2048)\n+22B03 CENTRAL HEADER #84    02014B50 (33639248)\n+22B07 Created Zip Spec      14 (20) '2.0'\n+22B08 Created OS            03 (3) 'Unix'\n+22B09 Extract Zip Spec      14 (20) '2.0'\n+22B0A Extract OS            00 (0) 'MS-DOS'\n+22B0B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22812 Compression Method    0008 (8) 'Deflated'\n-22814 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22818 CRC                   5914D57F (1494537599)\n-2281C Compressed Size       000003F4 (1012)\n-22820 Uncompressed Size     00000A34 (2612)\n-22824 Filename Length       0050 (80)\n-22826 Extra Length          0000 (0)\n-22828 Comment Length        0000 (0)\n-2282A Disk Start            0000 (0)\n-2282C Int File Attributes   0000 (0)\n+22B0D Compression Method    0008 (8) 'Deflated'\n+22B0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22B13 CRC                   6EF68498 (1861649560)\n+22B17 Compressed Size       000003FD (1021)\n+22B1B Uncompressed Size     00000A70 (2672)\n+22B1F Filename Length       0050 (80)\n+22B21 Extra Length          0000 (0)\n+22B23 Comment Length        0000 (0)\n+22B25 Disk Start            0000 (0)\n+22B27 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2282E Ext File Attributes   81A40000 (2175008768)\n+22B29 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22832 Local Header Offset   00014E7A (85626)\n-22836 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22B2D Local Header Offset   000150E0 (86240)\n+22B31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22836: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22B31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22886 CENTRAL HEADER #85    02014B50 (33639248)\n-2288A Created Zip Spec      14 (20) '2.0'\n-2288B Created OS            03 (3) 'Unix'\n-2288C Extract Zip Spec      14 (20) '2.0'\n-2288D Extract OS            00 (0) 'MS-DOS'\n-2288E General Purpose Flag  0800 (2048)\n+22B81 CENTRAL HEADER #85    02014B50 (33639248)\n+22B85 Created Zip Spec      14 (20) '2.0'\n+22B86 Created OS            03 (3) 'Unix'\n+22B87 Extract Zip Spec      14 (20) '2.0'\n+22B88 Extract OS            00 (0) 'MS-DOS'\n+22B89 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22890 Compression Method    0008 (8) 'Deflated'\n-22892 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22896 CRC                   F9948D9B (4187262363)\n-2289A Compressed Size       00000247 (583)\n-2289E Uncompressed Size     00000403 (1027)\n-228A2 Filename Length       0032 (50)\n-228A4 Extra Length          0000 (0)\n-228A6 Comment Length        0000 (0)\n-228A8 Disk Start            0000 (0)\n-228AA Int File Attributes   0000 (0)\n+22B8B Compression Method    0008 (8) 'Deflated'\n+22B8D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22B91 CRC                   0DCE7BD6 (231635926)\n+22B95 Compressed Size       0000024D (589)\n+22B99 Uncompressed Size     00000419 (1049)\n+22B9D Filename Length       0032 (50)\n+22B9F Extra Length          0000 (0)\n+22BA1 Comment Length        0000 (0)\n+22BA3 Disk Start            0000 (0)\n+22BA5 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-228AC Ext File Attributes   81A40000 (2175008768)\n+22BA7 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-228B0 Local Header Offset   000152DC (86748)\n-228B4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22BAB Local Header Offset   0001554B (87371)\n+22BAF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x228B4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22BAF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-228E6 CENTRAL HEADER #86    02014B50 (33639248)\n-228EA Created Zip Spec      14 (20) '2.0'\n-228EB Created OS            03 (3) 'Unix'\n-228EC Extract Zip Spec      14 (20) '2.0'\n-228ED Extract OS            00 (0) 'MS-DOS'\n-228EE General Purpose Flag  0800 (2048)\n+22BE1 CENTRAL HEADER #86    02014B50 (33639248)\n+22BE5 Created Zip Spec      14 (20) '2.0'\n+22BE6 Created OS            03 (3) 'Unix'\n+22BE7 Extract Zip Spec      14 (20) '2.0'\n+22BE8 Extract OS            00 (0) 'MS-DOS'\n+22BE9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-228F0 Compression Method    0008 (8) 'Deflated'\n-228F2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-228F6 CRC                   D0D8B588 (3503863176)\n-228FA Compressed Size       00000314 (788)\n-228FE Uncompressed Size     000006A9 (1705)\n-22902 Filename Length       004C (76)\n-22904 Extra Length          0000 (0)\n-22906 Comment Length        0000 (0)\n-22908 Disk Start            0000 (0)\n-2290A Int File Attributes   0000 (0)\n+22BEB Compression Method    0008 (8) 'Deflated'\n+22BED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22BF1 CRC                   3EC7C431 (1053279281)\n+22BF5 Compressed Size       0000031E (798)\n+22BF9 Uncompressed Size     000006D8 (1752)\n+22BFD Filename Length       004C (76)\n+22BFF Extra Length          0000 (0)\n+22C01 Comment Length        0000 (0)\n+22C03 Disk Start            0000 (0)\n+22C05 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2290C Ext File Attributes   81A40000 (2175008768)\n+22C07 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22910 Local Header Offset   00015573 (87411)\n-22914 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22C0B Local Header Offset   000157E8 (88040)\n+22C0F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22914: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22C0F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22960 CENTRAL HEADER #87    02014B50 (33639248)\n-22964 Created Zip Spec      14 (20) '2.0'\n-22965 Created OS            03 (3) 'Unix'\n-22966 Extract Zip Spec      14 (20) '2.0'\n-22967 Extract OS            00 (0) 'MS-DOS'\n-22968 General Purpose Flag  0800 (2048)\n+22C5B CENTRAL HEADER #87    02014B50 (33639248)\n+22C5F Created Zip Spec      14 (20) '2.0'\n+22C60 Created OS            03 (3) 'Unix'\n+22C61 Extract Zip Spec      14 (20) '2.0'\n+22C62 Extract OS            00 (0) 'MS-DOS'\n+22C63 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2296A Compression Method    0008 (8) 'Deflated'\n-2296C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22970 CRC                   DDD86D2D (3721948461)\n-22974 Compressed Size       000002F5 (757)\n-22978 Uncompressed Size     000006A3 (1699)\n-2297C Filename Length       0046 (70)\n-2297E Extra Length          0000 (0)\n-22980 Comment Length        0000 (0)\n-22982 Disk Start            0000 (0)\n-22984 Int File Attributes   0000 (0)\n+22C65 Compression Method    0008 (8) 'Deflated'\n+22C67 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22C6B CRC                   0AF6711C (183922972)\n+22C6F Compressed Size       000002FF (767)\n+22C73 Uncompressed Size     000006CE (1742)\n+22C77 Filename Length       0046 (70)\n+22C79 Extra Length          0000 (0)\n+22C7B Comment Length        0000 (0)\n+22C7D Disk Start            0000 (0)\n+22C7F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22986 Ext File Attributes   81A40000 (2175008768)\n+22C81 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2298A Local Header Offset   000158F1 (88305)\n-2298E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22C85 Local Header Offset   00015B70 (88944)\n+22C89 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2298E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22C89: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-229D4 CENTRAL HEADER #88    02014B50 (33639248)\n-229D8 Created Zip Spec      14 (20) '2.0'\n-229D9 Created OS            03 (3) 'Unix'\n-229DA Extract Zip Spec      14 (20) '2.0'\n-229DB Extract OS            00 (0) 'MS-DOS'\n-229DC General Purpose Flag  0800 (2048)\n+22CCF CENTRAL HEADER #88    02014B50 (33639248)\n+22CD3 Created Zip Spec      14 (20) '2.0'\n+22CD4 Created OS            03 (3) 'Unix'\n+22CD5 Extract Zip Spec      14 (20) '2.0'\n+22CD6 Extract OS            00 (0) 'MS-DOS'\n+22CD7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-229DE Compression Method    0008 (8) 'Deflated'\n-229E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-229E4 CRC                   F2CE052F (4073588015)\n-229E8 Compressed Size       00000546 (1350)\n-229EC Uncompressed Size     00000F34 (3892)\n-229F0 Filename Length       0047 (71)\n-229F2 Extra Length          0000 (0)\n-229F4 Comment Length        0000 (0)\n-229F6 Disk Start            0000 (0)\n-229F8 Int File Attributes   0000 (0)\n+22CD9 Compression Method    0008 (8) 'Deflated'\n+22CDB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22CDF CRC                   AA7692A4 (2859897508)\n+22CE3 Compressed Size       00000552 (1362)\n+22CE7 Uncompressed Size     00000F95 (3989)\n+22CEB Filename Length       0047 (71)\n+22CED Extra Length          0000 (0)\n+22CEF Comment Length        0000 (0)\n+22CF1 Disk Start            0000 (0)\n+22CF3 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-229FA Ext File Attributes   81A40000 (2175008768)\n+22CF5 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-229FE Local Header Offset   00015C4A (89162)\n-22A02 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22CF9 Local Header Offset   00015ED3 (89811)\n+22CFD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22A02: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22CFD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22A49 CENTRAL HEADER #89    02014B50 (33639248)\n-22A4D Created Zip Spec      14 (20) '2.0'\n-22A4E Created OS            03 (3) 'Unix'\n-22A4F Extract Zip Spec      14 (20) '2.0'\n-22A50 Extract OS            00 (0) 'MS-DOS'\n-22A51 General Purpose Flag  0800 (2048)\n+22D44 CENTRAL HEADER #89    02014B50 (33639248)\n+22D48 Created Zip Spec      14 (20) '2.0'\n+22D49 Created OS            03 (3) 'Unix'\n+22D4A Extract Zip Spec      14 (20) '2.0'\n+22D4B Extract OS            00 (0) 'MS-DOS'\n+22D4C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22A53 Compression Method    0008 (8) 'Deflated'\n-22A55 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22A59 CRC                   BF63BCF2 (3210984690)\n-22A5D Compressed Size       00000B50 (2896)\n-22A61 Uncompressed Size     00002BFC (11260)\n-22A65 Filename Length       003B (59)\n-22A67 Extra Length          0000 (0)\n-22A69 Comment Length        0000 (0)\n-22A6B Disk Start            0000 (0)\n-22A6D Int File Attributes   0000 (0)\n+22D4E Compression Method    0008 (8) 'Deflated'\n+22D50 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22D54 CRC                   B7357AFB (3073735419)\n+22D58 Compressed Size       00000B61 (2913)\n+22D5C Uncompressed Size     00002D19 (11545)\n+22D60 Filename Length       003B (59)\n+22D62 Extra Length          0000 (0)\n+22D64 Comment Length        0000 (0)\n+22D66 Disk Start            0000 (0)\n+22D68 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22A6F Ext File Attributes   81A40000 (2175008768)\n+22D6A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22A73 Local Header Offset   000161F5 (90613)\n-22A77 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22D6E Local Header Offset   0001648A (91274)\n+22D72 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22A77: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22D72: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22AB2 CENTRAL HEADER #90    02014B50 (33639248)\n-22AB6 Created Zip Spec      14 (20) '2.0'\n-22AB7 Created OS            03 (3) 'Unix'\n-22AB8 Extract Zip Spec      14 (20) '2.0'\n-22AB9 Extract OS            00 (0) 'MS-DOS'\n-22ABA General Purpose Flag  0800 (2048)\n+22DAD CENTRAL HEADER #90    02014B50 (33639248)\n+22DB1 Created Zip Spec      14 (20) '2.0'\n+22DB2 Created OS            03 (3) 'Unix'\n+22DB3 Extract Zip Spec      14 (20) '2.0'\n+22DB4 Extract OS            00 (0) 'MS-DOS'\n+22DB5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22ABC Compression Method    0008 (8) 'Deflated'\n-22ABE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22AC2 CRC                   E2D6B20B (3805721099)\n-22AC6 Compressed Size       0000041E (1054)\n-22ACA Uncompressed Size     00000CC3 (3267)\n-22ACE Filename Length       004E (78)\n-22AD0 Extra Length          0000 (0)\n-22AD2 Comment Length        0000 (0)\n-22AD4 Disk Start            0000 (0)\n-22AD6 Int File Attributes   0000 (0)\n+22DB7 Compression Method    0008 (8) 'Deflated'\n+22DB9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22DBD CRC                   C79AC1A5 (3348808101)\n+22DC1 Compressed Size       00000429 (1065)\n+22DC5 Uncompressed Size     00000D0C (3340)\n+22DC9 Filename Length       004E (78)\n+22DCB Extra Length          0000 (0)\n+22DCD Comment Length        0000 (0)\n+22DCF Disk Start            0000 (0)\n+22DD1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22AD8 Ext File Attributes   81A40000 (2175008768)\n+22DD3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22ADC Local Header Offset   00016D9E (93598)\n-22AE0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22DD7 Local Header Offset   00017044 (94276)\n+22DDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22AE0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22DDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22B2E CENTRAL HEADER #91    02014B50 (33639248)\n-22B32 Created Zip Spec      14 (20) '2.0'\n-22B33 Created OS            03 (3) 'Unix'\n-22B34 Extract Zip Spec      14 (20) '2.0'\n-22B35 Extract OS            00 (0) 'MS-DOS'\n-22B36 General Purpose Flag  0800 (2048)\n+22E29 CENTRAL HEADER #91    02014B50 (33639248)\n+22E2D Created Zip Spec      14 (20) '2.0'\n+22E2E Created OS            03 (3) 'Unix'\n+22E2F Extract Zip Spec      14 (20) '2.0'\n+22E30 Extract OS            00 (0) 'MS-DOS'\n+22E31 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22B38 Compression Method    0008 (8) 'Deflated'\n-22B3A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22B3E CRC                   ACAF58B5 (2897172661)\n-22B42 Compressed Size       0000020D (525)\n-22B46 Uncompressed Size     00000394 (916)\n-22B4A Filename Length       0042 (66)\n-22B4C Extra Length          0000 (0)\n-22B4E Comment Length        0000 (0)\n-22B50 Disk Start            0000 (0)\n-22B52 Int File Attributes   0000 (0)\n+22E33 Compression Method    0008 (8) 'Deflated'\n+22E35 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22E39 CRC                   09C52AF8 (163916536)\n+22E3D Compressed Size       00000213 (531)\n+22E41 Uncompressed Size     000003A9 (937)\n+22E45 Filename Length       0042 (66)\n+22E47 Extra Length          0000 (0)\n+22E49 Comment Length        0000 (0)\n+22E4B Disk Start            0000 (0)\n+22E4D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22B54 Ext File Attributes   81A40000 (2175008768)\n+22E4F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22B58 Local Header Offset   00017228 (94760)\n-22B5C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22E53 Local Header Offset   000174D9 (95449)\n+22E57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22B5C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22E57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22B9E CENTRAL HEADER #92    02014B50 (33639248)\n-22BA2 Created Zip Spec      14 (20) '2.0'\n-22BA3 Created OS            03 (3) 'Unix'\n-22BA4 Extract Zip Spec      14 (20) '2.0'\n-22BA5 Extract OS            00 (0) 'MS-DOS'\n-22BA6 General Purpose Flag  0800 (2048)\n+22E99 CENTRAL HEADER #92    02014B50 (33639248)\n+22E9D Created Zip Spec      14 (20) '2.0'\n+22E9E Created OS            03 (3) 'Unix'\n+22E9F Extract Zip Spec      14 (20) '2.0'\n+22EA0 Extract OS            00 (0) 'MS-DOS'\n+22EA1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22BA8 Compression Method    0008 (8) 'Deflated'\n-22BAA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22BAE CRC                   963EDCDB (2520702171)\n-22BB2 Compressed Size       00001A00 (6656)\n-22BB6 Uncompressed Size     0000723A (29242)\n-22BBA Filename Length       003C (60)\n-22BBC Extra Length          0000 (0)\n-22BBE Comment Length        0000 (0)\n-22BC0 Disk Start            0000 (0)\n-22BC2 Int File Attributes   0000 (0)\n+22EA3 Compression Method    0008 (8) 'Deflated'\n+22EA5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22EA9 CRC                   963EDCDB (2520702171)\n+22EAD Compressed Size       00001A00 (6656)\n+22EB1 Uncompressed Size     0000723A (29242)\n+22EB5 Filename Length       003C (60)\n+22EB7 Extra Length          0000 (0)\n+22EB9 Comment Length        0000 (0)\n+22EBB Disk Start            0000 (0)\n+22EBD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22BC4 Ext File Attributes   81A40000 (2175008768)\n+22EBF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22BC8 Local Header Offset   00017495 (95381)\n-22BCC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22EC3 Local Header Offset   0001774C (96076)\n+22EC7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22BCC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22EC7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22C08 CENTRAL HEADER #93    02014B50 (33639248)\n-22C0C Created Zip Spec      14 (20) '2.0'\n-22C0D Created OS            03 (3) 'Unix'\n-22C0E Extract Zip Spec      14 (20) '2.0'\n-22C0F Extract OS            00 (0) 'MS-DOS'\n-22C10 General Purpose Flag  0800 (2048)\n+22F03 CENTRAL HEADER #93    02014B50 (33639248)\n+22F07 Created Zip Spec      14 (20) '2.0'\n+22F08 Created OS            03 (3) 'Unix'\n+22F09 Extract Zip Spec      14 (20) '2.0'\n+22F0A Extract OS            00 (0) 'MS-DOS'\n+22F0B General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22C12 Compression Method    0008 (8) 'Deflated'\n-22C14 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22C18 CRC                   FA47221B (4198965787)\n-22C1C Compressed Size       00001EE4 (7908)\n-22C20 Uncompressed Size     0000926E (37486)\n-22C24 Filename Length       003B (59)\n-22C26 Extra Length          0000 (0)\n-22C28 Comment Length        0000 (0)\n-22C2A Disk Start            0000 (0)\n-22C2C Int File Attributes   0000 (0)\n+22F0D Compression Method    0008 (8) 'Deflated'\n+22F0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22F13 CRC                   180ADDBE (403365310)\n+22F17 Compressed Size       00001F09 (7945)\n+22F1B Uncompressed Size     000095B9 (38329)\n+22F1F Filename Length       003B (59)\n+22F21 Extra Length          0000 (0)\n+22F23 Comment Length        0000 (0)\n+22F25 Disk Start            0000 (0)\n+22F27 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22C2E Ext File Attributes   81A40000 (2175008768)\n+22F29 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22C32 Local Header Offset   00018EEF (102127)\n-22C36 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22F2D Local Header Offset   000191A6 (102822)\n+22F31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22C36: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22F31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22C71 CENTRAL HEADER #94    02014B50 (33639248)\n-22C75 Created Zip Spec      14 (20) '2.0'\n-22C76 Created OS            03 (3) 'Unix'\n-22C77 Extract Zip Spec      14 (20) '2.0'\n-22C78 Extract OS            00 (0) 'MS-DOS'\n-22C79 General Purpose Flag  0800 (2048)\n+22F6C CENTRAL HEADER #94    02014B50 (33639248)\n+22F70 Created Zip Spec      14 (20) '2.0'\n+22F71 Created OS            03 (3) 'Unix'\n+22F72 Extract Zip Spec      14 (20) '2.0'\n+22F73 Extract OS            00 (0) 'MS-DOS'\n+22F74 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22C7B Compression Method    0008 (8) 'Deflated'\n-22C7D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22C81 CRC                   14A86D48 (346582344)\n-22C85 Compressed Size       00000360 (864)\n-22C89 Uncompressed Size     0000082F (2095)\n-22C8D Filename Length       0043 (67)\n-22C8F Extra Length          0000 (0)\n-22C91 Comment Length        0000 (0)\n-22C93 Disk Start            0000 (0)\n-22C95 Int File Attributes   0000 (0)\n+22F76 Compression Method    0008 (8) 'Deflated'\n+22F78 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22F7C CRC                   7701B7FD (1996601341)\n+22F80 Compressed Size       0000036E (878)\n+22F84 Uncompressed Size     00000864 (2148)\n+22F88 Filename Length       0043 (67)\n+22F8A Extra Length          0000 (0)\n+22F8C Comment Length        0000 (0)\n+22F8E Disk Start            0000 (0)\n+22F90 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22C97 Ext File Attributes   81A40000 (2175008768)\n+22F92 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22C9B Local Header Offset   0001AE2C (110124)\n-22C9F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22F96 Local Header Offset   0001B108 (110856)\n+22F9A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22C9F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22F9A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22CE2 CENTRAL HEADER #95    02014B50 (33639248)\n-22CE6 Created Zip Spec      14 (20) '2.0'\n-22CE7 Created OS            03 (3) 'Unix'\n-22CE8 Extract Zip Spec      14 (20) '2.0'\n-22CE9 Extract OS            00 (0) 'MS-DOS'\n-22CEA General Purpose Flag  0800 (2048)\n+22FDD CENTRAL HEADER #95    02014B50 (33639248)\n+22FE1 Created Zip Spec      14 (20) '2.0'\n+22FE2 Created OS            03 (3) 'Unix'\n+22FE3 Extract Zip Spec      14 (20) '2.0'\n+22FE4 Extract OS            00 (0) 'MS-DOS'\n+22FE5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22CEC Compression Method    0008 (8) 'Deflated'\n-22CEE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22CF2 CRC                   A7748368 (2809430888)\n-22CF6 Compressed Size       000005DF (1503)\n-22CFA Uncompressed Size     00001148 (4424)\n-22CFE Filename Length       0036 (54)\n-22D00 Extra Length          0000 (0)\n-22D02 Comment Length        0000 (0)\n-22D04 Disk Start            0000 (0)\n-22D06 Int File Attributes   0000 (0)\n+22FE7 Compression Method    0008 (8) 'Deflated'\n+22FE9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22FED CRC                   B5B90B55 (3048803157)\n+22FF1 Compressed Size       000005EC (1516)\n+22FF5 Uncompressed Size     000011CD (4557)\n+22FF9 Filename Length       0036 (54)\n+22FFB Extra Length          0000 (0)\n+22FFD Comment Length        0000 (0)\n+22FFF Disk Start            0000 (0)\n+23001 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22D08 Ext File Attributes   81A40000 (2175008768)\n+23003 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22D0C Local Header Offset   0001B1ED (111085)\n-22D10 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23007 Local Header Offset   0001B4D7 (111831)\n+2300B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22D10: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2300B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22D46 CENTRAL HEADER #96    02014B50 (33639248)\n-22D4A Created Zip Spec      14 (20) '2.0'\n-22D4B Created OS            03 (3) 'Unix'\n-22D4C Extract Zip Spec      14 (20) '2.0'\n-22D4D Extract OS            00 (0) 'MS-DOS'\n-22D4E General Purpose Flag  0800 (2048)\n+23041 CENTRAL HEADER #96    02014B50 (33639248)\n+23045 Created Zip Spec      14 (20) '2.0'\n+23046 Created OS            03 (3) 'Unix'\n+23047 Extract Zip Spec      14 (20) '2.0'\n+23048 Extract OS            00 (0) 'MS-DOS'\n+23049 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22D50 Compression Method    0008 (8) 'Deflated'\n-22D52 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22D56 CRC                   5117C509 (1360512265)\n-22D5A Compressed Size       000002C3 (707)\n-22D5E Uncompressed Size     000005CF (1487)\n-22D62 Filename Length       0039 (57)\n-22D64 Extra Length          0000 (0)\n-22D66 Comment Length        0000 (0)\n-22D68 Disk Start            0000 (0)\n-22D6A Int File Attributes   0000 (0)\n+2304B Compression Method    0008 (8) 'Deflated'\n+2304D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23051 CRC                   5117C509 (1360512265)\n+23055 Compressed Size       000002C3 (707)\n+23059 Uncompressed Size     000005CF (1487)\n+2305D Filename Length       0039 (57)\n+2305F Extra Length          0000 (0)\n+23061 Comment Length        0000 (0)\n+23063 Disk Start            0000 (0)\n+23065 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22D6C Ext File Attributes   81A40000 (2175008768)\n+23067 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22D70 Local Header Offset   0001B820 (112672)\n-22D74 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2306B Local Header Offset   0001BB17 (113431)\n+2306F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22D74: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2306F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22DAD CENTRAL HEADER #97    02014B50 (33639248)\n-22DB1 Created Zip Spec      14 (20) '2.0'\n-22DB2 Created OS            03 (3) 'Unix'\n-22DB3 Extract Zip Spec      14 (20) '2.0'\n-22DB4 Extract OS            00 (0) 'MS-DOS'\n-22DB5 General Purpose Flag  0800 (2048)\n+230A8 CENTRAL HEADER #97    02014B50 (33639248)\n+230AC Created Zip Spec      14 (20) '2.0'\n+230AD Created OS            03 (3) 'Unix'\n+230AE Extract Zip Spec      14 (20) '2.0'\n+230AF Extract OS            00 (0) 'MS-DOS'\n+230B0 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22DB7 Compression Method    0008 (8) 'Deflated'\n-22DB9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22DBD CRC                   FCC4145B (4240708699)\n-22DC1 Compressed Size       00000315 (789)\n-22DC5 Uncompressed Size     000006E0 (1760)\n-22DC9 Filename Length       0039 (57)\n-22DCB Extra Length          0000 (0)\n-22DCD Comment Length        0000 (0)\n-22DCF Disk Start            0000 (0)\n-22DD1 Int File Attributes   0000 (0)\n+230B2 Compression Method    0008 (8) 'Deflated'\n+230B4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+230B8 CRC                   FCC4145B (4240708699)\n+230BC Compressed Size       00000315 (789)\n+230C0 Uncompressed Size     000006E0 (1760)\n+230C4 Filename Length       0039 (57)\n+230C6 Extra Length          0000 (0)\n+230C8 Comment Length        0000 (0)\n+230CA Disk Start            0000 (0)\n+230CC Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22DD3 Ext File Attributes   81A40000 (2175008768)\n+230CE Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22DD7 Local Header Offset   0001BB3A (113466)\n-22DDB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+230D2 Local Header Offset   0001BE31 (114225)\n+230D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22DDB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x230D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22E14 CENTRAL HEADER #98    02014B50 (33639248)\n-22E18 Created Zip Spec      14 (20) '2.0'\n-22E19 Created OS            03 (3) 'Unix'\n-22E1A Extract Zip Spec      14 (20) '2.0'\n-22E1B Extract OS            00 (0) 'MS-DOS'\n-22E1C General Purpose Flag  0800 (2048)\n+2310F CENTRAL HEADER #98    02014B50 (33639248)\n+23113 Created Zip Spec      14 (20) '2.0'\n+23114 Created OS            03 (3) 'Unix'\n+23115 Extract Zip Spec      14 (20) '2.0'\n+23116 Extract OS            00 (0) 'MS-DOS'\n+23117 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22E1E Compression Method    0008 (8) 'Deflated'\n-22E20 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22E24 CRC                   A6BC7A6B (2797369963)\n-22E28 Compressed Size       000002C6 (710)\n-22E2C Uncompressed Size     000005DB (1499)\n-22E30 Filename Length       003B (59)\n-22E32 Extra Length          0000 (0)\n-22E34 Comment Length        0000 (0)\n-22E36 Disk Start            0000 (0)\n-22E38 Int File Attributes   0000 (0)\n+23119 Compression Method    0008 (8) 'Deflated'\n+2311B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2311F CRC                   A6BC7A6B (2797369963)\n+23123 Compressed Size       000002C6 (710)\n+23127 Uncompressed Size     000005DB (1499)\n+2312B Filename Length       003B (59)\n+2312D Extra Length          0000 (0)\n+2312F Comment Length        0000 (0)\n+23131 Disk Start            0000 (0)\n+23133 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22E3A Ext File Attributes   81A40000 (2175008768)\n+23135 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22E3E Local Header Offset   0001BEA6 (114342)\n-22E42 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23139 Local Header Offset   0001C19D (115101)\n+2313D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22E42: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2313D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22E7D CENTRAL HEADER #99    02014B50 (33639248)\n-22E81 Created Zip Spec      14 (20) '2.0'\n-22E82 Created OS            03 (3) 'Unix'\n-22E83 Extract Zip Spec      14 (20) '2.0'\n-22E84 Extract OS            00 (0) 'MS-DOS'\n-22E85 General Purpose Flag  0800 (2048)\n+23178 CENTRAL HEADER #99    02014B50 (33639248)\n+2317C Created Zip Spec      14 (20) '2.0'\n+2317D Created OS            03 (3) 'Unix'\n+2317E Extract Zip Spec      14 (20) '2.0'\n+2317F Extract OS            00 (0) 'MS-DOS'\n+23180 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22E87 Compression Method    0008 (8) 'Deflated'\n-22E89 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22E8D CRC                   CDD77CC5 (3453451461)\n-22E91 Compressed Size       00000317 (791)\n-22E95 Uncompressed Size     000006EA (1770)\n-22E99 Filename Length       003B (59)\n-22E9B Extra Length          0000 (0)\n-22E9D Comment Length        0000 (0)\n-22E9F Disk Start            0000 (0)\n-22EA1 Int File Attributes   0000 (0)\n+23182 Compression Method    0008 (8) 'Deflated'\n+23184 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23188 CRC                   CDD77CC5 (3453451461)\n+2318C Compressed Size       00000317 (791)\n+23190 Uncompressed Size     000006EA (1770)\n+23194 Filename Length       003B (59)\n+23196 Extra Length          0000 (0)\n+23198 Comment Length        0000 (0)\n+2319A Disk Start            0000 (0)\n+2319C Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22EA3 Ext File Attributes   81A40000 (2175008768)\n+2319E Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22EA7 Local Header Offset   0001C1C5 (115141)\n-22EAB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+231A2 Local Header Offset   0001C4BC (115900)\n+231A6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22EAB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x231A6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22EE6 CENTRAL HEADER #100   02014B50 (33639248)\n-22EEA Created Zip Spec      14 (20) '2.0'\n-22EEB Created OS            03 (3) 'Unix'\n-22EEC Extract Zip Spec      14 (20) '2.0'\n-22EED Extract OS            00 (0) 'MS-DOS'\n-22EEE General Purpose Flag  0800 (2048)\n+231E1 CENTRAL HEADER #100   02014B50 (33639248)\n+231E5 Created Zip Spec      14 (20) '2.0'\n+231E6 Created OS            03 (3) 'Unix'\n+231E7 Extract Zip Spec      14 (20) '2.0'\n+231E8 Extract OS            00 (0) 'MS-DOS'\n+231E9 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22EF0 Compression Method    0008 (8) 'Deflated'\n-22EF2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22EF6 CRC                   1D384067 (490225767)\n-22EFA Compressed Size       000002C5 (709)\n-22EFE Uncompressed Size     0000059E (1438)\n-22F02 Filename Length       0031 (49)\n-22F04 Extra Length          0000 (0)\n-22F06 Comment Length        0000 (0)\n-22F08 Disk Start            0000 (0)\n-22F0A Int File Attributes   0000 (0)\n+231EB Compression Method    0008 (8) 'Deflated'\n+231ED Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+231F1 CRC                   5112EBCA (1360194506)\n+231F5 Compressed Size       000002CC (716)\n+231F9 Uncompressed Size     000005C7 (1479)\n+231FD Filename Length       0031 (49)\n+231FF Extra Length          0000 (0)\n+23201 Comment Length        0000 (0)\n+23203 Disk Start            0000 (0)\n+23205 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22F0C Ext File Attributes   81A40000 (2175008768)\n+23207 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22F10 Local Header Offset   0001C535 (116021)\n-22F14 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2320B Local Header Offset   0001C82C (116780)\n+2320F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22F14: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2320F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22F45 CENTRAL HEADER #101   02014B50 (33639248)\n-22F49 Created Zip Spec      14 (20) '2.0'\n-22F4A Created OS            03 (3) 'Unix'\n-22F4B Extract Zip Spec      14 (20) '2.0'\n-22F4C Extract OS            00 (0) 'MS-DOS'\n-22F4D General Purpose Flag  0800 (2048)\n+23240 CENTRAL HEADER #101   02014B50 (33639248)\n+23244 Created Zip Spec      14 (20) '2.0'\n+23245 Created OS            03 (3) 'Unix'\n+23246 Extract Zip Spec      14 (20) '2.0'\n+23247 Extract OS            00 (0) 'MS-DOS'\n+23248 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22F4F Compression Method    0008 (8) 'Deflated'\n-22F51 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22F55 CRC                   F2E8FAB9 (4075354809)\n-22F59 Compressed Size       00000369 (873)\n-22F5D Uncompressed Size     00000826 (2086)\n-22F61 Filename Length       003B (59)\n-22F63 Extra Length          0000 (0)\n-22F65 Comment Length        0000 (0)\n-22F67 Disk Start            0000 (0)\n-22F69 Int File Attributes   0000 (0)\n+2324A Compression Method    0008 (8) 'Deflated'\n+2324C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23250 CRC                   F2E8FAB9 (4075354809)\n+23254 Compressed Size       00000369 (873)\n+23258 Uncompressed Size     00000826 (2086)\n+2325C Filename Length       003B (59)\n+2325E Extra Length          0000 (0)\n+23260 Comment Length        0000 (0)\n+23262 Disk Start            0000 (0)\n+23264 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22F6B Ext File Attributes   81A40000 (2175008768)\n+23266 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22F6F Local Header Offset   0001C849 (116809)\n-22F73 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2326A Local Header Offset   0001CB47 (117575)\n+2326E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22F73: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2326E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-22FAE CENTRAL HEADER #102   02014B50 (33639248)\n-22FB2 Created Zip Spec      14 (20) '2.0'\n-22FB3 Created OS            03 (3) 'Unix'\n-22FB4 Extract Zip Spec      14 (20) '2.0'\n-22FB5 Extract OS            00 (0) 'MS-DOS'\n-22FB6 General Purpose Flag  0800 (2048)\n+232A9 CENTRAL HEADER #102   02014B50 (33639248)\n+232AD Created Zip Spec      14 (20) '2.0'\n+232AE Created OS            03 (3) 'Unix'\n+232AF Extract Zip Spec      14 (20) '2.0'\n+232B0 Extract OS            00 (0) 'MS-DOS'\n+232B1 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-22FB8 Compression Method    0008 (8) 'Deflated'\n-22FBA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22FBE CRC                   5DDCD4C5 (1574753477)\n-22FC2 Compressed Size       0000124E (4686)\n-22FC6 Uncompressed Size     0000537F (21375)\n-22FCA Filename Length       0037 (55)\n-22FCC Extra Length          0000 (0)\n-22FCE Comment Length        0000 (0)\n-22FD0 Disk Start            0000 (0)\n-22FD2 Int File Attributes   0000 (0)\n+232B3 Compression Method    0008 (8) 'Deflated'\n+232B5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+232B9 CRC                   5DDCD4C5 (1574753477)\n+232BD Compressed Size       0000124E (4686)\n+232C1 Uncompressed Size     0000537F (21375)\n+232C5 Filename Length       0037 (55)\n+232C7 Extra Length          0000 (0)\n+232C9 Comment Length        0000 (0)\n+232CB Disk Start            0000 (0)\n+232CD Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-22FD4 Ext File Attributes   81A40000 (2175008768)\n+232CF Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-22FD8 Local Header Offset   0001CC0B (117771)\n-22FDC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+232D3 Local Header Offset   0001CF09 (118537)\n+232D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22FDC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x232D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23013 CENTRAL HEADER #103   02014B50 (33639248)\n-23017 Created Zip Spec      14 (20) '2.0'\n-23018 Created OS            03 (3) 'Unix'\n-23019 Extract Zip Spec      14 (20) '2.0'\n-2301A Extract OS            00 (0) 'MS-DOS'\n-2301B General Purpose Flag  0800 (2048)\n+2330E CENTRAL HEADER #103   02014B50 (33639248)\n+23312 Created Zip Spec      14 (20) '2.0'\n+23313 Created OS            03 (3) 'Unix'\n+23314 Extract Zip Spec      14 (20) '2.0'\n+23315 Extract OS            00 (0) 'MS-DOS'\n+23316 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2301D Compression Method    0008 (8) 'Deflated'\n-2301F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23023 CRC                   5BC81E29 (1539841577)\n-23027 Compressed Size       000008C4 (2244)\n-2302B Uncompressed Size     00001D8A (7562)\n-2302F Filename Length       003E (62)\n-23031 Extra Length          0000 (0)\n-23033 Comment Length        0000 (0)\n-23035 Disk Start            0000 (0)\n-23037 Int File Attributes   0000 (0)\n+23318 Compression Method    0008 (8) 'Deflated'\n+2331A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2331E CRC                   5BC81E29 (1539841577)\n+23322 Compressed Size       000008C4 (2244)\n+23326 Uncompressed Size     00001D8A (7562)\n+2332A Filename Length       003E (62)\n+2332C Extra Length          0000 (0)\n+2332E Comment Length        0000 (0)\n+23330 Disk Start            0000 (0)\n+23332 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23039 Ext File Attributes   81A40000 (2175008768)\n+23334 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2303D Local Header Offset   0001DEAE (122542)\n-23041 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23338 Local Header Offset   0001E1AC (123308)\n+2333C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23041: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2333C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2307F CENTRAL HEADER #104   02014B50 (33639248)\n-23083 Created Zip Spec      14 (20) '2.0'\n-23084 Created OS            03 (3) 'Unix'\n-23085 Extract Zip Spec      14 (20) '2.0'\n-23086 Extract OS            00 (0) 'MS-DOS'\n-23087 General Purpose Flag  0800 (2048)\n+2337A CENTRAL HEADER #104   02014B50 (33639248)\n+2337E Created Zip Spec      14 (20) '2.0'\n+2337F Created OS            03 (3) 'Unix'\n+23380 Extract Zip Spec      14 (20) '2.0'\n+23381 Extract OS            00 (0) 'MS-DOS'\n+23382 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23089 Compression Method    0008 (8) 'Deflated'\n-2308B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2308F CRC                   A266F3B2 (2724656050)\n-23093 Compressed Size       00000BED (3053)\n-23097 Uncompressed Size     0000462E (17966)\n-2309B Filename Length       0037 (55)\n-2309D Extra Length          0000 (0)\n-2309F Comment Length        0000 (0)\n-230A1 Disk Start            0000 (0)\n-230A3 Int File Attributes   0000 (0)\n+23384 Compression Method    0008 (8) 'Deflated'\n+23386 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2338A CRC                   A266F3B2 (2724656050)\n+2338E Compressed Size       00000BED (3053)\n+23392 Uncompressed Size     0000462E (17966)\n+23396 Filename Length       0037 (55)\n+23398 Extra Length          0000 (0)\n+2339A Comment Length        0000 (0)\n+2339C Disk Start            0000 (0)\n+2339E Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-230A5 Ext File Attributes   81A40000 (2175008768)\n+233A0 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-230A9 Local Header Offset   0001E7CE (124878)\n-230AD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+233A4 Local Header Offset   0001EACC (125644)\n+233A8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x230AD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x233A8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-230E4 CENTRAL HEADER #105   02014B50 (33639248)\n-230E8 Created Zip Spec      14 (20) '2.0'\n-230E9 Created OS            03 (3) 'Unix'\n-230EA Extract Zip Spec      14 (20) '2.0'\n-230EB Extract OS            00 (0) 'MS-DOS'\n-230EC General Purpose Flag  0800 (2048)\n+233DF CENTRAL HEADER #105   02014B50 (33639248)\n+233E3 Created Zip Spec      14 (20) '2.0'\n+233E4 Created OS            03 (3) 'Unix'\n+233E5 Extract Zip Spec      14 (20) '2.0'\n+233E6 Extract OS            00 (0) 'MS-DOS'\n+233E7 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-230EE Compression Method    0008 (8) 'Deflated'\n-230F0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-230F4 CRC                   952E3CF5 (2502835445)\n-230F8 Compressed Size       000002C7 (711)\n-230FC Uncompressed Size     00000552 (1362)\n-23100 Filename Length       0043 (67)\n-23102 Extra Length          0000 (0)\n-23104 Comment Length        0000 (0)\n-23106 Disk Start            0000 (0)\n-23108 Int File Attributes   0000 (0)\n+233E9 Compression Method    0008 (8) 'Deflated'\n+233EB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+233EF CRC                   952E3CF5 (2502835445)\n+233F3 Compressed Size       000002C7 (711)\n+233F7 Uncompressed Size     00000552 (1362)\n+233FB Filename Length       0043 (67)\n+233FD Extra Length          0000 (0)\n+233FF Comment Length        0000 (0)\n+23401 Disk Start            0000 (0)\n+23403 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2310A Ext File Attributes   81A40000 (2175008768)\n+23405 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2310E Local Header Offset   0001F410 (128016)\n-23112 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23409 Local Header Offset   0001F70E (128782)\n+2340D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23112: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2340D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23155 CENTRAL HEADER #106   02014B50 (33639248)\n-23159 Created Zip Spec      14 (20) '2.0'\n-2315A Created OS            03 (3) 'Unix'\n-2315B Extract Zip Spec      14 (20) '2.0'\n-2315C Extract OS            00 (0) 'MS-DOS'\n-2315D General Purpose Flag  0800 (2048)\n+23450 CENTRAL HEADER #106   02014B50 (33639248)\n+23454 Created Zip Spec      14 (20) '2.0'\n+23455 Created OS            03 (3) 'Unix'\n+23456 Extract Zip Spec      14 (20) '2.0'\n+23457 Extract OS            00 (0) 'MS-DOS'\n+23458 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2315F Compression Method    0008 (8) 'Deflated'\n-23161 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23165 CRC                   764EE4B3 (1984881843)\n-23169 Compressed Size       00000033 (51)\n-2316D Uncompressed Size     0000003F (63)\n-23171 Filename Length       0044 (68)\n-23173 Extra Length          0000 (0)\n-23175 Comment Length        0000 (0)\n-23177 Disk Start            0000 (0)\n-23179 Int File Attributes   0000 (0)\n+2345A Compression Method    0008 (8) 'Deflated'\n+2345C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23460 CRC                   764EE4B3 (1984881843)\n+23464 Compressed Size       00000033 (51)\n+23468 Uncompressed Size     0000003F (63)\n+2346C Filename Length       0044 (68)\n+2346E Extra Length          0000 (0)\n+23470 Comment Length        0000 (0)\n+23472 Disk Start            0000 (0)\n+23474 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2317B Ext File Attributes   81A40000 (2175008768)\n+23476 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2317F Local Header Offset   0001F738 (128824)\n-23183 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2347A Local Header Offset   0001FA36 (129590)\n+2347E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23183: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2347E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-231C7 CENTRAL HEADER #107   02014B50 (33639248)\n-231CB Created Zip Spec      14 (20) '2.0'\n-231CC Created OS            03 (3) 'Unix'\n-231CD Extract Zip Spec      14 (20) '2.0'\n-231CE Extract OS            00 (0) 'MS-DOS'\n-231CF General Purpose Flag  0800 (2048)\n+234C2 CENTRAL HEADER #107   02014B50 (33639248)\n+234C6 Created Zip Spec      14 (20) '2.0'\n+234C7 Created OS            03 (3) 'Unix'\n+234C8 Extract Zip Spec      14 (20) '2.0'\n+234C9 Extract OS            00 (0) 'MS-DOS'\n+234CA General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-231D1 Compression Method    0008 (8) 'Deflated'\n-231D3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-231D7 CRC                   0FE2368F (266483343)\n-231DB Compressed Size       00000043 (67)\n-231DF Uncompressed Size     00000055 (85)\n-231E3 Filename Length       003C (60)\n-231E5 Extra Length          0000 (0)\n-231E7 Comment Length        0000 (0)\n-231E9 Disk Start            0000 (0)\n-231EB Int File Attributes   0000 (0)\n+234CC Compression Method    0008 (8) 'Deflated'\n+234CE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+234D2 CRC                   0FE2368F (266483343)\n+234D6 Compressed Size       00000043 (67)\n+234DA Uncompressed Size     00000055 (85)\n+234DE Filename Length       003C (60)\n+234E0 Extra Length          0000 (0)\n+234E2 Comment Length        0000 (0)\n+234E4 Disk Start            0000 (0)\n+234E6 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-231ED Ext File Attributes   81A40000 (2175008768)\n+234E8 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-231F1 Local Header Offset   0001F7CD (128973)\n-231F5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+234EC Local Header Offset   0001FACB (129739)\n+234F0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x231F5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x234F0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23231 CENTRAL HEADER #108   02014B50 (33639248)\n-23235 Created Zip Spec      14 (20) '2.0'\n-23236 Created OS            03 (3) 'Unix'\n-23237 Extract Zip Spec      14 (20) '2.0'\n-23238 Extract OS            00 (0) 'MS-DOS'\n-23239 General Purpose Flag  0800 (2048)\n+2352C CENTRAL HEADER #108   02014B50 (33639248)\n+23530 Created Zip Spec      14 (20) '2.0'\n+23531 Created OS            03 (3) 'Unix'\n+23532 Extract Zip Spec      14 (20) '2.0'\n+23533 Extract OS            00 (0) 'MS-DOS'\n+23534 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2323B Compression Method    0008 (8) 'Deflated'\n-2323D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23241 CRC                   93CA6C9E (2479516830)\n-23245 Compressed Size       00000044 (68)\n-23249 Uncompressed Size     0000004D (77)\n-2324D Filename Length       0044 (68)\n-2324F Extra Length          0000 (0)\n-23251 Comment Length        0000 (0)\n-23253 Disk Start            0000 (0)\n-23255 Int File Attributes   0000 (0)\n+23536 Compression Method    0008 (8) 'Deflated'\n+23538 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2353C CRC                   93CA6C9E (2479516830)\n+23540 Compressed Size       00000044 (68)\n+23544 Uncompressed Size     0000004D (77)\n+23548 Filename Length       0044 (68)\n+2354A Extra Length          0000 (0)\n+2354C Comment Length        0000 (0)\n+2354E Disk Start            0000 (0)\n+23550 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23257 Ext File Attributes   81A40000 (2175008768)\n+23552 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2325B Local Header Offset   0001F86A (129130)\n-2325F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23556 Local Header Offset   0001FB68 (129896)\n+2355A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2325F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2355A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-232A3 CENTRAL HEADER #109   02014B50 (33639248)\n-232A7 Created Zip Spec      14 (20) '2.0'\n-232A8 Created OS            03 (3) 'Unix'\n-232A9 Extract Zip Spec      14 (20) '2.0'\n-232AA Extract OS            00 (0) 'MS-DOS'\n-232AB General Purpose Flag  0800 (2048)\n+2359E CENTRAL HEADER #109   02014B50 (33639248)\n+235A2 Created Zip Spec      14 (20) '2.0'\n+235A3 Created OS            03 (3) 'Unix'\n+235A4 Extract Zip Spec      14 (20) '2.0'\n+235A5 Extract OS            00 (0) 'MS-DOS'\n+235A6 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-232AD Compression Method    0008 (8) 'Deflated'\n-232AF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-232B3 CRC                   4B7CAED5 (1266462421)\n-232B7 Compressed Size       0000004D (77)\n-232BB Uncompressed Size     00000057 (87)\n-232BF Filename Length       0049 (73)\n-232C1 Extra Length          0000 (0)\n-232C3 Comment Length        0000 (0)\n-232C5 Disk Start            0000 (0)\n-232C7 Int File Attributes   0000 (0)\n+235A8 Compression Method    0008 (8) 'Deflated'\n+235AA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+235AE CRC                   4B7CAED5 (1266462421)\n+235B2 Compressed Size       0000004D (77)\n+235B6 Uncompressed Size     00000057 (87)\n+235BA Filename Length       0049 (73)\n+235BC Extra Length          0000 (0)\n+235BE Comment Length        0000 (0)\n+235C0 Disk Start            0000 (0)\n+235C2 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-232C9 Ext File Attributes   81A40000 (2175008768)\n+235C4 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-232CD Local Header Offset   0001F910 (129296)\n-232D1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+235C8 Local Header Offset   0001FC0E (130062)\n+235CC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x232D1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x235CC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2331A CENTRAL HEADER #110   02014B50 (33639248)\n-2331E Created Zip Spec      14 (20) '2.0'\n-2331F Created OS            03 (3) 'Unix'\n-23320 Extract Zip Spec      14 (20) '2.0'\n-23321 Extract OS            00 (0) 'MS-DOS'\n-23322 General Purpose Flag  0800 (2048)\n+23615 CENTRAL HEADER #110   02014B50 (33639248)\n+23619 Created Zip Spec      14 (20) '2.0'\n+2361A Created OS            03 (3) 'Unix'\n+2361B Extract Zip Spec      14 (20) '2.0'\n+2361C Extract OS            00 (0) 'MS-DOS'\n+2361D General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23324 Compression Method    0008 (8) 'Deflated'\n-23326 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2332A CRC                   83C8809D (2210955421)\n-2332E Compressed Size       00000057 (87)\n-23332 Uncompressed Size     00000094 (148)\n-23336 Filename Length       0041 (65)\n-23338 Extra Length          0000 (0)\n-2333A Comment Length        0000 (0)\n-2333C Disk Start            0000 (0)\n-2333E Int File Attributes   0000 (0)\n+2361F Compression Method    0008 (8) 'Deflated'\n+23621 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23625 CRC                   CDA6F1A6 (3450270118)\n+23629 Compressed Size       00000058 (88)\n+2362D Uncompressed Size     00000095 (149)\n+23631 Filename Length       0041 (65)\n+23633 Extra Length          0000 (0)\n+23635 Comment Length        0000 (0)\n+23637 Disk Start            0000 (0)\n+23639 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23340 Ext File Attributes   81A40000 (2175008768)\n+2363B Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23344 Local Header Offset   0001F9C4 (129476)\n-23348 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2363F Local Header Offset   0001FCC2 (130242)\n+23643 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23348: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23643: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23389 CENTRAL HEADER #111   02014B50 (33639248)\n-2338D Created Zip Spec      14 (20) '2.0'\n-2338E Created OS            03 (3) 'Unix'\n-2338F Extract Zip Spec      14 (20) '2.0'\n-23390 Extract OS            00 (0) 'MS-DOS'\n-23391 General Purpose Flag  0800 (2048)\n+23684 CENTRAL HEADER #111   02014B50 (33639248)\n+23688 Created Zip Spec      14 (20) '2.0'\n+23689 Created OS            03 (3) 'Unix'\n+2368A Extract Zip Spec      14 (20) '2.0'\n+2368B Extract OS            00 (0) 'MS-DOS'\n+2368C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23393 Compression Method    0008 (8) 'Deflated'\n-23395 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23399 CRC                   290EDBFF (688839679)\n-2339D Compressed Size       00000040 (64)\n-233A1 Uncompressed Size     00000049 (73)\n-233A5 Filename Length       0052 (82)\n-233A7 Extra Length          0000 (0)\n-233A9 Comment Length        0000 (0)\n-233AB Disk Start            0000 (0)\n-233AD Int File Attributes   0000 (0)\n+2368E Compression Method    0008 (8) 'Deflated'\n+23690 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23694 CRC                   290EDBFF (688839679)\n+23698 Compressed Size       00000040 (64)\n+2369C Uncompressed Size     00000049 (73)\n+236A0 Filename Length       0052 (82)\n+236A2 Extra Length          0000 (0)\n+236A4 Comment Length        0000 (0)\n+236A6 Disk Start            0000 (0)\n+236A8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-233AF Ext File Attributes   81A40000 (2175008768)\n+236AA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-233B3 Local Header Offset   0001FA7A (129658)\n-233B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+236AE Local Header Offset   0001FD79 (130425)\n+236B2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x233B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x236B2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23409 CENTRAL HEADER #112   02014B50 (33639248)\n-2340D Created Zip Spec      14 (20) '2.0'\n-2340E Created OS            03 (3) 'Unix'\n-2340F Extract Zip Spec      14 (20) '2.0'\n-23410 Extract OS            00 (0) 'MS-DOS'\n-23411 General Purpose Flag  0800 (2048)\n+23704 CENTRAL HEADER #112   02014B50 (33639248)\n+23708 Created Zip Spec      14 (20) '2.0'\n+23709 Created OS            03 (3) 'Unix'\n+2370A Extract Zip Spec      14 (20) '2.0'\n+2370B Extract OS            00 (0) 'MS-DOS'\n+2370C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23413 Compression Method    0008 (8) 'Deflated'\n-23415 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23419 CRC                   1BD83592 (467154322)\n-2341D Compressed Size       00000040 (64)\n-23421 Uncompressed Size     00000040 (64)\n-23425 Filename Length       0049 (73)\n-23427 Extra Length          0000 (0)\n-23429 Comment Length        0000 (0)\n-2342B Disk Start            0000 (0)\n-2342D Int File Attributes   0000 (0)\n+2370E Compression Method    0008 (8) 'Deflated'\n+23710 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23714 CRC                   1BD83592 (467154322)\n+23718 Compressed Size       00000040 (64)\n+2371C Uncompressed Size     00000040 (64)\n+23720 Filename Length       0049 (73)\n+23722 Extra Length          0000 (0)\n+23724 Comment Length        0000 (0)\n+23726 Disk Start            0000 (0)\n+23728 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2342F Ext File Attributes   81A40000 (2175008768)\n+2372A Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23433 Local Header Offset   0001FB2A (129834)\n-23437 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2372E Local Header Offset   0001FE29 (130601)\n+23732 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23437: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23732: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23480 CENTRAL HEADER #113   02014B50 (33639248)\n-23484 Created Zip Spec      14 (20) '2.0'\n-23485 Created OS            03 (3) 'Unix'\n-23486 Extract Zip Spec      14 (20) '2.0'\n-23487 Extract OS            00 (0) 'MS-DOS'\n-23488 General Purpose Flag  0800 (2048)\n+2377B CENTRAL HEADER #113   02014B50 (33639248)\n+2377F Created Zip Spec      14 (20) '2.0'\n+23780 Created OS            03 (3) 'Unix'\n+23781 Extract Zip Spec      14 (20) '2.0'\n+23782 Extract OS            00 (0) 'MS-DOS'\n+23783 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2348A Compression Method    0008 (8) 'Deflated'\n-2348C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23490 CRC                   C6FA5A39 (3338295865)\n-23494 Compressed Size       00000044 (68)\n-23498 Uncompressed Size     00000047 (71)\n-2349C Filename Length       0050 (80)\n-2349E Extra Length          0000 (0)\n-234A0 Comment Length        0000 (0)\n-234A2 Disk Start            0000 (0)\n-234A4 Int File Attributes   0000 (0)\n+23785 Compression Method    0008 (8) 'Deflated'\n+23787 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2378B CRC                   C6FA5A39 (3338295865)\n+2378F Compressed Size       00000044 (68)\n+23793 Uncompressed Size     00000047 (71)\n+23797 Filename Length       0050 (80)\n+23799 Extra Length          0000 (0)\n+2379B Comment Length        0000 (0)\n+2379D Disk Start            0000 (0)\n+2379F Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-234A6 Ext File Attributes   81A40000 (2175008768)\n+237A1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-234AA Local Header Offset   0001FBD1 (130001)\n-234AE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+237A5 Local Header Offset   0001FED0 (130768)\n+237A9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x234AE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x237A9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-234FE CENTRAL HEADER #114   02014B50 (33639248)\n-23502 Created Zip Spec      14 (20) '2.0'\n-23503 Created OS            03 (3) 'Unix'\n-23504 Extract Zip Spec      14 (20) '2.0'\n-23505 Extract OS            00 (0) 'MS-DOS'\n-23506 General Purpose Flag  0800 (2048)\n+237F9 CENTRAL HEADER #114   02014B50 (33639248)\n+237FD Created Zip Spec      14 (20) '2.0'\n+237FE Created OS            03 (3) 'Unix'\n+237FF Extract Zip Spec      14 (20) '2.0'\n+23800 Extract OS            00 (0) 'MS-DOS'\n+23801 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23508 Compression Method    0008 (8) 'Deflated'\n-2350A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2350E CRC                   2E8D92A5 (781030053)\n-23512 Compressed Size       000000AF (175)\n-23516 Uncompressed Size     00000238 (568)\n-2351A Filename Length       0052 (82)\n-2351C Extra Length          0000 (0)\n-2351E Comment Length        0000 (0)\n-23520 Disk Start            0000 (0)\n-23522 Int File Attributes   0000 (0)\n+23803 Compression Method    0008 (8) 'Deflated'\n+23805 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23809 CRC                   059BF276 (94106230)\n+2380D Compressed Size       000000B0 (176)\n+23811 Uncompressed Size     0000023E (574)\n+23815 Filename Length       0052 (82)\n+23817 Extra Length          0000 (0)\n+23819 Comment Length        0000 (0)\n+2381B Disk Start            0000 (0)\n+2381D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23524 Ext File Attributes   81A40000 (2175008768)\n+2381F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23528 Local Header Offset   0001FC83 (130179)\n-2352C Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23823 Local Header Offset   0001FF82 (130946)\n+23827 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2352C: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23827: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2357E CENTRAL HEADER #115   02014B50 (33639248)\n-23582 Created Zip Spec      14 (20) '2.0'\n-23583 Created OS            03 (3) 'Unix'\n-23584 Extract Zip Spec      14 (20) '2.0'\n-23585 Extract OS            00 (0) 'MS-DOS'\n-23586 General Purpose Flag  0800 (2048)\n+23879 CENTRAL HEADER #115   02014B50 (33639248)\n+2387D Created Zip Spec      14 (20) '2.0'\n+2387E Created OS            03 (3) 'Unix'\n+2387F Extract Zip Spec      14 (20) '2.0'\n+23880 Extract OS            00 (0) 'MS-DOS'\n+23881 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23588 Compression Method    0008 (8) 'Deflated'\n-2358A Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2358E CRC                   2937F90B (691534091)\n-23592 Compressed Size       0000005F (95)\n-23596 Uncompressed Size     000000B0 (176)\n-2359A Filename Length       005B (91)\n-2359C Extra Length          0000 (0)\n-2359E Comment Length        0000 (0)\n-235A0 Disk Start            0000 (0)\n-235A2 Int File Attributes   0000 (0)\n+23883 Compression Method    0008 (8) 'Deflated'\n+23885 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23889 CRC                   043D8CD3 (71142611)\n+2388D Compressed Size       00000061 (97)\n+23891 Uncompressed Size     000000B1 (177)\n+23895 Filename Length       005B (91)\n+23897 Extra Length          0000 (0)\n+23899 Comment Length        0000 (0)\n+2389B Disk Start            0000 (0)\n+2389D Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-235A4 Ext File Attributes   81A40000 (2175008768)\n+2389F Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-235A8 Local Header Offset   0001FDA2 (130466)\n-235AC Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+238A3 Local Header Offset   000200A2 (131234)\n+238A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x235AC: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x238A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23607 CENTRAL HEADER #116   02014B50 (33639248)\n-2360B Created Zip Spec      14 (20) '2.0'\n-2360C Created OS            03 (3) 'Unix'\n-2360D Extract Zip Spec      14 (20) '2.0'\n-2360E Extract OS            00 (0) 'MS-DOS'\n-2360F General Purpose Flag  0800 (2048)\n+23902 CENTRAL HEADER #116   02014B50 (33639248)\n+23906 Created Zip Spec      14 (20) '2.0'\n+23907 Created OS            03 (3) 'Unix'\n+23908 Extract Zip Spec      14 (20) '2.0'\n+23909 Extract OS            00 (0) 'MS-DOS'\n+2390A General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23611 Compression Method    0008 (8) 'Deflated'\n-23613 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23617 CRC                   A49FCF77 (2761936759)\n-2361B Compressed Size       0000004D (77)\n-2361F Uncompressed Size     00000054 (84)\n-23623 Filename Length       005B (91)\n-23625 Extra Length          0000 (0)\n-23627 Comment Length        0000 (0)\n-23629 Disk Start            0000 (0)\n-2362B Int File Attributes   0000 (0)\n+2390C Compression Method    0008 (8) 'Deflated'\n+2390E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23912 CRC                   A49FCF77 (2761936759)\n+23916 Compressed Size       0000004D (77)\n+2391A Uncompressed Size     00000054 (84)\n+2391E Filename Length       005B (91)\n+23920 Extra Length          0000 (0)\n+23922 Comment Length        0000 (0)\n+23924 Disk Start            0000 (0)\n+23926 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2362D Ext File Attributes   81A40000 (2175008768)\n+23928 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23631 Local Header Offset   0001FE7A (130682)\n-23635 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2392C Local Header Offset   0002017C (131452)\n+23930 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23635: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23930: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23690 CENTRAL HEADER #117   02014B50 (33639248)\n-23694 Created Zip Spec      14 (20) '2.0'\n-23695 Created OS            03 (3) 'Unix'\n-23696 Extract Zip Spec      14 (20) '2.0'\n-23697 Extract OS            00 (0) 'MS-DOS'\n-23698 General Purpose Flag  0800 (2048)\n+2398B CENTRAL HEADER #117   02014B50 (33639248)\n+2398F Created Zip Spec      14 (20) '2.0'\n+23990 Created OS            03 (3) 'Unix'\n+23991 Extract Zip Spec      14 (20) '2.0'\n+23992 Extract OS            00 (0) 'MS-DOS'\n+23993 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-2369A Compression Method    0008 (8) 'Deflated'\n-2369C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-236A0 CRC                   F515114D (4111798605)\n-236A4 Compressed Size       00000049 (73)\n-236A8 Uncompressed Size     00000054 (84)\n-236AC Filename Length       005D (93)\n-236AE Extra Length          0000 (0)\n-236B0 Comment Length        0000 (0)\n-236B2 Disk Start            0000 (0)\n-236B4 Int File Attributes   0000 (0)\n+23995 Compression Method    0008 (8) 'Deflated'\n+23997 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2399B CRC                   F515114D (4111798605)\n+2399F Compressed Size       00000049 (73)\n+239A3 Uncompressed Size     00000054 (84)\n+239A7 Filename Length       005D (93)\n+239A9 Extra Length          0000 (0)\n+239AB Comment Length        0000 (0)\n+239AD Disk Start            0000 (0)\n+239AF Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-236B6 Ext File Attributes   81A40000 (2175008768)\n+239B1 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-236BA Local Header Offset   0001FF40 (130880)\n-236BE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+239B5 Local Header Offset   00020242 (131650)\n+239B9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x236BE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x239B9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-2371B CENTRAL HEADER #118   02014B50 (33639248)\n-2371F Created Zip Spec      14 (20) '2.0'\n-23720 Created OS            03 (3) 'Unix'\n-23721 Extract Zip Spec      14 (20) '2.0'\n-23722 Extract OS            00 (0) 'MS-DOS'\n-23723 General Purpose Flag  0800 (2048)\n+23A16 CENTRAL HEADER #118   02014B50 (33639248)\n+23A1A Created Zip Spec      14 (20) '2.0'\n+23A1B Created OS            03 (3) 'Unix'\n+23A1C Extract Zip Spec      14 (20) '2.0'\n+23A1D Extract OS            00 (0) 'MS-DOS'\n+23A1E General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23725 Compression Method    0008 (8) 'Deflated'\n-23727 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2372B CRC                   285254BA (676484282)\n-2372F Compressed Size       00000045 (69)\n-23733 Uncompressed Size     0000004E (78)\n-23737 Filename Length       0059 (89)\n-23739 Extra Length          0000 (0)\n-2373B Comment Length        0000 (0)\n-2373D Disk Start            0000 (0)\n-2373F Int File Attributes   0000 (0)\n+23A20 Compression Method    0008 (8) 'Deflated'\n+23A22 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23A26 CRC                   285254BA (676484282)\n+23A2A Compressed Size       00000045 (69)\n+23A2E Uncompressed Size     0000004E (78)\n+23A32 Filename Length       0059 (89)\n+23A34 Extra Length          0000 (0)\n+23A36 Comment Length        0000 (0)\n+23A38 Disk Start            0000 (0)\n+23A3A Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23741 Ext File Attributes   81A40000 (2175008768)\n+23A3C Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23745 Local Header Offset   00020004 (131076)\n-23749 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23A40 Local Header Offset   00020306 (131846)\n+23A44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23749: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23A44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-237A2 CENTRAL HEADER #119   02014B50 (33639248)\n-237A6 Created Zip Spec      14 (20) '2.0'\n-237A7 Created OS            03 (3) 'Unix'\n-237A8 Extract Zip Spec      14 (20) '2.0'\n-237A9 Extract OS            00 (0) 'MS-DOS'\n-237AA General Purpose Flag  0800 (2048)\n+23A9D CENTRAL HEADER #119   02014B50 (33639248)\n+23AA1 Created Zip Spec      14 (20) '2.0'\n+23AA2 Created OS            03 (3) 'Unix'\n+23AA3 Extract Zip Spec      14 (20) '2.0'\n+23AA4 Extract OS            00 (0) 'MS-DOS'\n+23AA5 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-237AC Compression Method    0008 (8) 'Deflated'\n-237AE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-237B2 CRC                   9DAB4985 (2645248389)\n-237B6 Compressed Size       0000003E (62)\n-237BA Uncompressed Size     0000004A (74)\n-237BE Filename Length       0056 (86)\n-237C0 Extra Length          0000 (0)\n-237C2 Comment Length        0000 (0)\n-237C4 Disk Start            0000 (0)\n-237C6 Int File Attributes   0000 (0)\n+23AA7 Compression Method    0008 (8) 'Deflated'\n+23AA9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23AAD CRC                   9DAB4985 (2645248389)\n+23AB1 Compressed Size       0000003E (62)\n+23AB5 Uncompressed Size     0000004A (74)\n+23AB9 Filename Length       0056 (86)\n+23ABB Extra Length          0000 (0)\n+23ABD Comment Length        0000 (0)\n+23ABF Disk Start            0000 (0)\n+23AC1 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-237C8 Ext File Attributes   81A40000 (2175008768)\n+23AC3 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-237CC Local Header Offset   000200C0 (131264)\n-237D0 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23AC7 Local Header Offset   000203C2 (132034)\n+23ACB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x237D0: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23ACB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23826 CENTRAL HEADER #120   02014B50 (33639248)\n-2382A Created Zip Spec      14 (20) '2.0'\n-2382B Created OS            03 (3) 'Unix'\n-2382C Extract Zip Spec      14 (20) '2.0'\n-2382D Extract OS            00 (0) 'MS-DOS'\n-2382E General Purpose Flag  0800 (2048)\n+23B21 CENTRAL HEADER #120   02014B50 (33639248)\n+23B25 Created Zip Spec      14 (20) '2.0'\n+23B26 Created OS            03 (3) 'Unix'\n+23B27 Extract Zip Spec      14 (20) '2.0'\n+23B28 Extract OS            00 (0) 'MS-DOS'\n+23B29 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23830 Compression Method    0008 (8) 'Deflated'\n-23832 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23836 CRC                   7DCDDED9 (2110643929)\n-2383A Compressed Size       0000005D (93)\n-2383E Uncompressed Size     000000A4 (164)\n-23842 Filename Length       0035 (53)\n-23844 Extra Length          0000 (0)\n-23846 Comment Length        0000 (0)\n-23848 Disk Start            0000 (0)\n-2384A Int File Attributes   0000 (0)\n+23B2B Compression Method    0008 (8) 'Deflated'\n+23B2D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23B31 CRC                   B5A015DF (3047167455)\n+23B35 Compressed Size       0000005F (95)\n+23B39 Uncompressed Size     000000A5 (165)\n+23B3D Filename Length       0035 (53)\n+23B3F Extra Length          0000 (0)\n+23B41 Comment Length        0000 (0)\n+23B43 Disk Start            0000 (0)\n+23B45 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-2384C Ext File Attributes   81A40000 (2175008768)\n+23B47 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-23850 Local Header Offset   00020172 (131442)\n-23854 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23B4B Local Header Offset   00020474 (132212)\n+23B4F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x23854: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23B4F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23889 CENTRAL HEADER #121   02014B50 (33639248)\n-2388D Created Zip Spec      14 (20) '2.0'\n-2388E Created OS            03 (3) 'Unix'\n-2388F Extract Zip Spec      14 (20) '2.0'\n-23890 Extract OS            00 (0) 'MS-DOS'\n-23891 General Purpose Flag  0800 (2048)\n+23B84 CENTRAL HEADER #121   02014B50 (33639248)\n+23B88 Created Zip Spec      14 (20) '2.0'\n+23B89 Created OS            03 (3) 'Unix'\n+23B8A Extract Zip Spec      14 (20) '2.0'\n+23B8B Extract OS            00 (0) 'MS-DOS'\n+23B8C General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-23893 Compression Method    0008 (8) 'Deflated'\n-23895 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23899 CRC                   050B85C5 (84641221)\n-2389D Compressed Size       000003F2 (1010)\n-238A1 Uncompressed Size     00000CF1 (3313)\n-238A5 Filename Length       003A (58)\n-238A7 Extra Length          0000 (0)\n-238A9 Comment Length        0000 (0)\n-238AB Disk Start            0000 (0)\n-238AD Int File Attributes   0000 (0)\n+23B8E Compression Method    0008 (8) 'Deflated'\n+23B90 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23B94 CRC                   C9D6A7C1 (3386288065)\n+23B98 Compressed Size       000003E9 (1001)\n+23B9C Uncompressed Size     00000C99 (3225)\n+23BA0 Filename Length       003A (58)\n+23BA2 Extra Length          0000 (0)\n+23BA4 Comment Length        0000 (0)\n+23BA6 Disk Start            0000 (0)\n+23BA8 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-238AF Ext File Attributes   81A40000 (2175008768)\n+23BAA Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-238B3 Local Header Offset   00020222 (131618)\n-238B7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23BAE Local Header Offset   00020526 (132390)\n+23BB2 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x238B7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23BB2: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-238F1 CENTRAL HEADER #122   02014B50 (33639248)\n-238F5 Created Zip Spec      14 (20) '2.0'\n-238F6 Created OS            03 (3) 'Unix'\n-238F7 Extract Zip Spec      14 (20) '2.0'\n-238F8 Extract OS            00 (0) 'MS-DOS'\n-238F9 General Purpose Flag  0800 (2048)\n+23BEC CENTRAL HEADER #122   02014B50 (33639248)\n+23BF0 Created Zip Spec      14 (20) '2.0'\n+23BF1 Created OS            03 (3) 'Unix'\n+23BF2 Extract Zip Spec      14 (20) '2.0'\n+23BF3 Extract OS            00 (0) 'MS-DOS'\n+23BF4 General Purpose Flag  0800 (2048)\n       [Bits 1-2]            0 'Normal Compression'\n       [Bit 11]              1 'Language Encoding'\n-238FB Compression Method    0008 (8) 'Deflated'\n-238FD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-23901 CRC                   30325669 (808605289)\n-23905 Compressed Size       00000047 (71)\n-23909 Uncompressed Size     00000049 (73)\n-2390D Filename Length       0041 (65)\n-2390F Extra Length          0000 (0)\n-23911 Comment Length        0000 (0)\n-23913 Disk Start            0000 (0)\n-23915 Int File Attributes   0000 (0)\n+23BF6 Compression Method    0008 (8) 'Deflated'\n+23BF8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+23BFC CRC                   30325669 (808605289)\n+23C00 Compressed Size       00000047 (71)\n+23C04 Uncompressed Size     00000049 (73)\n+23C08 Filename Length       0041 (65)\n+23C0A Extra Length          0000 (0)\n+23C0C Comment Length        0000 (0)\n+23C0E Disk Start            0000 (0)\n+23C10 Int File Attributes   0000 (0)\n       [Bit 0]               0 'Binary Data'\n-23917 Ext File Attributes   81A40000 (2175008768)\n+23C12 Ext File Attributes   81A40000 (2175008768)\n       [Bits 16-24]          01A4 (420) 'Unix attrib: rw-r--r--'\n       [Bits 28-31]          08 (8) 'Regular File'\n-2391B Local Header Offset   0002066C (132716)\n-2391F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+23C16 Local Header Offset   00020967 (133479)\n+23C1A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2391F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x23C1A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-23960 END CENTRAL HEADER    06054B50 (101010256)\n-23964 Number of this disk   0000 (0)\n-23966 Central Dir Disk no   0000 (0)\n-23968 Entries in this disk  007A (122)\n-2396A Total Entries         007A (122)\n-2396C Size of Central Dir   0000324E (12878)\n-23970 Offset to Central Dir 00020712 (132882)\n-23974 Comment Length        0000 (0)\n+23C5B END CENTRAL HEADER    06054B50 (101010256)\n+23C5F Number of this disk   0000 (0)\n+23C61 Central Dir Disk no   0000 (0)\n+23C63 Entries in this disk  007A (122)\n+23C65 Total Entries         007A (122)\n+23C67 Size of Central Dir   0000324E (12878)\n+23C6B Offset to Central Dir 00020A0D (133645)\n+23C6F Comment Length        0000 (0)\n #\n # Error Count: 21\n # Warning Count: 265\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/AddressListener.java", "source2": "org/apache/dubbo/registry/AddressListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,37 +1,37 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.cluster.Directory;\n-\n-import java.util.List;\n-\n-@SPI\n-public interface AddressListener {\n-\n-    /**\n-     * processing when receiving the address list\n-     *\n-     * @param addresses            provider address list\n-     * @param consumerUrl\n-     * @param registryDirectory\n-     */\n-    List<URL> notify(List<URL> addresses, URL consumerUrl, Directory registryDirectory);\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.cluster.Directory;\r\n+\r\n+import java.util.List;\r\n+\r\n+@SPI\r\n+public interface AddressListener {\r\n+\r\n+    /**\r\n+     * processing when receiving the address list\r\n+     *\r\n+     * @param addresses            provider address list\r\n+     * @param consumerUrl\r\n+     * @param registryDirectory\r\n+     */\r\n+    List<URL> notify(List<URL> addresses, URL consumerUrl, Directory registryDirectory);\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/registry/Constants.java", "source2": "org/apache/dubbo/registry/Constants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,96 +1,96 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry;\n-\n-public interface Constants {\n-    String REGISTER_IP_KEY = \"register.ip\";\n-\n-    String REGISTER_KEY = \"register\";\n-\n-    String SUBSCRIBE_KEY = \"subscribe\";\n-\n-    String DEFAULT_REGISTRY = \"dubbo\";\n-\n-    String REGISTER = \"register\";\n-\n-    String UNREGISTER = \"unregister\";\n-\n-    String SUBSCRIBE = \"subscribe\";\n-\n-    String UNSUBSCRIBE = \"unsubscribe\";\n-\n-    String CONFIGURATORS_SUFFIX = \".configurators\";\n-\n-    String ADMIN_PROTOCOL = \"admin\";\n-\n-    String PROVIDER_PROTOCOL = \"provider\";\n-\n-    String CONSUMER_PROTOCOL = \"consumer\";\n-\n-    String SCRIPT_PROTOCOL = \"script\";\n-\n-    String CONDITION_PROTOCOL = \"condition\";\n-    String TRACE_PROTOCOL = \"trace\";\n-    /**\n-     * simple the registry for provider.\n-     *\n-     * @since 2.7.0\n-     */\n-    String SIMPLIFIED_KEY = \"simplified\";\n-\n-    /**\n-     * To decide whether register center saves file synchronously, the default value is asynchronously\n-     */\n-    String REGISTRY_FILESAVE_SYNC_KEY = \"save.file\";\n-\n-    /**\n-     * Whether to cache locally, default is true\n-     */\n-    String REGISTRY__LOCAL_FILE_CACHE_ENABLED = \"file.cache\";\n-\n-    /**\n-     * Reconnection period in milliseconds for register center\n-     */\n-    String REGISTRY_RECONNECT_PERIOD_KEY = \"reconnect.period\";\n-\n-    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\n-\n-    /**\n-     * Default value for the times of retry: 3\n-     */\n-    int DEFAULT_REGISTRY_RETRY_TIMES = 3;\n-\n-    int DEFAULT_REGISTRY_RECONNECT_PERIOD = 3 * 1000;\n-\n-    /**\n-     * Default value for the period of retry interval in milliseconds: 5000\n-     */\n-    int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;\n-\n-    /**\n-     * Most retry times\n-     */\n-    String REGISTRY_RETRY_TIMES_KEY = \"retry.times\";\n-\n-    /**\n-     * Period of registry center's retry interval\n-     */\n-    String REGISTRY_RETRY_PERIOD_KEY = \"retry.period\";\n-\n-    String SESSION_TIMEOUT_KEY = \"session\";\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+public interface Constants {\r\n+    String REGISTER_IP_KEY = \"register.ip\";\r\n+\r\n+    String REGISTER_KEY = \"register\";\r\n+\r\n+    String SUBSCRIBE_KEY = \"subscribe\";\r\n+\r\n+    String DEFAULT_REGISTRY = \"dubbo\";\r\n+\r\n+    String REGISTER = \"register\";\r\n+\r\n+    String UNREGISTER = \"unregister\";\r\n+\r\n+    String SUBSCRIBE = \"subscribe\";\r\n+\r\n+    String UNSUBSCRIBE = \"unsubscribe\";\r\n+\r\n+    String CONFIGURATORS_SUFFIX = \".configurators\";\r\n+\r\n+    String ADMIN_PROTOCOL = \"admin\";\r\n+\r\n+    String PROVIDER_PROTOCOL = \"provider\";\r\n+\r\n+    String CONSUMER_PROTOCOL = \"consumer\";\r\n+\r\n+    String SCRIPT_PROTOCOL = \"script\";\r\n+\r\n+    String CONDITION_PROTOCOL = \"condition\";\r\n+    String TRACE_PROTOCOL = \"trace\";\r\n+    /**\r\n+     * simple the registry for provider.\r\n+     *\r\n+     * @since 2.7.0\r\n+     */\r\n+    String SIMPLIFIED_KEY = \"simplified\";\r\n+\r\n+    /**\r\n+     * To decide whether register center saves file synchronously, the default value is asynchronously\r\n+     */\r\n+    String REGISTRY_FILESAVE_SYNC_KEY = \"save.file\";\r\n+\r\n+    /**\r\n+     * Whether to cache locally, default is true\r\n+     */\r\n+    String REGISTRY__LOCAL_FILE_CACHE_ENABLED = \"file.cache\";\r\n+\r\n+    /**\r\n+     * Reconnection period in milliseconds for register center\r\n+     */\r\n+    String REGISTRY_RECONNECT_PERIOD_KEY = \"reconnect.period\";\r\n+\r\n+    int DEFAULT_SESSION_TIMEOUT = 60 * 1000;\r\n+\r\n+    /**\r\n+     * Default value for the times of retry: 3\r\n+     */\r\n+    int DEFAULT_REGISTRY_RETRY_TIMES = 3;\r\n+\r\n+    int DEFAULT_REGISTRY_RECONNECT_PERIOD = 3 * 1000;\r\n+\r\n+    /**\r\n+     * Default value for the period of retry interval in milliseconds: 5000\r\n+     */\r\n+    int DEFAULT_REGISTRY_RETRY_PERIOD = 5 * 1000;\r\n+\r\n+    /**\r\n+     * Most retry times\r\n+     */\r\n+    String REGISTRY_RETRY_TIMES_KEY = \"retry.times\";\r\n+\r\n+    /**\r\n+     * Period of registry center's retry interval\r\n+     */\r\n+    String REGISTRY_RETRY_PERIOD_KEY = \"retry.period\";\r\n+\r\n+    String SESSION_TIMEOUT_KEY = \"session\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/ListenerRegistryWrapper.java", "source2": "org/apache/dubbo/registry/ListenerRegistryWrapper.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,158 +1,158 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-\n-import java.util.List;\n-\n-public class ListenerRegistryWrapper implements Registry {\n-    private static final Logger logger = LoggerFactory.getLogger(ListenerRegistryWrapper.class);\n-\n-    private final Registry registry;\n-    private final List<RegistryServiceListener> listeners;\n-\n-\n-    public ListenerRegistryWrapper(Registry registry, List<RegistryServiceListener> listeners) {\n-        this.registry = registry;\n-        this.listeners = listeners;\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registry.getUrl();\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return registry.isAvailable();\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        registry.destroy();\n-    }\n-\n-    @Override\n-    public void register(URL url) {\n-        try {\n-            registry.register(url);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener listener : listeners) {\n-                    if (listener != null) {\n-                        try {\n-                            listener.onRegister(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void unregister(URL url) {\n-        try {\n-            registry.unregister(url);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener listener : listeners) {\n-                    if (listener != null) {\n-                        try {\n-                            listener.onUnregister(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void subscribe(URL url, NotifyListener listener) {\n-        try {\n-            registry.subscribe(url, listener);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener registryListener : listeners) {\n-                    if (registryListener != null) {\n-                        try {\n-                            registryListener.onSubscribe(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public void unsubscribe(URL url, NotifyListener listener) {\n-        try {\n-            registry.unsubscribe(url, listener);\n-        } finally {\n-            if (CollectionUtils.isNotEmpty(listeners)) {\n-                RuntimeException exception = null;\n-                for (RegistryServiceListener registryListener : listeners) {\n-                    if (registryListener != null) {\n-                        try {\n-                            registryListener.onUnsubscribe(url);\n-                        } catch (RuntimeException t) {\n-                            logger.error(t.getMessage(), t);\n-                            exception = t;\n-                        }\n-                    }\n-                }\n-                if (exception != null) {\n-                    throw exception;\n-                }\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public List<URL> lookup(URL url) {\n-        return registry.lookup(url);\n-    }\n-\n-    public Registry getRegistry() {\n-        return registry;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+\r\n+import java.util.List;\r\n+\r\n+public class ListenerRegistryWrapper implements Registry {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ListenerRegistryWrapper.class);\r\n+\r\n+    private final Registry registry;\r\n+    private final List<RegistryServiceListener> listeners;\r\n+\r\n+\r\n+    public ListenerRegistryWrapper(Registry registry, List<RegistryServiceListener> listeners) {\r\n+        this.registry = registry;\r\n+        this.listeners = listeners;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registry.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return registry.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        registry.destroy();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void register(URL url) {\r\n+        try {\r\n+            registry.register(url);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener listener : listeners) {\r\n+                    if (listener != null) {\r\n+                        try {\r\n+                            listener.onRegister(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(URL url) {\r\n+        try {\r\n+            registry.unregister(url);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener listener : listeners) {\r\n+                    if (listener != null) {\r\n+                        try {\r\n+                            listener.onUnregister(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void subscribe(URL url, NotifyListener listener) {\r\n+        try {\r\n+            registry.subscribe(url, listener);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener registryListener : listeners) {\r\n+                    if (registryListener != null) {\r\n+                        try {\r\n+                            registryListener.onSubscribe(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unsubscribe(URL url, NotifyListener listener) {\r\n+        try {\r\n+            registry.unsubscribe(url, listener);\r\n+        } finally {\r\n+            if (CollectionUtils.isNotEmpty(listeners)) {\r\n+                RuntimeException exception = null;\r\n+                for (RegistryServiceListener registryListener : listeners) {\r\n+                    if (registryListener != null) {\r\n+                        try {\r\n+                            registryListener.onUnsubscribe(url);\r\n+                        } catch (RuntimeException t) {\r\n+                            logger.error(t.getMessage(), t);\r\n+                            exception = t;\r\n+                        }\r\n+                    }\r\n+                }\r\n+                if (exception != null) {\r\n+                    throw exception;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(URL url) {\r\n+        return registry.lookup(url);\r\n+    }\r\n+\r\n+    public Registry getRegistry() {\r\n+        return registry;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/RegistryFactoryWrapper.java", "source2": "org/apache/dubbo/registry/RegistryFactoryWrapper.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-\n-import java.util.Collections;\n-\n-public class RegistryFactoryWrapper implements RegistryFactory {\n-    private RegistryFactory registryFactory;\n-\n-    public RegistryFactoryWrapper(RegistryFactory registryFactory) {\n-        this.registryFactory = registryFactory;\n-    }\n-\n-    @Override\n-    public Registry getRegistry(URL url) {\n-        return new ListenerRegistryWrapper(registryFactory.getRegistry(url),\n-                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(RegistryServiceListener.class)\n-                        .getActivateExtension(url, \"registry.listeners\")));\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+\r\n+import java.util.Collections;\r\n+\r\n+public class RegistryFactoryWrapper implements RegistryFactory {\r\n+    private RegistryFactory registryFactory;\r\n+\r\n+    public RegistryFactoryWrapper(RegistryFactory registryFactory) {\r\n+        this.registryFactory = registryFactory;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Registry getRegistry(URL url) {\r\n+        return new ListenerRegistryWrapper(registryFactory.getRegistry(url),\r\n+                Collections.unmodifiableList(ExtensionLoader.getExtensionLoader(RegistryServiceListener.class)\r\n+                        .getActivateExtension(url, \"registry.listeners\")));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/RegistryServiceListener.java", "source2": "org/apache/dubbo/registry/RegistryServiceListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,41 +1,41 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-@SPI\n-public interface RegistryServiceListener {\n-    default void onRegister(URL url) {\n-\n-    }\n-\n-\n-    default void onUnregister(URL url) {\n-\n-    }\n-\n-    default void onSubscribe(URL url) {\n-\n-    }\n-\n-    default void onUnsubscribe(URL url) {\n-\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+@SPI\r\n+public interface RegistryServiceListener {\r\n+    default void onRegister(URL url) {\r\n+\r\n+    }\r\n+\r\n+\r\n+    default void onUnregister(URL url) {\r\n+\r\n+    }\r\n+\r\n+    default void onSubscribe(URL url) {\r\n+\r\n+    }\r\n+\r\n+    default void onUnsubscribe(URL url) {\r\n+\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/AbstractServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/AbstractServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,56 +1,56 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.isInstanceUpdated;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.resetInstanceUpdateKey;\n-\n-public abstract class AbstractServiceDiscovery implements ServiceDiscovery {\n-\n-    protected ServiceInstance serviceInstance;\n-\n-    @Override\n-    public ServiceInstance getLocalInstance() {\n-        return serviceInstance;\n-    }\n-\n-    @Override\n-    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\n-        this.serviceInstance = serviceInstance;\n-        doRegister(serviceInstance);\n-    }\n-\n-    /**\n-     * It should be implement in kinds of service discovers.\n-     */\n-    public abstract void doRegister(ServiceInstance serviceInstance);\n-\n-    @Override\n-    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\n-        if (!isInstanceUpdated(serviceInstance)) {\n-            return;\n-        }\n-        this.serviceInstance = serviceInstance;\n-        doUpdate(serviceInstance);\n-        resetInstanceUpdateKey(serviceInstance);\n-    }\n-\n-    /**\n-     * It should be implement in kinds of service discovers.\n-     */\n-    public abstract void doUpdate(ServiceInstance serviceInstance);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.isInstanceUpdated;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.resetInstanceUpdateKey;\r\n+\r\n+public abstract class AbstractServiceDiscovery implements ServiceDiscovery {\r\n+\r\n+    protected ServiceInstance serviceInstance;\r\n+\r\n+    @Override\r\n+    public ServiceInstance getLocalInstance() {\r\n+        return serviceInstance;\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        this.serviceInstance = serviceInstance;\r\n+        doRegister(serviceInstance);\r\n+    }\r\n+\r\n+    /**\r\n+     * It should be implement in kinds of service discovers.\r\n+     */\r\n+    public abstract void doRegister(ServiceInstance serviceInstance);\r\n+\r\n+    @Override\r\n+    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        if (!isInstanceUpdated(serviceInstance)) {\r\n+            return;\r\n+        }\r\n+        this.serviceInstance = serviceInstance;\r\n+        doUpdate(serviceInstance);\r\n+        resetInstanceUpdateKey(serviceInstance);\r\n+    }\r\n+\r\n+    /**\r\n+     * It should be implement in kinds of service discovers.\r\n+     */\r\n+    public abstract void doUpdate(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/AbstractServiceDiscoveryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,42 +1,42 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-/**\n- * Abstract {@link ServiceDiscoveryFactory} implementation with cache, the subclass\n- * should implement {@link #createDiscovery(URL)} method to create an instance of {@link ServiceDiscovery}\n- *\n- * @see ServiceDiscoveryFactory\n- * @since 2.7.5\n- */\n-public abstract class AbstractServiceDiscoveryFactory implements ServiceDiscoveryFactory {\n-\n-    private final ConcurrentMap<String, ServiceDiscovery> discoveries = new ConcurrentHashMap<>();\n-\n-    @Override\n-    public ServiceDiscovery getServiceDiscovery(URL registryURL) {\n-        String key = registryURL.toServiceStringWithoutResolving();\n-        return discoveries.computeIfAbsent(key, k -> createDiscovery(registryURL));\n-    }\n-\n-    protected abstract ServiceDiscovery createDiscovery(URL registryURL);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+/**\r\n+ * Abstract {@link ServiceDiscoveryFactory} implementation with cache, the subclass\r\n+ * should implement {@link #createDiscovery(URL)} method to create an instance of {@link ServiceDiscovery}\r\n+ *\r\n+ * @see ServiceDiscoveryFactory\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class AbstractServiceDiscoveryFactory implements ServiceDiscoveryFactory {\r\n+\r\n+    private final ConcurrentMap<String, ServiceDiscovery> discoveries = new ConcurrentHashMap<>();\r\n+\r\n+    @Override\r\n+    public ServiceDiscovery getServiceDiscovery(URL registryURL) {\r\n+        String key = registryURL.toServiceStringWithoutResolving();\r\n+        return discoveries.computeIfAbsent(key, k -> createDiscovery(registryURL));\r\n+    }\r\n+\r\n+    protected abstract ServiceDiscovery createDiscovery(URL registryURL);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java", "source2": "org/apache/dubbo/registry/client/DefaultRegistryClusterIdentifier.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-\n-public class DefaultRegistryClusterIdentifier implements RegistryClusterIdentifier {\n-    @Override\n-    public String providerKey(URL url) {\n-        return url.getParameter(REGISTRY_CLUSTER_KEY, DEFAULT_KEY);\n-    }\n-\n-    @Override\n-    public String consumerKey(URL url) {\n-        return url.getParameter(REGISTRY_CLUSTER_KEY);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+\r\n+public class DefaultRegistryClusterIdentifier implements RegistryClusterIdentifier {\r\n+    @Override\r\n+    public String providerKey(URL url) {\r\n+        return url.getParameter(REGISTRY_CLUSTER_KEY, DEFAULT_KEY);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String consumerKey(URL url) {\r\n+        return url.getParameter(REGISTRY_CLUSTER_KEY);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/DefaultServiceDiscoveryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,49 +1,49 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * The default {@link SPI} implementation of {@link ServiceDiscoveryFactory} to {@link #getServiceDiscovery(URL) get the\n- * instance of ServiceDiscovery} via the {@link URL#getProtocol() protocol} from the {@link URL} that will connect\n- * the infrastructure of Service registration and discovery. The {@link URL#getProtocol() protocol} will be used as the\n- * extension name by which the {@link ServiceDiscovery} instance is loaded.\n- *\n- * @see AbstractServiceDiscoveryFactory\n- * @see EventPublishingServiceDiscovery\n- * @since 2.7.5\n- */\n-public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-\n-    /**\n-     * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL}\n-     *\n-     * @param registryURL\n-     * @return\n-     */\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        String protocol = registryURL.getProtocol();\n-        ExtensionLoader<ServiceDiscovery> loader = getExtensionLoader(ServiceDiscovery.class);\n-        return loader.getExtension(protocol);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * The default {@link SPI} implementation of {@link ServiceDiscoveryFactory} to {@link #getServiceDiscovery(URL) get the\r\n+ * instance of ServiceDiscovery} via the {@link URL#getProtocol() protocol} from the {@link URL} that will connect\r\n+ * the infrastructure of Service registration and discovery. The {@link URL#getProtocol() protocol} will be used as the\r\n+ * extension name by which the {@link ServiceDiscovery} instance is loaded.\r\n+ *\r\n+ * @see AbstractServiceDiscoveryFactory\r\n+ * @see EventPublishingServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DefaultServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+\r\n+    /**\r\n+     * Create the {@link ServiceDiscovery} by {@link URL#getProtocol() the protocol} from {@link URL connection URL}\r\n+     *\r\n+     * @param registryURL\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        String protocol = registryURL.getProtocol();\r\n+        ExtensionLoader<ServiceDiscovery> loader = getExtensionLoader(ServiceDiscovery.class);\r\n+        return loader.getExtension(protocol);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/DefaultServiceInstance.java", "source2": "org/apache/dubbo/registry/client/DefaultServiceInstance.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,221 +1,221 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.metadata.MetadataInfo;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Objects;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\n-\n-/**\n- * The default implementation of {@link ServiceInstance}.\n- *\n- * @since 2.7.5\n- */\n-public class DefaultServiceInstance implements ServiceInstance {\n-\n-    private static final long serialVersionUID = 1149677083747278100L;\n-\n-    private String id;\n-\n-    private String serviceName;\n-\n-    private String host;\n-\n-    private Integer port;\n-\n-    private boolean enabled;\n-\n-    private boolean healthy;\n-\n-    private Map<String, String> metadata = new HashMap<>();\n-\n-    private transient String address;\n-    private transient MetadataInfo serviceMetadata;\n-    // used at runtime\n-    private transient Map<String, String> extendParams = new HashMap<>();\n-\n-    public DefaultServiceInstance() {\n-    }\n-\n-    public DefaultServiceInstance(String id, String serviceName, String host, Integer port) {\n-        if (port != null && port.intValue() < 1) {\n-            throw new IllegalArgumentException(\"The port must be greater than zero!\");\n-        }\n-        this.id = id;\n-        this.serviceName = serviceName;\n-        this.host = host;\n-        this.port = port;\n-        this.enabled = true;\n-        this.healthy = true;\n-    }\n-\n-    public DefaultServiceInstance(String serviceName, String host, Integer port) {\n-        this(host + \":\" + port, serviceName, host, port);\n-    }\n-\n-    public void setId(String id) {\n-        this.id = id;\n-    }\n-\n-    public void setServiceName(String serviceName) {\n-        this.serviceName = serviceName;\n-    }\n-\n-    public void setHost(String host) {\n-        this.host = host;\n-    }\n-\n-    @Override\n-    public String getId() {\n-        return id;\n-    }\n-\n-    @Override\n-    public String getServiceName() {\n-        return serviceName;\n-    }\n-\n-    @Override\n-    public String getHost() {\n-        return host;\n-    }\n-\n-    public void setPort(Integer port) {\n-        this.port = port;\n-    }\n-\n-    @Override\n-    public Integer getPort() {\n-        return port;\n-    }\n-\n-    @Override\n-    public String getAddress() {\n-        if (address == null) {\n-            address = getAddress(host, port);\n-        }\n-        return address;\n-    }\n-\n-    private static String getAddress(String host, int port) {\n-        return port <= 0 ? host : host + ':' + port;\n-    }\n-\n-    @Override\n-    public boolean isEnabled() {\n-        return enabled;\n-    }\n-\n-    public void setEnabled(boolean enabled) {\n-        this.enabled = enabled;\n-    }\n-\n-    @Override\n-    public boolean isHealthy() {\n-        return healthy;\n-    }\n-\n-    public void setHealthy(boolean healthy) {\n-        this.healthy = healthy;\n-    }\n-\n-    @Override\n-    public Map<String, String> getMetadata() {\n-        return metadata;\n-    }\n-\n-    @Override\n-    public Map<String, String> getExtendParams() {\n-        return extendParams;\n-    }\n-\n-    @Override\n-    public Map<String, String> getAllParams() {\n-        Map<String, String> allParams = new HashMap<>((int) ((metadata.size() + extendParams.size()) / 0.75f + 1));\n-        allParams.putAll(metadata);\n-        allParams.putAll(extendParams);\n-        return allParams;\n-    }\n-\n-    public void setMetadata(Map<String, String> metadata) {\n-        this.metadata = metadata;\n-    }\n-\n-    public MetadataInfo getServiceMetadata() {\n-        return serviceMetadata;\n-    }\n-\n-    public void setServiceMetadata(MetadataInfo serviceMetadata) {\n-        this.serviceMetadata = serviceMetadata;\n-    }\n-\n-    @Override\n-    public InstanceAddressURL toURL() {\n-        return new InstanceAddressURL(this, serviceMetadata);\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof DefaultServiceInstance)) {\n-            return false;\n-        }\n-        DefaultServiceInstance that = (DefaultServiceInstance) o;\n-        boolean equals = Objects.equals(getServiceName(), that.getServiceName()) &&\n-                Objects.equals(getHost(), that.getHost()) &&\n-                Objects.equals(getPort(), that.getPort());\n-        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\n-            if (entry.getKey().equals(REVISION_KEY)) {\n-                continue;\n-            }\n-            equals = equals && entry.getValue().equals(that.getMetadata().get(entry.getKey()));\n-        }\n-\n-        return equals;\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        int result = Objects.hash(getServiceName(), getHost(), getPort());\n-        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\n-            if (entry.getKey().equals(REVISION_KEY)) {\n-                continue;\n-            }\n-            result = 31 * result + (entry.getValue() == null ? 0 : entry.getValue().hashCode());\n-        }\n-        return result;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"DefaultServiceInstance{\" +\n-                \"id='\" + id + '\\'' +\n-                \", serviceName='\" + serviceName + '\\'' +\n-                \", host='\" + host + '\\'' +\n-                \", port=\" + port +\n-                \", enabled=\" + enabled +\n-                \", healthy=\" + healthy +\n-                \", metadata=\" + metadata +\n-                '}';\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REVISION_KEY;\r\n+\r\n+/**\r\n+ * The default implementation of {@link ServiceInstance}.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class DefaultServiceInstance implements ServiceInstance {\r\n+\r\n+    private static final long serialVersionUID = 1149677083747278100L;\r\n+\r\n+    private String id;\r\n+\r\n+    private String serviceName;\r\n+\r\n+    private String host;\r\n+\r\n+    private Integer port;\r\n+\r\n+    private boolean enabled;\r\n+\r\n+    private boolean healthy;\r\n+\r\n+    private Map<String, String> metadata = new HashMap<>();\r\n+\r\n+    private transient String address;\r\n+    private transient MetadataInfo serviceMetadata;\r\n+    // used at runtime\r\n+    private transient Map<String, String> extendParams = new HashMap<>();\r\n+\r\n+    public DefaultServiceInstance() {\r\n+    }\r\n+\r\n+    public DefaultServiceInstance(String id, String serviceName, String host, Integer port) {\r\n+        if (port != null && port.intValue() < 1) {\r\n+            throw new IllegalArgumentException(\"The port must be greater than zero!\");\r\n+        }\r\n+        this.id = id;\r\n+        this.serviceName = serviceName;\r\n+        this.host = host;\r\n+        this.port = port;\r\n+        this.enabled = true;\r\n+        this.healthy = true;\r\n+    }\r\n+\r\n+    public DefaultServiceInstance(String serviceName, String host, Integer port) {\r\n+        this(host + \":\" + port, serviceName, host, port);\r\n+    }\r\n+\r\n+    public void setId(String id) {\r\n+        this.id = id;\r\n+    }\r\n+\r\n+    public void setServiceName(String serviceName) {\r\n+        this.serviceName = serviceName;\r\n+    }\r\n+\r\n+    public void setHost(String host) {\r\n+        this.host = host;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getId() {\r\n+        return id;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceName() {\r\n+        return serviceName;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHost() {\r\n+        return host;\r\n+    }\r\n+\r\n+    public void setPort(Integer port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Integer getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAddress() {\r\n+        if (address == null) {\r\n+            address = getAddress(host, port);\r\n+        }\r\n+        return address;\r\n+    }\r\n+\r\n+    private static String getAddress(String host, int port) {\r\n+        return port <= 0 ? host : host + ':' + port;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isEnabled() {\r\n+        return enabled;\r\n+    }\r\n+\r\n+    public void setEnabled(boolean enabled) {\r\n+        this.enabled = enabled;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isHealthy() {\r\n+        return healthy;\r\n+    }\r\n+\r\n+    public void setHealthy(boolean healthy) {\r\n+        this.healthy = healthy;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getMetadata() {\r\n+        return metadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getExtendParams() {\r\n+        return extendParams;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getAllParams() {\r\n+        Map<String, String> allParams = new HashMap<>((int) ((metadata.size() + extendParams.size()) / 0.75f + 1));\r\n+        allParams.putAll(metadata);\r\n+        allParams.putAll(extendParams);\r\n+        return allParams;\r\n+    }\r\n+\r\n+    public void setMetadata(Map<String, String> metadata) {\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    public MetadataInfo getServiceMetadata() {\r\n+        return serviceMetadata;\r\n+    }\r\n+\r\n+    public void setServiceMetadata(MetadataInfo serviceMetadata) {\r\n+        this.serviceMetadata = serviceMetadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public InstanceAddressURL toURL() {\r\n+        return new InstanceAddressURL(this, serviceMetadata);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object o) {\r\n+        if (this == o) {\r\n+            return true;\r\n+        }\r\n+        if (!(o instanceof DefaultServiceInstance)) {\r\n+            return false;\r\n+        }\r\n+        DefaultServiceInstance that = (DefaultServiceInstance) o;\r\n+        boolean equals = Objects.equals(getServiceName(), that.getServiceName()) &&\r\n+                Objects.equals(getHost(), that.getHost()) &&\r\n+                Objects.equals(getPort(), that.getPort());\r\n+        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\r\n+            if (entry.getKey().equals(REVISION_KEY)) {\r\n+                continue;\r\n+            }\r\n+            equals = equals && entry.getValue().equals(that.getMetadata().get(entry.getKey()));\r\n+        }\r\n+\r\n+        return equals;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        int result = Objects.hash(getServiceName(), getHost(), getPort());\r\n+        for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {\r\n+            if (entry.getKey().equals(REVISION_KEY)) {\r\n+                continue;\r\n+            }\r\n+            result = 31 * result + (entry.getValue() == null ? 0 : entry.getValue().hashCode());\r\n+        }\r\n+        return result;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"DefaultServiceInstance{\" +\r\n+                \"id='\" + id + '\\'' +\r\n+                \", serviceName='\" + serviceName + '\\'' +\r\n+                \", host='\" + host + '\\'' +\r\n+                \", port=\" + port +\r\n+                \", enabled=\" + enabled +\r\n+                \", healthy=\" + healthy +\r\n+                \", metadata=\" + metadata +\r\n+                '}';\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/EventPublishingServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,315 +1,315 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.function.ThrowableAction;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.Page;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryExceptionEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Optional;\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-import static java.util.Optional.empty;\n-import static java.util.Optional.of;\n-\n-/**\n- * The decorating implementation of {@link ServiceDiscovery} to published the {@link Event Dubbo event} when some actions are\n- * executing, including:\n- * <ul>\n- * <li>Lifecycle actions:</li>\n- * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\n- * <thead>\n- * <tr>\n- * <th>Action</th>\n- * <th>before</th>\n- * <th>After</th>\n- * </tr>\n- * </thead>\n- * <tbody>\n- * <tr>\n- * <td>{@link #INITIALIZE_ACTION start}</td>\n- * <td>{@link ServiceDiscoveryInitializingEvent}</td>\n- * <td>{@link ServiceDiscoveryInitializedEvent}</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #DESTROY_ACTION stop}</td>\n- * <td>{@link ServiceDiscoveryDestroyingEvent}</td>\n- * <td>{@link ServiceDiscoveryDestroyedEvent}</td>\n- * </tr>\n- * </tbody>\n- * </table>\n- * <li>Registration actions:</li>\n- * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\n- * <thead>\n- * <tr>\n- * <th>Action</th>\n- * <th>before</th>\n- * <th>After</th>\n- * </tr>\n- * </thead>\n- * <tbody>\n- * <tr>\n- * <td>{@link #REGISTER_ACTION register}</td>\n- * <td>{@link ServiceInstancePreRegisteredEvent}</td>\n- * <td>{@link ServiceInstanceRegisteredEvent}</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #UPDATE_ACTION update}</td>\n- * <td>N/A</td>\n- * <td>N/A</td>\n- * </tr>\n- * <tr>\n- * <td>{@link #UNREGISTER_ACTION unregister}</td>\n- * <td>N/A</td>\n- * <td>N/A</td>\n- * </tr>\n- * </tbody>\n- * </table>\n- * </ul>\n- *\n- * @see ServiceDiscovery\n- * @see ServiceDiscoveryInitializingEvent\n- * @see ServiceDiscoveryInitializedEvent\n- * @see ServiceInstancePreRegisteredEvent\n- * @see ServiceInstanceRegisteredEvent\n- * @see ServiceDiscoveryDestroyingEvent\n- * @see ServiceDiscoveryDestroyedEvent\n- * @since 2.7.5\n- */\n-final class EventPublishingServiceDiscovery implements ServiceDiscovery {\n-\n-    /**\n-     * @see ServiceInstancePreRegisteredEvent\n-     * @see ServiceInstanceRegisteredEvent\n-     */\n-    protected static final String REGISTER_ACTION = \"register\";\n-\n-    protected static final String UPDATE_ACTION = \"update\";\n-\n-    protected static final String UNREGISTER_ACTION = \"unregister\";\n-\n-    /**\n-     * @see ServiceDiscoveryInitializingEvent\n-     * @see ServiceDiscoveryInitializedEvent\n-     */\n-    protected static final String INITIALIZE_ACTION = \"initialize\";\n-\n-    /**\n-     * @see ServiceDiscoveryDestroyingEvent\n-     * @see ServiceDiscoveryDestroyedEvent\n-     */\n-    protected static final String DESTROY_ACTION = \"destroy\";\n-\n-    protected final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\n-\n-    protected final AtomicBoolean initialized = new AtomicBoolean(false);\n-\n-    protected final AtomicBoolean destroyed = new AtomicBoolean(false);\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final ServiceDiscovery serviceDiscovery;\n-\n-    protected EventPublishingServiceDiscovery(ServiceDiscovery serviceDiscovery) {\n-        if (serviceDiscovery == null) {\n-            throw new NullPointerException(\"The ServiceDiscovery argument must not be null!\");\n-        }\n-        this.serviceDiscovery = serviceDiscovery;\n-    }\n-\n-    @Override\n-    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(REGISTER_ACTION);\n-        assertInitialized(REGISTER_ACTION);\n-\n-        executeWithEvents(\n-                of(new ServiceInstancePreRegisteredEvent(serviceDiscovery, serviceInstance)),\n-                () -> serviceDiscovery.register(serviceInstance),\n-                of(new ServiceInstanceRegisteredEvent(serviceDiscovery, serviceInstance))\n-        );\n-    }\n-\n-    @Override\n-    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(UPDATE_ACTION);\n-        assertInitialized(UPDATE_ACTION);\n-\n-        executeWithEvents(\n-                empty(),\n-                () -> serviceDiscovery.update(serviceInstance),\n-                empty()\n-        );\n-    }\n-\n-    @Override\n-    public final void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-\n-        assertDestroyed(UNREGISTER_ACTION);\n-        assertInitialized(UNREGISTER_ACTION);\n-\n-        executeWithEvents(\n-                of(new ServiceInstancePreUnregisteredEvent(this, serviceInstance)),\n-                () -> serviceDiscovery.unregister(serviceInstance),\n-                of(new ServiceInstanceUnregisteredEvent(this, serviceInstance))\n-        );\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return serviceDiscovery.getServices();\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-        return serviceDiscovery.getInstances(serviceName);\n-    }\n-\n-    @Override\n-    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceName, offset, pageSize);\n-    }\n-\n-    @Override\n-    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceName, offset, pageSize, healthyOnly);\n-    }\n-\n-    @Override\n-    public Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws NullPointerException, IllegalArgumentException {\n-        return serviceDiscovery.getInstances(serviceNames, offset, requestSize);\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return serviceDiscovery.toString();\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\n-        serviceDiscovery.addServiceInstancesChangedListener(listener);\n-        eventDispatcher.addEventListener(listener);\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return serviceDiscovery.getUrl();\n-    }\n-\n-    @Override\n-    public ServiceInstance getLocalInstance() {\n-        return serviceDiscovery.getLocalInstance();\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) {\n-\n-        assertInitialized(INITIALIZE_ACTION);\n-\n-        if (isInitialized()) {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"It's ignored to start current ServiceDiscovery, because it has been started.\");\n-            }\n-            return;\n-        }\n-\n-        executeWithEvents(\n-                of(new ServiceDiscoveryInitializingEvent(this, serviceDiscovery)),\n-                () -> serviceDiscovery.initialize(registryURL),\n-                of(new ServiceDiscoveryInitializedEvent(this, serviceDiscovery))\n-        );\n-\n-        // doesn't start -> started\n-        initialized.compareAndSet(false, true);\n-    }\n-\n-    @Override\n-    public void destroy() {\n-\n-        assertDestroyed(DESTROY_ACTION);\n-\n-        if (isDestroyed()) {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"It's ignored to stop current ServiceDiscovery, because it has been stopped.\");\n-            }\n-            return;\n-        }\n-\n-        executeWithEvents(\n-                of(new ServiceDiscoveryDestroyingEvent(this, serviceDiscovery)),\n-                serviceDiscovery::destroy,\n-                of(new ServiceDiscoveryDestroyedEvent(this, serviceDiscovery))\n-        );\n-\n-        // doesn't stop -> stopped\n-        destroyed.compareAndSet(false, true);\n-    }\n-\n-    protected final void executeWithEvents(Optional<? extends Event> beforeEvent,\n-                                           ThrowableAction action,\n-                                           Optional<? extends Event> afterEvent) {\n-        beforeEvent.ifPresent(this::dispatchEvent);\n-        try {\n-            action.execute();\n-        } catch (Throwable e) {\n-            dispatchEvent(new ServiceDiscoveryExceptionEvent(this, serviceDiscovery, e));\n-        }\n-        afterEvent.ifPresent(this::dispatchEvent);\n-    }\n-\n-    private void dispatchEvent(Event event) {\n-        eventDispatcher.dispatch(event);\n-    }\n-\n-    public final boolean isInitialized() {\n-        return initialized.get();\n-    }\n-\n-    public final boolean isDestroyed() {\n-        return destroyed.get();\n-    }\n-\n-    protected void assertDestroyed(String action) throws IllegalStateException {\n-        if (!isInitialized()) {\n-            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is not initialized yet.\");\n-        }\n-    }\n-\n-    protected void assertInitialized(String action) throws IllegalStateException {\n-        if (isDestroyed()) {\n-            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is destroyed already.\");\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.function.ThrowableAction;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.Page;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryExceptionEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+import static java.util.Optional.empty;\r\n+import static java.util.Optional.of;\r\n+\r\n+/**\r\n+ * The decorating implementation of {@link ServiceDiscovery} to published the {@link Event Dubbo event} when some actions are\r\n+ * executing, including:\r\n+ * <ul>\r\n+ * <li>Lifecycle actions:</li>\r\n+ * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\r\n+ * <thead>\r\n+ * <tr>\r\n+ * <th>Action</th>\r\n+ * <th>before</th>\r\n+ * <th>After</th>\r\n+ * </tr>\r\n+ * </thead>\r\n+ * <tbody>\r\n+ * <tr>\r\n+ * <td>{@link #INITIALIZE_ACTION start}</td>\r\n+ * <td>{@link ServiceDiscoveryInitializingEvent}</td>\r\n+ * <td>{@link ServiceDiscoveryInitializedEvent}</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #DESTROY_ACTION stop}</td>\r\n+ * <td>{@link ServiceDiscoveryDestroyingEvent}</td>\r\n+ * <td>{@link ServiceDiscoveryDestroyedEvent}</td>\r\n+ * </tr>\r\n+ * </tbody>\r\n+ * </table>\r\n+ * <li>Registration actions:</li>\r\n+ * <table cellpadding=\"0\" cellspacing=\"0\" border=\"1\">\r\n+ * <thead>\r\n+ * <tr>\r\n+ * <th>Action</th>\r\n+ * <th>before</th>\r\n+ * <th>After</th>\r\n+ * </tr>\r\n+ * </thead>\r\n+ * <tbody>\r\n+ * <tr>\r\n+ * <td>{@link #REGISTER_ACTION register}</td>\r\n+ * <td>{@link ServiceInstancePreRegisteredEvent}</td>\r\n+ * <td>{@link ServiceInstanceRegisteredEvent}</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #UPDATE_ACTION update}</td>\r\n+ * <td>N/A</td>\r\n+ * <td>N/A</td>\r\n+ * </tr>\r\n+ * <tr>\r\n+ * <td>{@link #UNREGISTER_ACTION unregister}</td>\r\n+ * <td>N/A</td>\r\n+ * <td>N/A</td>\r\n+ * </tr>\r\n+ * </tbody>\r\n+ * </table>\r\n+ * </ul>\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see ServiceDiscoveryInitializingEvent\r\n+ * @see ServiceDiscoveryInitializedEvent\r\n+ * @see ServiceInstancePreRegisteredEvent\r\n+ * @see ServiceInstanceRegisteredEvent\r\n+ * @see ServiceDiscoveryDestroyingEvent\r\n+ * @see ServiceDiscoveryDestroyedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+final class EventPublishingServiceDiscovery implements ServiceDiscovery {\r\n+\r\n+    /**\r\n+     * @see ServiceInstancePreRegisteredEvent\r\n+     * @see ServiceInstanceRegisteredEvent\r\n+     */\r\n+    protected static final String REGISTER_ACTION = \"register\";\r\n+\r\n+    protected static final String UPDATE_ACTION = \"update\";\r\n+\r\n+    protected static final String UNREGISTER_ACTION = \"unregister\";\r\n+\r\n+    /**\r\n+     * @see ServiceDiscoveryInitializingEvent\r\n+     * @see ServiceDiscoveryInitializedEvent\r\n+     */\r\n+    protected static final String INITIALIZE_ACTION = \"initialize\";\r\n+\r\n+    /**\r\n+     * @see ServiceDiscoveryDestroyingEvent\r\n+     * @see ServiceDiscoveryDestroyedEvent\r\n+     */\r\n+    protected static final String DESTROY_ACTION = \"destroy\";\r\n+\r\n+    protected final EventDispatcher eventDispatcher = EventDispatcher.getDefaultExtension();\r\n+\r\n+    protected final AtomicBoolean initialized = new AtomicBoolean(false);\r\n+\r\n+    protected final AtomicBoolean destroyed = new AtomicBoolean(false);\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+\r\n+    protected EventPublishingServiceDiscovery(ServiceDiscovery serviceDiscovery) {\r\n+        if (serviceDiscovery == null) {\r\n+            throw new NullPointerException(\"The ServiceDiscovery argument must not be null!\");\r\n+        }\r\n+        this.serviceDiscovery = serviceDiscovery;\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(REGISTER_ACTION);\r\n+        assertInitialized(REGISTER_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceInstancePreRegisteredEvent(serviceDiscovery, serviceInstance)),\r\n+                () -> serviceDiscovery.register(serviceInstance),\r\n+                of(new ServiceInstanceRegisteredEvent(serviceDiscovery, serviceInstance))\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void update(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(UPDATE_ACTION);\r\n+        assertInitialized(UPDATE_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                empty(),\r\n+                () -> serviceDiscovery.update(serviceInstance),\r\n+                empty()\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+\r\n+        assertDestroyed(UNREGISTER_ACTION);\r\n+        assertInitialized(UNREGISTER_ACTION);\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceInstancePreUnregisteredEvent(this, serviceInstance)),\r\n+                () -> serviceDiscovery.unregister(serviceInstance),\r\n+                of(new ServiceInstanceUnregisteredEvent(this, serviceInstance))\r\n+        );\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return serviceDiscovery.getServices();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+        return serviceDiscovery.getInstances(serviceName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceName, offset, pageSize);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceName, offset, pageSize, healthyOnly);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws NullPointerException, IllegalArgumentException {\r\n+        return serviceDiscovery.getInstances(serviceNames, offset, requestSize);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return serviceDiscovery.toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\r\n+        serviceDiscovery.addServiceInstancesChangedListener(listener);\r\n+        eventDispatcher.addEventListener(listener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return serviceDiscovery.getUrl();\r\n+    }\r\n+\r\n+    @Override\r\n+    public ServiceInstance getLocalInstance() {\r\n+        return serviceDiscovery.getLocalInstance();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) {\r\n+\r\n+        assertInitialized(INITIALIZE_ACTION);\r\n+\r\n+        if (isInitialized()) {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"It's ignored to start current ServiceDiscovery, because it has been started.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceDiscoveryInitializingEvent(this, serviceDiscovery)),\r\n+                () -> serviceDiscovery.initialize(registryURL),\r\n+                of(new ServiceDiscoveryInitializedEvent(this, serviceDiscovery))\r\n+        );\r\n+\r\n+        // doesn't start -> started\r\n+        initialized.compareAndSet(false, true);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+\r\n+        assertDestroyed(DESTROY_ACTION);\r\n+\r\n+        if (isDestroyed()) {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"It's ignored to stop current ServiceDiscovery, because it has been stopped.\");\r\n+            }\r\n+            return;\r\n+        }\r\n+\r\n+        executeWithEvents(\r\n+                of(new ServiceDiscoveryDestroyingEvent(this, serviceDiscovery)),\r\n+                serviceDiscovery::destroy,\r\n+                of(new ServiceDiscoveryDestroyedEvent(this, serviceDiscovery))\r\n+        );\r\n+\r\n+        // doesn't stop -> stopped\r\n+        destroyed.compareAndSet(false, true);\r\n+    }\r\n+\r\n+    protected final void executeWithEvents(Optional<? extends Event> beforeEvent,\r\n+                                           ThrowableAction action,\r\n+                                           Optional<? extends Event> afterEvent) {\r\n+        beforeEvent.ifPresent(this::dispatchEvent);\r\n+        try {\r\n+            action.execute();\r\n+        } catch (Throwable e) {\r\n+            dispatchEvent(new ServiceDiscoveryExceptionEvent(this, serviceDiscovery, e));\r\n+        }\r\n+        afterEvent.ifPresent(this::dispatchEvent);\r\n+    }\r\n+\r\n+    private void dispatchEvent(Event event) {\r\n+        eventDispatcher.dispatch(event);\r\n+    }\r\n+\r\n+    public final boolean isInitialized() {\r\n+        return initialized.get();\r\n+    }\r\n+\r\n+    public final boolean isDestroyed() {\r\n+        return destroyed.get();\r\n+    }\r\n+\r\n+    protected void assertDestroyed(String action) throws IllegalStateException {\r\n+        if (!isInitialized()) {\r\n+            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is not initialized yet.\");\r\n+        }\r\n+    }\r\n+\r\n+    protected void assertInitialized(String action) throws IllegalStateException {\r\n+        if (isDestroyed()) {\r\n+            throw new IllegalStateException(\"The action[\" + action + \"] is rejected, because the ServiceDiscovery is destroyed already.\");\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/FileSystemServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,221 +1,221 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\n-import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-\n-import com.alibaba.fastjson.JSON;\n-import org.apache.commons.io.FileUtils;\n-\n-import java.io.File;\n-import java.io.IOException;\n-import java.nio.channels.FileChannel;\n-import java.nio.channels.FileLock;\n-import java.nio.file.LinkOption;\n-import java.nio.file.Path;\n-import java.nio.file.StandardOpenOption;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.stream.Collectors;\n-\n-import static com.alibaba.fastjson.JSON.toJSONString;\n-import static java.lang.String.format;\n-import static java.nio.channels.FileChannel.open;\n-import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_GROUP;\n-import static org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration.CONFIG_CENTER_DIR_PARAM_NAME;\n-\n-/**\n- * File System {@link ServiceDiscovery} implementation\n- *\n- * @see FileSystemDynamicConfiguration\n- * @since 2.7.5\n- */\n-public class FileSystemServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final Map<File, FileLock> fileLocksCache = new ConcurrentHashMap<>();\n-\n-    private FileSystemDynamicConfiguration dynamicConfiguration;\n-\n-    @Override\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-\n-    }\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        dynamicConfiguration = createDynamicConfiguration(registryURL);\n-        registerDubboShutdownHook();\n-        registerListener();\n-    }\n-\n-    private void registerDubboShutdownHook() {\n-        ShutdownHookCallbacks.INSTANCE.addCallback(this::destroy);\n-    }\n-\n-    private void registerListener() {\n-        getServices().forEach(serviceName -> {\n-            dynamicConfiguration.getConfigKeys(DEFAULT_GROUP).forEach(serviceInstanceId -> {\n-                dynamicConfiguration.addListener(serviceInstanceId, serviceName, this::onConfigChanged);\n-            });\n-        });\n-    }\n-\n-    public void onConfigChanged(ConfigChangedEvent event) {\n-\n-    }\n-\n-    @Override\n-    public void destroy() throws Exception {\n-        dynamicConfiguration.close();\n-        releaseAndRemoveRegistrationFiles();\n-    }\n-\n-    private void releaseAndRemoveRegistrationFiles() {\n-        fileLocksCache.keySet().forEach(file -> {\n-            releaseFileLock(file);\n-            removeFile(file);\n-        });\n-    }\n-\n-    private void removeFile(File file) {\n-        FileUtils.deleteQuietly(file);\n-    }\n-\n-    private String getServiceInstanceId(ServiceInstance serviceInstance) {\n-        String id = serviceInstance.getId();\n-        if (StringUtils.isBlank(id)) {\n-            return serviceInstance.getHost() + \".\" + serviceInstance.getPort();\n-        }\n-        return id;\n-    }\n-\n-    private String getServiceName(ServiceInstance serviceInstance) {\n-        return serviceInstance.getServiceName();\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) {\n-        return dynamicConfiguration.getConfigKeys(DEFAULT_GROUP)\n-                .stream()\n-                .map(serviceInstanceId -> dynamicConfiguration.getConfig(serviceInstanceId, serviceName))\n-                .map(content -> JSON.parseObject(content, DefaultServiceInstance.class))\n-                .collect(Collectors.toList());\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return null;\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        String serviceInstanceId = getServiceInstanceId(serviceInstance);\n-        String serviceName = getServiceName(serviceInstance);\n-        String content = toJSONString(serviceInstance);\n-        if (dynamicConfiguration.publishConfig(serviceInstanceId, serviceName, content)) {\n-            lockFile(serviceInstanceId, serviceName);\n-        }\n-    }\n-\n-    private void lockFile(String serviceInstanceId, String serviceName) {\n-        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\n-        Path serviceInstanceFilePath = serviceInstanceFile.toPath();\n-\n-        fileLocksCache.computeIfAbsent(serviceInstanceFile, file -> {\n-            FileLock fileLock = null;\n-            try {\n-                FileChannel fileChannel = open(serviceInstanceFilePath, StandardOpenOption.READ, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS);\n-                fileLock = fileChannel.tryLock();\n-            } catch (IOException e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e.getMessage(), e);\n-                }\n-            }\n-            if (fileLock != null) {\n-                if (logger.isInfoEnabled()) {\n-                    logger.info(format(\"%s has been locked\", serviceInstanceFilePath.toAbsolutePath()));\n-                }\n-            }\n-            return fileLock;\n-        });\n-    }\n-\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        register(serviceInstance);\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        String key = getServiceInstanceId(serviceInstance);\n-        String group = getServiceName(serviceInstance);\n-        releaseFileLock(key, group);\n-        dynamicConfiguration.removeConfig(key, group);\n-    }\n-\n-    private void releaseFileLock(String serviceInstanceId, String serviceName) {\n-        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\n-        releaseFileLock(serviceInstanceFile);\n-    }\n-\n-    private void releaseFileLock(File serviceInstanceFile) {\n-        fileLocksCache.computeIfPresent(serviceInstanceFile, (f, fileLock) -> {\n-            releaseFileLock(fileLock);\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The file[%s] has been released\", serviceInstanceFile.getAbsolutePath()));\n-            }\n-            return null;\n-        });\n-    }\n-\n-    private void releaseFileLock(FileLock fileLock) {\n-        try (FileChannel fileChannel = fileLock.channel()) {\n-            fileLock.release();\n-        } catch (IOException e) {\n-            if (logger.isErrorEnabled()) {\n-                logger.error(e.getMessage(), e);\n-            }\n-        }\n-    }\n-\n-    private File serviceInstanceFile(String serviceInstanceId, String serviceName) {\n-        return dynamicConfiguration.configFile(serviceInstanceId, serviceName);\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        return dynamicConfiguration.getConfigGroups();\n-    }\n-\n-    private static FileSystemDynamicConfiguration createDynamicConfiguration(URL connectionURL) {\n-        String path = System.getProperty(\"user.home\") + File.separator + \".dubbo\" + File.separator + \"registry\";\n-        return new FileSystemDynamicConfiguration(connectionURL.addParameter(CONFIG_CENTER_DIR_PARAM_NAME, path));\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration;\r\n+import org.apache.dubbo.common.lang.ShutdownHookCallbacks;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+import org.apache.commons.io.FileUtils;\r\n+\r\n+import java.io.File;\r\n+import java.io.IOException;\r\n+import java.nio.channels.FileChannel;\r\n+import java.nio.channels.FileLock;\r\n+import java.nio.file.LinkOption;\r\n+import java.nio.file.Path;\r\n+import java.nio.file.StandardOpenOption;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static com.alibaba.fastjson.JSON.toJSONString;\r\n+import static java.lang.String.format;\r\n+import static java.nio.channels.FileChannel.open;\r\n+import static org.apache.dubbo.common.config.configcenter.DynamicConfiguration.DEFAULT_GROUP;\r\n+import static org.apache.dubbo.common.config.configcenter.file.FileSystemDynamicConfiguration.CONFIG_CENTER_DIR_PARAM_NAME;\r\n+\r\n+/**\r\n+ * File System {@link ServiceDiscovery} implementation\r\n+ *\r\n+ * @see FileSystemDynamicConfiguration\r\n+ * @since 2.7.5\r\n+ */\r\n+public class FileSystemServiceDiscovery extends AbstractServiceDiscovery implements EventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final Map<File, FileLock> fileLocksCache = new ConcurrentHashMap<>();\r\n+\r\n+    private FileSystemDynamicConfiguration dynamicConfiguration;\r\n+\r\n+    @Override\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        dynamicConfiguration = createDynamicConfiguration(registryURL);\r\n+        registerDubboShutdownHook();\r\n+        registerListener();\r\n+    }\r\n+\r\n+    private void registerDubboShutdownHook() {\r\n+        ShutdownHookCallbacks.INSTANCE.addCallback(this::destroy);\r\n+    }\r\n+\r\n+    private void registerListener() {\r\n+        getServices().forEach(serviceName -> {\r\n+            dynamicConfiguration.getConfigKeys(DEFAULT_GROUP).forEach(serviceInstanceId -> {\r\n+                dynamicConfiguration.addListener(serviceInstanceId, serviceName, this::onConfigChanged);\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    public void onConfigChanged(ConfigChangedEvent event) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws Exception {\r\n+        dynamicConfiguration.close();\r\n+        releaseAndRemoveRegistrationFiles();\r\n+    }\r\n+\r\n+    private void releaseAndRemoveRegistrationFiles() {\r\n+        fileLocksCache.keySet().forEach(file -> {\r\n+            releaseFileLock(file);\r\n+            removeFile(file);\r\n+        });\r\n+    }\r\n+\r\n+    private void removeFile(File file) {\r\n+        FileUtils.deleteQuietly(file);\r\n+    }\r\n+\r\n+    private String getServiceInstanceId(ServiceInstance serviceInstance) {\r\n+        String id = serviceInstance.getId();\r\n+        if (StringUtils.isBlank(id)) {\r\n+            return serviceInstance.getHost() + \".\" + serviceInstance.getPort();\r\n+        }\r\n+        return id;\r\n+    }\r\n+\r\n+    private String getServiceName(ServiceInstance serviceInstance) {\r\n+        return serviceInstance.getServiceName();\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) {\r\n+        return dynamicConfiguration.getConfigKeys(DEFAULT_GROUP)\r\n+                .stream()\r\n+                .map(serviceInstanceId -> dynamicConfiguration.getConfig(serviceInstanceId, serviceName))\r\n+                .map(content -> JSON.parseObject(content, DefaultServiceInstance.class))\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        String serviceInstanceId = getServiceInstanceId(serviceInstance);\r\n+        String serviceName = getServiceName(serviceInstance);\r\n+        String content = toJSONString(serviceInstance);\r\n+        if (dynamicConfiguration.publishConfig(serviceInstanceId, serviceName, content)) {\r\n+            lockFile(serviceInstanceId, serviceName);\r\n+        }\r\n+    }\r\n+\r\n+    private void lockFile(String serviceInstanceId, String serviceName) {\r\n+        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\r\n+        Path serviceInstanceFilePath = serviceInstanceFile.toPath();\r\n+\r\n+        fileLocksCache.computeIfAbsent(serviceInstanceFile, file -> {\r\n+            FileLock fileLock = null;\r\n+            try {\r\n+                FileChannel fileChannel = open(serviceInstanceFilePath, StandardOpenOption.READ, StandardOpenOption.WRITE, LinkOption.NOFOLLOW_LINKS);\r\n+                fileLock = fileChannel.tryLock();\r\n+            } catch (IOException e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e.getMessage(), e);\r\n+                }\r\n+            }\r\n+            if (fileLock != null) {\r\n+                if (logger.isInfoEnabled()) {\r\n+                    logger.info(format(\"%s has been locked\", serviceInstanceFilePath.toAbsolutePath()));\r\n+                }\r\n+            }\r\n+            return fileLock;\r\n+        });\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        register(serviceInstance);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        String key = getServiceInstanceId(serviceInstance);\r\n+        String group = getServiceName(serviceInstance);\r\n+        releaseFileLock(key, group);\r\n+        dynamicConfiguration.removeConfig(key, group);\r\n+    }\r\n+\r\n+    private void releaseFileLock(String serviceInstanceId, String serviceName) {\r\n+        File serviceInstanceFile = serviceInstanceFile(serviceInstanceId, serviceName);\r\n+        releaseFileLock(serviceInstanceFile);\r\n+    }\r\n+\r\n+    private void releaseFileLock(File serviceInstanceFile) {\r\n+        fileLocksCache.computeIfPresent(serviceInstanceFile, (f, fileLock) -> {\r\n+            releaseFileLock(fileLock);\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The file[%s] has been released\", serviceInstanceFile.getAbsolutePath()));\r\n+            }\r\n+            return null;\r\n+        });\r\n+    }\r\n+\r\n+    private void releaseFileLock(FileLock fileLock) {\r\n+        try (FileChannel fileChannel = fileLock.channel()) {\r\n+            fileLock.release();\r\n+        } catch (IOException e) {\r\n+            if (logger.isErrorEnabled()) {\r\n+                logger.error(e.getMessage(), e);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private File serviceInstanceFile(String serviceInstanceId, String serviceName) {\r\n+        return dynamicConfiguration.configFile(serviceInstanceId, serviceName);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return dynamicConfiguration.getConfigGroups();\r\n+    }\r\n+\r\n+    private static FileSystemDynamicConfiguration createDynamicConfiguration(URL connectionURL) {\r\n+        String path = System.getProperty(\"user.home\") + File.separator + \".dubbo\" + File.separator + \"registry\";\r\n+        return new FileSystemDynamicConfiguration(connectionURL.addParameter(CONFIG_CENTER_DIR_PARAM_NAME, path));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/InstanceAddressURL.java", "source2": "org/apache/dubbo/registry/client/InstanceAddressURL.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,379 +1,379 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.rpc.RpcContext;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-\n-public class InstanceAddressURL extends URL {\n-    private ServiceInstance instance;\n-    private MetadataInfo metadataInfo;\n-\n-    // cached numbers\n-    private volatile transient Map<String, Number> numbers;\n-    private volatile transient Map<String, Map<String, Number>> methodNumbers;\n-\n-    public InstanceAddressURL() {\n-    }\n-\n-    public InstanceAddressURL(\n-            ServiceInstance instance,\n-            MetadataInfo metadataInfo\n-    ) {\n-        this.instance = instance;\n-        this.metadataInfo = metadataInfo;\n-        this.host = instance.getHost();\n-        this.port = instance.getPort();\n-    }\n-\n-    public ServiceInstance getInstance() {\n-        return instance;\n-    }\n-\n-    public MetadataInfo getMetadataInfo() {\n-        return metadataInfo;\n-    }\n-\n-    @Override\n-    public String getServiceInterface() {\n-        return RpcContext.getContext().getInterfaceName();\n-    }\n-\n-    public String getGroup() {\n-        return RpcContext.getContext().getGroup();\n-    }\n-\n-    public String getVersion() {\n-        return RpcContext.getContext().getVersion();\n-    }\n-\n-    @Override\n-    public String getProtocol() {\n-        return RpcContext.getContext().getProtocol();\n-    }\n-\n-    @Override\n-    public String getProtocolServiceKey() {\n-        return RpcContext.getContext().getProtocolServiceKey();\n-    }\n-\n-    @Override\n-    public String getServiceKey() {\n-        return RpcContext.getContext().getServiceKey();\n-    }\n-\n-    @Override\n-    public String getAddress() {\n-        return instance.getAddress();\n-    }\n-\n-    @Override\n-    public String getPath() {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(getProtocolServiceKey());\n-        return serviceInfo.getPath();\n-    }\n-\n-    @Override\n-    public String getParameter(String key) {\n-        if (VERSION_KEY.equals(key)) {\n-            return getVersion();\n-        } else if (GROUP_KEY.equals(key)) {\n-            return getGroup();\n-        } else if (INTERFACE_KEY.equals(key)) {\n-            return getServiceInterface();\n-        } else if (REMOTE_APPLICATION_KEY.equals(key)) {\n-            return instance.getServiceName();\n-        }\n-\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return getInstanceParameter(key);\n-        }\n-        return getServiceParameter(protocolServiceKey, key);\n-    }\n-\n-    @Override\n-    public String getServiceParameter(String service, String key) {\n-        String value = getInstanceParameter(key);\n-        if (StringUtils.isEmpty(value) && metadataInfo != null) {\n-            value = metadataInfo.getParameter(key, service);\n-        }\n-        return value;\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @param key\n-     * @return\n-     */\n-    @Override\n-    public String getServiceMethodParameter(String protocolServiceKey, String method, String key) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-        String value = serviceInfo.getMethodParameter(method, key, null);\n-        if (StringUtils.isNotEmpty(value)) {\n-            return value;\n-        }\n-        return getParameter(key);\n-    }\n-\n-    @Override\n-    public String getMethodParameter(String method, String key) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return null;\n-        }\n-        return getServiceMethodParameter(protocolServiceKey, method, key);\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @param key\n-     * @return\n-     */\n-    @Override\n-    public boolean hasServiceMethodParameter(String protocolServiceKey, String method, String key) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-\n-        if (method == null) {\n-            String suffix = \".\" + key;\n-            for (String fullKey : getParameters().keySet()) {\n-                if (fullKey.endsWith(suffix)) {\n-                    return true;\n-                }\n-            }\n-            return false;\n-        }\n-        if (key == null) {\n-            String prefix = method + \".\";\n-            for (String fullKey : getParameters().keySet()) {\n-                if (fullKey.startsWith(prefix)) {\n-                    return true;\n-                }\n-            }\n-            return false;\n-        }\n-\n-        return serviceInfo.hasMethodParameter(method, key);\n-    }\n-\n-    @Override\n-    public boolean hasMethodParameter(String method, String key) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return false;\n-        }\n-        return hasServiceMethodParameter(protocolServiceKey, method, key);\n-    }\n-\n-    /**\n-     * method parameter only exists in ServiceInfo\n-     *\n-     * @param method\n-     * @return\n-     */\n-    @Override\n-    public boolean hasServiceMethodParameter(String protocolServiceKey, String method) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\n-        return serviceInfo.hasMethodParameter(method);\n-    }\n-\n-    @Override\n-    public boolean hasMethodParameter(String method) {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return false;\n-        }\n-        return hasServiceMethodParameter(protocolServiceKey, method);\n-    }\n-\n-    /**\n-     * Avoid calling this method in RPC call.\n-     *\n-     * @return\n-     */\n-    @Override\n-    public Map<String, String> getServiceParameters(String protocolServiceKey) {\n-        Map<String, String> instanceParams = getInstanceMetadata();\n-        Map<String, String> metadataParams = (metadataInfo == null ? new HashMap<>() : metadataInfo.getParameters(protocolServiceKey));\n-        int i = instanceParams == null ? 0 : instanceParams.size();\n-        int j = metadataParams == null ? 0 : metadataParams.size();\n-        Map<String, String> params = new HashMap<>((int) ((i + j) / 0.75) + 1);\n-        if (instanceParams != null) {\n-            params.putAll(instanceParams);\n-        }\n-        if (metadataParams != null) {\n-            params.putAll(metadataParams);\n-        }\n-        return params;\n-    }\n-\n-    @Override\n-    public Map<String, String> getParameters() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            return getInstance().getAllParams();\n-        }\n-        return getServiceParameters(protocolServiceKey);\n-    }\n-\n-    @Override\n-    public URL addParameter(String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getInstance().getExtendParams().put(key, value);\n-        return this;\n-    }\n-\n-    @Override\n-    public URL addParameterIfAbsent(String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getInstance().getExtendParams().putIfAbsent(key, value);\n-        return this;\n-    }\n-\n-    public URL addServiceParameter(String protocolServiceKey, String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameter(key, value);\n-        return this;\n-    }\n-\n-    public URL addServiceParameterIfAbsent(String protocolServiceKey, String key, String value) {\n-        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\n-            return this;\n-        }\n-\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameterIfAbsent(key, value);\n-        return this;\n-    }\n-\n-    public URL addConsumerParams(String protocolServiceKey, Map<String, String> params) {\n-        getMetadataInfo().getServiceInfo(protocolServiceKey).addConsumerParams(params);\n-        return this;\n-    }\n-\n-    @Override\n-    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {\n-        return getServiceInfo(protocolServiceKey).getNumbers();\n-    }\n-\n-    @Override\n-    protected Map<String, Number> getNumbers() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            if (numbers == null) { // concurrent initialization is tolerant\n-                numbers = new ConcurrentHashMap<>();\n-            }\n-            return numbers;\n-        }\n-        return getServiceNumbers(protocolServiceKey);\n-    }\n-\n-    @Override\n-    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {\n-        return getServiceInfo(protocolServiceKey).getMethodNumbers();\n-    }\n-\n-    @Override\n-    protected Map<String, Map<String, Number>> getMethodNumbers() {\n-        String protocolServiceKey = getProtocolServiceKey();\n-        if (protocolServiceKey == null) {\n-            if (methodNumbers == null) { // concurrent initialization is tolerant\n-                methodNumbers = new ConcurrentHashMap<>();\n-            }\n-            return methodNumbers;\n-        }\n-        return getServiceMethodNumbers(protocolServiceKey);\n-    }\n-\n-    private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {\n-        return metadataInfo.getServiceInfo(protocolServiceKey);\n-    }\n-\n-    private String getInstanceParameter(String key) {\n-        String value = this.instance.getMetadata().get(key);\n-        if (StringUtils.isNotEmpty(value)) {\n-            return value;\n-        }\n-        return this.instance.getExtendParams().get(key);\n-    }\n-\n-    private Map<String, String> getInstanceMetadata() {\n-        return this.instance.getMetadata();\n-    }\n-\n-    @Override\n-    public boolean equals(Object obj) {\n-        // instance metadata equals\n-        if (obj == null) {\n-            return false;\n-        }\n-        if (!(obj instanceof InstanceAddressURL)) {\n-            return false;\n-        }\n-\n-        InstanceAddressURL that = (InstanceAddressURL) obj;\n-\n-        return this.getInstance().equals(that.getInstance());\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return getInstance().hashCode();\n-    }\n-\n-    public String getServiceString(String service) {\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(service);\n-        if (serviceInfo == null) {\n-            return instance.toString();\n-        }\n-        return instance.toString() + serviceInfo.toString();\n-    }\n-\n-    @Override\n-    public String toString() {\n-        if (instance == null) {\n-            return \"{}\";\n-        }\n-        if (metadataInfo == null) {\n-            return instance.toString();\n-        }\n-        return instance.toString() + metadataInfo.toString();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.rpc.RpcContext;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+\r\n+public class InstanceAddressURL extends URL {\r\n+    private ServiceInstance instance;\r\n+    private MetadataInfo metadataInfo;\r\n+\r\n+    // cached numbers\r\n+    private volatile transient Map<String, Number> numbers;\r\n+    private volatile transient Map<String, Map<String, Number>> methodNumbers;\r\n+\r\n+    public InstanceAddressURL() {\r\n+    }\r\n+\r\n+    public InstanceAddressURL(\r\n+            ServiceInstance instance,\r\n+            MetadataInfo metadataInfo\r\n+    ) {\r\n+        this.instance = instance;\r\n+        this.metadataInfo = metadataInfo;\r\n+        this.host = instance.getHost();\r\n+        this.port = instance.getPort();\r\n+    }\r\n+\r\n+    public ServiceInstance getInstance() {\r\n+        return instance;\r\n+    }\r\n+\r\n+    public MetadataInfo getMetadataInfo() {\r\n+        return metadataInfo;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceInterface() {\r\n+        return RpcContext.getContext().getInterfaceName();\r\n+    }\r\n+\r\n+    public String getGroup() {\r\n+        return RpcContext.getContext().getGroup();\r\n+    }\r\n+\r\n+    public String getVersion() {\r\n+        return RpcContext.getContext().getVersion();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getProtocol() {\r\n+        return RpcContext.getContext().getProtocol();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getProtocolServiceKey() {\r\n+        return RpcContext.getContext().getProtocolServiceKey();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceKey() {\r\n+        return RpcContext.getContext().getServiceKey();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAddress() {\r\n+        return instance.getAddress();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getPath() {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(getProtocolServiceKey());\r\n+        return serviceInfo.getPath();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getParameter(String key) {\r\n+        if (VERSION_KEY.equals(key)) {\r\n+            return getVersion();\r\n+        } else if (GROUP_KEY.equals(key)) {\r\n+            return getGroup();\r\n+        } else if (INTERFACE_KEY.equals(key)) {\r\n+            return getServiceInterface();\r\n+        } else if (REMOTE_APPLICATION_KEY.equals(key)) {\r\n+            return instance.getServiceName();\r\n+        }\r\n+\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return getInstanceParameter(key);\r\n+        }\r\n+        return getServiceParameter(protocolServiceKey, key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceParameter(String service, String key) {\r\n+        String value = getInstanceParameter(key);\r\n+        if (StringUtils.isEmpty(value) && metadataInfo != null) {\r\n+            value = metadataInfo.getParameter(key, service);\r\n+        }\r\n+        return value;\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @param key\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public String getServiceMethodParameter(String protocolServiceKey, String method, String key) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+        String value = serviceInfo.getMethodParameter(method, key, null);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            return value;\r\n+        }\r\n+        return getParameter(key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getMethodParameter(String method, String key) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return null;\r\n+        }\r\n+        return getServiceMethodParameter(protocolServiceKey, method, key);\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @param key\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public boolean hasServiceMethodParameter(String protocolServiceKey, String method, String key) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+\r\n+        if (method == null) {\r\n+            String suffix = \".\" + key;\r\n+            for (String fullKey : getParameters().keySet()) {\r\n+                if (fullKey.endsWith(suffix)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+            return false;\r\n+        }\r\n+        if (key == null) {\r\n+            String prefix = method + \".\";\r\n+            for (String fullKey : getParameters().keySet()) {\r\n+                if (fullKey.startsWith(prefix)) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+            return false;\r\n+        }\r\n+\r\n+        return serviceInfo.hasMethodParameter(method, key);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean hasMethodParameter(String method, String key) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return false;\r\n+        }\r\n+        return hasServiceMethodParameter(protocolServiceKey, method, key);\r\n+    }\r\n+\r\n+    /**\r\n+     * method parameter only exists in ServiceInfo\r\n+     *\r\n+     * @param method\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public boolean hasServiceMethodParameter(String protocolServiceKey, String method) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(protocolServiceKey);\r\n+        return serviceInfo.hasMethodParameter(method);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean hasMethodParameter(String method) {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return false;\r\n+        }\r\n+        return hasServiceMethodParameter(protocolServiceKey, method);\r\n+    }\r\n+\r\n+    /**\r\n+     * Avoid calling this method in RPC call.\r\n+     *\r\n+     * @return\r\n+     */\r\n+    @Override\r\n+    public Map<String, String> getServiceParameters(String protocolServiceKey) {\r\n+        Map<String, String> instanceParams = getInstanceMetadata();\r\n+        Map<String, String> metadataParams = (metadataInfo == null ? new HashMap<>() : metadataInfo.getParameters(protocolServiceKey));\r\n+        int i = instanceParams == null ? 0 : instanceParams.size();\r\n+        int j = metadataParams == null ? 0 : metadataParams.size();\r\n+        Map<String, String> params = new HashMap<>((int) ((i + j) / 0.75) + 1);\r\n+        if (instanceParams != null) {\r\n+            params.putAll(instanceParams);\r\n+        }\r\n+        if (metadataParams != null) {\r\n+            params.putAll(metadataParams);\r\n+        }\r\n+        return params;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getParameters() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            return getInstance().getAllParams();\r\n+        }\r\n+        return getServiceParameters(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL addParameter(String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getInstance().getExtendParams().put(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL addParameterIfAbsent(String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getInstance().getExtendParams().putIfAbsent(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addServiceParameter(String protocolServiceKey, String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameter(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addServiceParameterIfAbsent(String protocolServiceKey, String key, String value) {\r\n+        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(value)) {\r\n+            return this;\r\n+        }\r\n+\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addParameterIfAbsent(key, value);\r\n+        return this;\r\n+    }\r\n+\r\n+    public URL addConsumerParams(String protocolServiceKey, Map<String, String> params) {\r\n+        getMetadataInfo().getServiceInfo(protocolServiceKey).addConsumerParams(params);\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Number> getServiceNumbers(String protocolServiceKey) {\r\n+        return getServiceInfo(protocolServiceKey).getNumbers();\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Number> getNumbers() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            if (numbers == null) { // concurrent initialization is tolerant\r\n+                numbers = new ConcurrentHashMap<>();\r\n+            }\r\n+            return numbers;\r\n+        }\r\n+        return getServiceNumbers(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Map<String, Number>> getServiceMethodNumbers(String protocolServiceKey) {\r\n+        return getServiceInfo(protocolServiceKey).getMethodNumbers();\r\n+    }\r\n+\r\n+    @Override\r\n+    protected Map<String, Map<String, Number>> getMethodNumbers() {\r\n+        String protocolServiceKey = getProtocolServiceKey();\r\n+        if (protocolServiceKey == null) {\r\n+            if (methodNumbers == null) { // concurrent initialization is tolerant\r\n+                methodNumbers = new ConcurrentHashMap<>();\r\n+            }\r\n+            return methodNumbers;\r\n+        }\r\n+        return getServiceMethodNumbers(protocolServiceKey);\r\n+    }\r\n+\r\n+    private MetadataInfo.ServiceInfo getServiceInfo(String protocolServiceKey) {\r\n+        return metadataInfo.getServiceInfo(protocolServiceKey);\r\n+    }\r\n+\r\n+    private String getInstanceParameter(String key) {\r\n+        String value = this.instance.getMetadata().get(key);\r\n+        if (StringUtils.isNotEmpty(value)) {\r\n+            return value;\r\n+        }\r\n+        return this.instance.getExtendParams().get(key);\r\n+    }\r\n+\r\n+    private Map<String, String> getInstanceMetadata() {\r\n+        return this.instance.getMetadata();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object obj) {\r\n+        // instance metadata equals\r\n+        if (obj == null) {\r\n+            return false;\r\n+        }\r\n+        if (!(obj instanceof InstanceAddressURL)) {\r\n+            return false;\r\n+        }\r\n+\r\n+        InstanceAddressURL that = (InstanceAddressURL) obj;\r\n+\r\n+        return this.getInstance().equals(that.getInstance());\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return getInstance().hashCode();\r\n+    }\r\n+\r\n+    public String getServiceString(String service) {\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServiceInfo(service);\r\n+        if (serviceInfo == null) {\r\n+            return instance.toString();\r\n+        }\r\n+        return instance.toString() + serviceInfo.toString();\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        if (instance == null) {\r\n+            return \"{}\";\r\n+        }\r\n+        if (metadataInfo == null) {\r\n+            return instance.toString();\r\n+        }\r\n+        return instance.toString() + metadataInfo.toString();\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/RegistryClusterIdentifier.java", "source2": "org/apache/dubbo/registry/client/RegistryClusterIdentifier.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,36 +1,36 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_TYPE_KEY;\n-\n-@SPI\n-public interface RegistryClusterIdentifier {\n-    String providerKey(URL url);\n-\n-    String consumerKey(URL url);\n-\n-    static RegistryClusterIdentifier getExtension(URL url) {\n-        ExtensionLoader<RegistryClusterIdentifier> loader\n-                = ExtensionLoader.getExtensionLoader(RegistryClusterIdentifier.class);\n-        return loader.getExtension(url.getParameter(REGISTRY_CLUSTER_TYPE_KEY, \"default\"));\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_TYPE_KEY;\r\n+\r\n+@SPI\r\n+public interface RegistryClusterIdentifier {\r\n+    String providerKey(URL url);\r\n+\r\n+    String consumerKey(URL url);\r\n+\r\n+    static RegistryClusterIdentifier getExtension(URL url) {\r\n+        ExtensionLoader<RegistryClusterIdentifier> loader\r\n+                = ExtensionLoader.getExtensionLoader(RegistryClusterIdentifier.class);\r\n+        return loader.getExtension(url.getParameter(REGISTRY_CLUSTER_TYPE_KEY, \"default\"));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscovery.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,287 +1,287 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.common.utils.Page;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.LinkedHashMap;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.stream.Stream;\n-\n-import static java.util.Collections.unmodifiableList;\n-import static java.util.Collections.unmodifiableMap;\n-import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\n-\n-/**\n- * The common operations of Service Discovery\n- *\n- * @since 2.7.5\n- */\n-@SPI(\"zookeeper\")\n-public interface ServiceDiscovery extends Prioritized {\n-\n-    // ==================================== Lifecycle ==================================== //\n-\n-    /**\n-     * Initializes the {@link ServiceDiscovery}\n-     *\n-     * @param registryURL the {@link URL url} to connect service registry\n-     * @throws Exception If met with error\n-     */\n-    void initialize(URL registryURL) throws Exception;\n-\n-    /**\n-     * Destroy the {@link ServiceDiscovery}\n-     *\n-     * @throws Exception If met with error\n-     */\n-    void destroy() throws Exception;\n-\n-    // ==================================================================================== //\n-\n-    // =================================== Registration =================================== //\n-\n-    /**\n-     * Registers an instance of {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance an instance of {@link ServiceInstance} to be registered\n-     * @throws RuntimeException if failed\n-     */\n-    void register(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    /**\n-     * Updates the registered {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance the registered {@link ServiceInstance}\n-     * @throws RuntimeException if failed\n-     */\n-    void update(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    /**\n-     * Unregisters an instance of {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance an instance of {@link ServiceInstance} to be unregistered\n-     * @throws RuntimeException if failed\n-     */\n-    void unregister(ServiceInstance serviceInstance) throws RuntimeException;\n-\n-    // ==================================================================================== //\n-\n-    // ==================================== Discovery ===================================== //\n-\n-    /**\n-     * Get the default size of pagination query\n-     *\n-     * @return the default value is 100\n-     */\n-    default int getDefaultPageSize() {\n-        return 100;\n-    }\n-\n-    /**\n-     * Gets all service names\n-     *\n-     * @return non-null read-only {@link Set}\n-     */\n-    Set<String> getServices();\n-\n-    /**\n-     * Gets all {@link ServiceInstance service instances} by the specified service name.\n-     *\n-     * @param serviceName the service name\n-     * @return non-null {@link List}\n-     * @throws NullPointerException if <code>serviceName</code> is <code>null</code>\n-     */\n-    default List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-\n-        List<ServiceInstance> allInstances = new LinkedList<>();\n-\n-        int offset = 0;\n-\n-        int pageSize = getDefaultPageSize();\n-\n-        Page<ServiceInstance> page = getInstances(serviceName, offset, pageSize);\n-\n-        allInstances.addAll(page.getData());\n-\n-        while (page.hasNext()) {\n-            offset += page.getDataSize();\n-            page = getInstances(serviceName, offset, pageSize);\n-            allInstances.addAll(page.getData());\n-        }\n-\n-        return unmodifiableList(allInstances);\n-    }\n-\n-    /**\n-     * Gets the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\n-     * It's equal to {@link #getInstances(String, int, int, boolean)} with <code>healthyOnly == true</code>\n-     *\n-     * @param serviceName the service name\n-     * @param offset      the offset of request , the number \"0\" indicates first page\n-     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @return non-null {@link Page} object\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException,\n-            IllegalArgumentException {\n-        return getInstances(serviceName, offset, pageSize, false);\n-    }\n-\n-    /**\n-     * Get the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\n-     * If <code>healthyOnly == true</code>, filter healthy instances only.\n-     *\n-     * @param serviceName the service name\n-     * @param offset      the offset of request , the number \"0\" indicates first page\n-     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @param healthyOnly if <code>true</code> , filter healthy instances only\n-     * @return non-null {@link Page} object\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws\n-            NullPointerException, IllegalArgumentException, UnsupportedOperationException {\n-        throw new UnsupportedOperationException(\"Current implementation does not support pagination query method.\");\n-    }\n-\n-    /**\n-     * batch-get all {@link ServiceInstance service instances} by the specified service names\n-     *\n-     * @param serviceNames the multiple service names\n-     * @param offset       the offset of request , the number \"0\" indicates first page\n-     * @param requestSize  the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\n-     * @return non-null read-only {@link Map} whose key is the service name and value is\n-     * the {@link Page pagination} of {@link ServiceInstance service instances}\n-     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\n-     * @throws IllegalArgumentException      if <code>offset</code> or <code>requestSize</code> is negative number\n-     * @throws UnsupportedOperationException if not supported\n-     */\n-    default Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws\n-            NullPointerException, IllegalArgumentException {\n-        Map<String, Page<ServiceInstance>> instances = new LinkedHashMap<>();\n-        for (String serviceName : serviceNames) {\n-            instances.put(serviceName, getInstances(serviceName, offset, requestSize));\n-        }\n-        return unmodifiableMap(instances);\n-    }\n-\n-    /**\n-     * Add an instance of {@link ServiceInstancesChangedListener} for specified service\n-     * <p>\n-     * Default, current method will be invoked by {@link ServiceDiscoveryRegistry#subscribe(URL, NotifyListener)\n-     * the ServiceDiscoveryRegistry on the subscription}, and it's mandatory to\n-     * {@link EventDispatcher#addEventListener(EventListener) add} the {@link ServiceInstancesChangedListener} argument\n-     * into {@link EventDispatcher} whether the subclass implements same approach or not, thus this method is used to\n-     * trigger or adapt the vendor's change notification mechanism typically, like Zookeeper Watcher,\n-     * Nacos EventListener. If the registry observes the change, It's suggested that the implementation could invoke\n-     * {@link #dispatchServiceInstancesChangedEvent(String)} method or variants\n-     *\n-     * @param listener an instance of {@link ServiceInstancesChangedListener}\n-     * @throws NullPointerException\n-     * @throws IllegalArgumentException\n-     * @see EventPublishingServiceDiscovery\n-     * @see EventDispatcher\n-     */\n-    default void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\n-            throws NullPointerException, IllegalArgumentException {\n-    }\n-\n-    /**\n-     * unsubscribe to instances change event.\n-     * @param listener\n-     * @throws IllegalArgumentException\n-     */\n-    default void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\n-            throws IllegalArgumentException {\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName the name of service whose service instances have been changed\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName) {\n-        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName       the name of service whose service instances have been changed\n-     * @param otherServiceNames the names of other services\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName, String... otherServiceNames) {\n-        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\n-        if (otherServiceNames != null) {\n-            Stream.of(otherServiceNames)\n-                    .filter(StringUtils::isNotEmpty)\n-                    .forEach(this::dispatchServiceInstancesChangedEvent);\n-        }\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param serviceName      the name of service whose service instances have been changed\n-     * @param serviceInstances the service instances have been changed\n-     */\n-    default void dispatchServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\n-        dispatchServiceInstancesChangedEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\n-    }\n-\n-    /**\n-     * Dispatch the {@link ServiceInstancesChangedEvent}\n-     *\n-     * @param event the {@link ServiceInstancesChangedEvent}\n-     */\n-    default void dispatchServiceInstancesChangedEvent(ServiceInstancesChangedEvent event) {\n-        getDefaultExtension().dispatch(event);\n-    }\n-\n-    // ==================================================================================== //\n-\n-//    String getKey(URL exportedURL);\n-\n-    default URL getUrl() {\n-        return null;\n-    }\n-\n-    ServiceInstance getLocalInstance();\n-\n-    /**\n-     * A human-readable description of the implementation\n-     *\n-     * @return The description.\n-     */\n-    String toString();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.common.utils.Page;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.LinkedHashMap;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.stream.Stream;\r\n+\r\n+import static java.util.Collections.unmodifiableList;\r\n+import static java.util.Collections.unmodifiableMap;\r\n+import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\r\n+\r\n+/**\r\n+ * The common operations of Service Discovery\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"zookeeper\")\r\n+public interface ServiceDiscovery extends Prioritized {\r\n+\r\n+    // ==================================== Lifecycle ==================================== //\r\n+\r\n+    /**\r\n+     * Initializes the {@link ServiceDiscovery}\r\n+     *\r\n+     * @param registryURL the {@link URL url} to connect service registry\r\n+     * @throws Exception If met with error\r\n+     */\r\n+    void initialize(URL registryURL) throws Exception;\r\n+\r\n+    /**\r\n+     * Destroy the {@link ServiceDiscovery}\r\n+     *\r\n+     * @throws Exception If met with error\r\n+     */\r\n+    void destroy() throws Exception;\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // =================================== Registration =================================== //\r\n+\r\n+    /**\r\n+     * Registers an instance of {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance an instance of {@link ServiceInstance} to be registered\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void register(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    /**\r\n+     * Updates the registered {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance the registered {@link ServiceInstance}\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void update(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    /**\r\n+     * Unregisters an instance of {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance an instance of {@link ServiceInstance} to be unregistered\r\n+     * @throws RuntimeException if failed\r\n+     */\r\n+    void unregister(ServiceInstance serviceInstance) throws RuntimeException;\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // ==================================== Discovery ===================================== //\r\n+\r\n+    /**\r\n+     * Get the default size of pagination query\r\n+     *\r\n+     * @return the default value is 100\r\n+     */\r\n+    default int getDefaultPageSize() {\r\n+        return 100;\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets all service names\r\n+     *\r\n+     * @return non-null read-only {@link Set}\r\n+     */\r\n+    Set<String> getServices();\r\n+\r\n+    /**\r\n+     * Gets all {@link ServiceInstance service instances} by the specified service name.\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @return non-null {@link List}\r\n+     * @throws NullPointerException if <code>serviceName</code> is <code>null</code>\r\n+     */\r\n+    default List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+\r\n+        List<ServiceInstance> allInstances = new LinkedList<>();\r\n+\r\n+        int offset = 0;\r\n+\r\n+        int pageSize = getDefaultPageSize();\r\n+\r\n+        Page<ServiceInstance> page = getInstances(serviceName, offset, pageSize);\r\n+\r\n+        allInstances.addAll(page.getData());\r\n+\r\n+        while (page.hasNext()) {\r\n+            offset += page.getDataSize();\r\n+            page = getInstances(serviceName, offset, pageSize);\r\n+            allInstances.addAll(page.getData());\r\n+        }\r\n+\r\n+        return unmodifiableList(allInstances);\r\n+    }\r\n+\r\n+    /**\r\n+     * Gets the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\r\n+     * It's equal to {@link #getInstances(String, int, int, boolean)} with <code>healthyOnly == true</code>\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @param offset      the offset of request , the number \"0\" indicates first page\r\n+     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @return non-null {@link Page} object\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize) throws NullPointerException,\r\n+            IllegalArgumentException {\r\n+        return getInstances(serviceName, offset, pageSize, false);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link Page pagination} of {@link ServiceInstance service instances} by the specified service name.\r\n+     * If <code>healthyOnly == true</code>, filter healthy instances only.\r\n+     *\r\n+     * @param serviceName the service name\r\n+     * @param offset      the offset of request , the number \"0\" indicates first page\r\n+     * @param pageSize    the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @param healthyOnly if <code>true</code> , filter healthy instances only\r\n+     * @return non-null {@link Page} object\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>pageSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly) throws\r\n+            NullPointerException, IllegalArgumentException, UnsupportedOperationException {\r\n+        throw new UnsupportedOperationException(\"Current implementation does not support pagination query method.\");\r\n+    }\r\n+\r\n+    /**\r\n+     * batch-get all {@link ServiceInstance service instances} by the specified service names\r\n+     *\r\n+     * @param serviceNames the multiple service names\r\n+     * @param offset       the offset of request , the number \"0\" indicates first page\r\n+     * @param requestSize  the number of request, the {@link Integer#MAX_VALUE max value} indicates the range is unlimited\r\n+     * @return non-null read-only {@link Map} whose key is the service name and value is\r\n+     * the {@link Page pagination} of {@link ServiceInstance service instances}\r\n+     * @throws NullPointerException          if <code>serviceName</code> is <code>null</code>\r\n+     * @throws IllegalArgumentException      if <code>offset</code> or <code>requestSize</code> is negative number\r\n+     * @throws UnsupportedOperationException if not supported\r\n+     */\r\n+    default Map<String, Page<ServiceInstance>> getInstances(Iterable<String> serviceNames, int offset, int requestSize) throws\r\n+            NullPointerException, IllegalArgumentException {\r\n+        Map<String, Page<ServiceInstance>> instances = new LinkedHashMap<>();\r\n+        for (String serviceName : serviceNames) {\r\n+            instances.put(serviceName, getInstances(serviceName, offset, requestSize));\r\n+        }\r\n+        return unmodifiableMap(instances);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add an instance of {@link ServiceInstancesChangedListener} for specified service\r\n+     * <p>\r\n+     * Default, current method will be invoked by {@link ServiceDiscoveryRegistry#subscribe(URL, NotifyListener)\r\n+     * the ServiceDiscoveryRegistry on the subscription}, and it's mandatory to\r\n+     * {@link EventDispatcher#addEventListener(EventListener) add} the {@link ServiceInstancesChangedListener} argument\r\n+     * into {@link EventDispatcher} whether the subclass implements same approach or not, thus this method is used to\r\n+     * trigger or adapt the vendor's change notification mechanism typically, like Zookeeper Watcher,\r\n+     * Nacos EventListener. If the registry observes the change, It's suggested that the implementation could invoke\r\n+     * {@link #dispatchServiceInstancesChangedEvent(String)} method or variants\r\n+     *\r\n+     * @param listener an instance of {@link ServiceInstancesChangedListener}\r\n+     * @throws NullPointerException\r\n+     * @throws IllegalArgumentException\r\n+     * @see EventPublishingServiceDiscovery\r\n+     * @see EventDispatcher\r\n+     */\r\n+    default void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\r\n+            throws NullPointerException, IllegalArgumentException {\r\n+    }\r\n+\r\n+    /**\r\n+     * unsubscribe to instances change event.\r\n+     * @param listener\r\n+     * @throws IllegalArgumentException\r\n+     */\r\n+    default void removeServiceInstancesChangedListener(ServiceInstancesChangedListener listener)\r\n+            throws IllegalArgumentException {\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName the name of service whose service instances have been changed\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName) {\r\n+        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName       the name of service whose service instances have been changed\r\n+     * @param otherServiceNames the names of other services\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName, String... otherServiceNames) {\r\n+        dispatchServiceInstancesChangedEvent(serviceName, getInstances(serviceName));\r\n+        if (otherServiceNames != null) {\r\n+            Stream.of(otherServiceNames)\r\n+                    .filter(StringUtils::isNotEmpty)\r\n+                    .forEach(this::dispatchServiceInstancesChangedEvent);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param serviceName      the name of service whose service instances have been changed\r\n+     * @param serviceInstances the service instances have been changed\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\r\n+        dispatchServiceInstancesChangedEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\r\n+    }\r\n+\r\n+    /**\r\n+     * Dispatch the {@link ServiceInstancesChangedEvent}\r\n+     *\r\n+     * @param event the {@link ServiceInstancesChangedEvent}\r\n+     */\r\n+    default void dispatchServiceInstancesChangedEvent(ServiceInstancesChangedEvent event) {\r\n+        getDefaultExtension().dispatch(event);\r\n+    }\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+//    String getKey(URL exportedURL);\r\n+\r\n+    default URL getUrl() {\r\n+        return null;\r\n+    }\r\n+\r\n+    ServiceInstance getLocalInstance();\r\n+\r\n+    /**\r\n+     * A human-readable description of the implementation\r\n+     *\r\n+     * @return The description.\r\n+     */\r\n+    String toString();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,53 +1,53 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-\n-import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\n-\n-/**\n- * The factory to create {@link ServiceDiscovery}\n- *\n- * @see ServiceDiscovery\n- * @since 2.7.5\n- */\n-@SPI(\"default\")\n-public interface ServiceDiscoveryFactory {\n-\n-    /**\n-     * Get the instance of {@link ServiceDiscovery}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    ServiceDiscovery getServiceDiscovery(URL registryURL);\n-\n-    /**\n-     * Get the extension instance of {@link ServiceDiscoveryFactory} by {@link URL#getProtocol() the protocol}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    static ServiceDiscoveryFactory getExtension(URL registryURL) {\n-        String protocol = registryURL.getProtocol();\n-        ExtensionLoader<ServiceDiscoveryFactory> loader = getExtensionLoader(ServiceDiscoveryFactory.class);\n-        return loader.getOrDefaultExtension(protocol);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+\r\n+import static org.apache.dubbo.common.extension.ExtensionLoader.getExtensionLoader;\r\n+\r\n+/**\r\n+ * The factory to create {@link ServiceDiscovery}\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"default\")\r\n+public interface ServiceDiscoveryFactory {\r\n+\r\n+    /**\r\n+     * Get the instance of {@link ServiceDiscovery}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    ServiceDiscovery getServiceDiscovery(URL registryURL);\r\n+\r\n+    /**\r\n+     * Get the extension instance of {@link ServiceDiscoveryFactory} by {@link URL#getProtocol() the protocol}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    static ServiceDiscoveryFactory getExtension(URL registryURL) {\r\n+        String protocol = registryURL.getProtocol();\r\n+        ExtensionLoader<ServiceDiscoveryFactory> loader = getExtensionLoader(ServiceDiscoveryFactory.class);\r\n+        return loader.getOrDefaultExtension(protocol);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistry.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,498 +1,498 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MappingChangedEvent;\n-import org.apache.dubbo.metadata.MappingListener;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.TreeSet;\n-import java.util.stream.Collectors;\n-\n-import static java.lang.String.format;\n-import static java.util.Collections.emptySet;\n-import static java.util.Collections.unmodifiableSet;\n-import static java.util.stream.Collectors.toSet;\n-import static java.util.stream.Stream.of;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\n-import static org.apache.dubbo.common.function.ThrowableAction.execute;\n-import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtension;\n-import static org.apache.dubbo.rpc.Constants.ID_KEY;\n-\n-/**\n- * Being different to the traditional registry, {@link ServiceDiscoveryRegistry} that is a new service-oriented\n- * {@link Registry} based on {@link ServiceDiscovery}, it will not interact in the external registry directly,\n- * but store the {@link URL urls} that Dubbo services exported and referenced into {@link WritableMetadataService}\n- * when {@link #register(URL)} and {@link #subscribe(URL, NotifyListener)} methods are executed. After that the exported\n- * {@link URL urls} can be get from {@link WritableMetadataService#getExportedURLs()} and its variant methods. In contrast,\n- * {@link WritableMetadataService#getSubscribedURLs()} method offers the subscribed {@link URL URLs}.\n- * <p>\n- * Every {@link ServiceDiscoveryRegistry} object has its own {@link ServiceDiscovery} instance that was initialized\n- * under {@link #ServiceDiscoveryRegistry(URL) the construction}. As the primary argument of constructor , the\n- * {@link URL} of connection the registry decides what the kind of ServiceDiscovery is. Generally, each\n- * protocol associates with a kind of {@link ServiceDiscovery}'s implementation if present, or the\n- * {@link FileSystemServiceDiscovery} will be the default one. Obviously, it's also allowed to extend\n- * {@link ServiceDiscovery} using {@link SPI the Dubbo SPI}.\n- * In contrast, current {@link ServiceInstance service instance} will not be registered to the registry whether any\n- * Dubbo service is exported or not.\n- * <p>\n- *\n- * @see ServiceDiscovery\n- * @see FailbackRegistry\n- * @see WritableMetadataService\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryRegistry implements Registry {\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final ServiceDiscovery serviceDiscovery;\n-\n-    private final Set<String> subscribedServices;\n-\n-    private final ServiceNameMapping serviceNameMapping;\n-\n-    private final WritableMetadataService writableMetadataService;\n-\n-    private final Set<String> registeredListeners = new LinkedHashSet<>();\n-\n-    /* apps - listener */\n-    private final Map<String, ServiceInstancesChangedListener> serviceListeners = new HashMap<>();\n-    private final Map<String, String> serviceToAppsMapping = new HashMap<>();\n-\n-    private URL registryURL;\n-\n-    /**\n-     * A cache for all URLs of services that the subscribed services exported\n-     * The key is the service name\n-     * The value is a nested {@link Map} whose key is the revision and value is all URLs of services\n-     */\n-    private final Map<String, Map<String, List<URL>>> serviceRevisionExportedURLsCache = new LinkedHashMap<>();\n-\n-    public ServiceDiscoveryRegistry(URL registryURL) {\n-        this.registryURL = registryURL;\n-        this.serviceDiscovery = createServiceDiscovery(registryURL);\n-        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\n-        this.serviceNameMapping = ServiceNameMapping.getExtension(registryURL.getParameter(MAPPING_KEY));\n-        this.writableMetadataService = WritableMetadataService.getDefaultExtension();\n-    }\n-\n-    public ServiceDiscovery getServiceDiscovery() {\n-        return serviceDiscovery;\n-    }\n-\n-    /**\n-     * Create the {@link ServiceDiscovery} from the registry {@link URL}\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return non-null\n-     */\n-    protected ServiceDiscovery createServiceDiscovery(URL registryURL) {\n-        ServiceDiscovery originalServiceDiscovery = getServiceDiscovery(registryURL);\n-        ServiceDiscovery serviceDiscovery = enhanceEventPublishing(originalServiceDiscovery);\n-        execute(() -> {\n-            serviceDiscovery.initialize(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName())\n-                    .removeParameter(REGISTRY_TYPE_KEY));\n-        });\n-        return serviceDiscovery;\n-    }\n-\n-    private List<SubscribedURLsSynthesizer> initSubscribedURLsSynthesizers() {\n-        ExtensionLoader<SubscribedURLsSynthesizer> loader = ExtensionLoader.getExtensionLoader(SubscribedURLsSynthesizer.class);\n-        return Collections.unmodifiableList(new ArrayList<>(loader.getSupportedExtensionInstances()));\n-    }\n-\n-    /**\n-     * Get the instance {@link ServiceDiscovery} from the registry {@link URL} using\n-     * {@link ServiceDiscoveryFactory} SPI\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return\n-     */\n-    private ServiceDiscovery getServiceDiscovery(URL registryURL) {\n-        ServiceDiscoveryFactory factory = getExtension(registryURL);\n-        return factory.getServiceDiscovery(registryURL);\n-    }\n-\n-    /**\n-     * Enhance the original {@link ServiceDiscovery} with event publishing feature\n-     *\n-     * @param original the original {@link ServiceDiscovery}\n-     * @return {@link EventPublishingServiceDiscovery} instance\n-     */\n-    private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) {\n-        return new EventPublishingServiceDiscovery(original);\n-    }\n-\n-    protected boolean shouldRegister(URL providerURL) {\n-\n-        String side = providerURL.getParameter(SIDE_KEY);\n-\n-        boolean should = PROVIDER_SIDE.equals(side); // Only register the Provider.\n-\n-        if (!should) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(String.format(\"The URL[%s] should not be registered.\", providerURL.toString()));\n-            }\n-        }\n-\n-        return should;\n-    }\n-\n-    protected boolean shouldSubscribe(URL subscribedURL) {\n-        return !shouldRegister(subscribedURL);\n-    }\n-\n-    @Override\n-    public final void register(URL url) {\n-        if (!shouldRegister(url)) { // Should Not Register\n-            return;\n-        }\n-        doRegister(url);\n-    }\n-\n-    public void doRegister(URL url) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        if (writableMetadataService.exportURL(url)) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The URL[%s] registered successfully.\", url.toString()));\n-            }\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.info(format(\"The URL[%s] has been registered.\", url.toString()));\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public final void unregister(URL url) {\n-        if (!shouldRegister(url)) {\n-            return;\n-        }\n-        doUnregister(url);\n-    }\n-\n-    public void doUnregister(URL url) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        if (writableMetadataService.unexportURL(url)) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(format(\"The URL[%s] deregistered successfully.\", url.toString()));\n-            }\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.info(format(\"The URL[%s] has been deregistered.\", url.toString()));\n-            }\n-        }\n-    }\n-\n-    @Override\n-    public final void subscribe(URL url, NotifyListener listener) {\n-        if (!shouldSubscribe(url)) { // Should Not Subscribe\n-            return;\n-        }\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        doSubscribe(url, listener);\n-    }\n-\n-    public void doSubscribe(URL url, NotifyListener listener) {\n-        writableMetadataService.subscribeURL(url);\n-\n-        Set<String> serviceNames = getServices(url, listener);\n-\n-        if (CollectionUtils.isEmpty(serviceNames)) {\n-            logger.warn(\"Should has at least one way to know which services this interface belongs to, subscription url: \" + url);\n-            return;\n-        }\n-\n-        subscribeURLs(url, listener, serviceNames);\n-    }\n-\n-    @Override\n-    public final void unsubscribe(URL url, NotifyListener listener) {\n-        if (!shouldSubscribe(url)) { // Should Not Subscribe\n-            return;\n-        }\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\n-            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\n-        }\n-        doUnsubscribe(url, listener);\n-    }\n-\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        writableMetadataService.unsubscribeURL(url);\n-        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\n-        String serviceNamesKey = serviceToAppsMapping.remove(protocolServiceKey);\n-        ServiceInstancesChangedListener instancesChangedListener = serviceListeners.get(serviceNamesKey);\n-        instancesChangedListener.removeListener(protocolServiceKey);\n-    }\n-\n-    @Override\n-    public List<URL> lookup(URL url) {\n-        throw new UnsupportedOperationException(\"\");\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registryURL;\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return !serviceDiscovery.getServices().isEmpty();\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        AbstractRegistryFactory.removeDestroyedRegistry(this);\n-        execute(() -> {\n-            // stop ServiceDiscovery\n-            serviceDiscovery.destroy();\n-        });\n-    }\n-\n-    protected void subscribeURLs(URL url, NotifyListener listener, Set<String> serviceNames) {\n-        String serviceNamesKey = serviceNames.toString();\n-        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\n-        serviceToAppsMapping.put(protocolServiceKey, serviceNamesKey);\n-\n-        // register ServiceInstancesChangedListener\n-        ServiceInstancesChangedListener serviceListener = serviceListeners.computeIfAbsent(serviceNamesKey,\n-                k -> new ServiceInstancesChangedListener(serviceNames, serviceDiscovery));\n-        serviceListener.setUrl(url);\n-        listener.addServiceListener(serviceListener);\n-\n-        serviceListener.addListener(protocolServiceKey, listener);\n-        registerServiceInstancesChangedListener(url, serviceListener);\n-\n-        // FIXME: This will cause redundant duplicate notifications\n-        serviceNames.forEach(serviceName -> {\n-            List<ServiceInstance> serviceInstances = serviceDiscovery.getInstances(serviceName);\n-            if (CollectionUtils.isNotEmpty(serviceInstances)) {\n-                serviceListener.onEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\n-            } else {\n-                logger.info(\"getInstances by serviceName=\" + serviceName + \" is empty, waiting for serviceListener callback. url=\" + url);\n-            }\n-        });\n-\n-        listener.notify(serviceListener.getUrls(protocolServiceKey));\n-\n-    }\n-\n-    /**\n-     * Register the {@link ServiceInstancesChangedListener} If absent\n-     *\n-     * @param url      {@link URL}\n-     * @param listener the {@link ServiceInstancesChangedListener}\n-     */\n-    private void registerServiceInstancesChangedListener(URL url, ServiceInstancesChangedListener listener) {\n-        String listenerId = createListenerId(url, listener);\n-        if (registeredListeners.add(listenerId)) {\n-            serviceDiscovery.addServiceInstancesChangedListener(listener);\n-        }\n-    }\n-\n-    private String createListenerId(URL url, ServiceInstancesChangedListener listener) {\n-        return listener.getServiceNames() + \":\" + url.toString(VERSION_KEY, GROUP_KEY, PROTOCOL_KEY);\n-    }\n-\n-    /**\n-     * 1.developer explicitly specifies the application name this interface belongs to\n-     * 2.check Interface-App mapping\n-     * 3.use the services specified in registry url.\n-     *\n-     * @param subscribedURL\n-     * @return\n-     */\n-    protected Set<String> getServices(URL subscribedURL, final NotifyListener listener) {\n-        Set<String> subscribedServices = new TreeSet<>();\n-\n-        String serviceNames = subscribedURL.getParameter(PROVIDED_BY);\n-        if (StringUtils.isNotEmpty(serviceNames)) {\n-            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by provided-by set by user.\");\n-            subscribedServices.addAll(parseServices(serviceNames));\n-        }\n-\n-        if (isEmpty(subscribedServices)) {\n-            Set<String> mappedServices = findMappedServices(subscribedURL, new DefaultMappingListener(subscribedURL, subscribedServices, listener));\n-            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by remote metadata center.\");\n-            subscribedServices.addAll(mappedServices);\n-            if (isEmpty(subscribedServices)) {\n-                logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" by default.\");\n-                subscribedServices.addAll(getSubscribedServices());\n-            }\n-        }\n-        return subscribedServices;\n-    }\n-\n-    public static Set<String> parseServices(String literalServices) {\n-        return isBlank(literalServices) ? emptySet() :\n-                unmodifiableSet(of(literalServices.split(\",\"))\n-                        .map(String::trim)\n-                        .filter(StringUtils::isNotEmpty)\n-                        .collect(toSet()));\n-    }\n-\n-    /**\n-     * Get the subscribed service names\n-     *\n-     * @return non-null\n-     */\n-    public Set<String> getSubscribedServices() {\n-        return subscribedServices;\n-    }\n-\n-    /**\n-     * Get the mapped services name by the specified {@link URL}\n-     *\n-     * @param subscribedURL\n-     * @return\n-     */\n-    protected Set<String> findMappedServices(URL subscribedURL, MappingListener listener) {\n-        return serviceNameMapping.getAndListen(subscribedURL, listener);\n-    }\n-\n-    /**\n-     * Create an instance of {@link ServiceDiscoveryRegistry} if supported\n-     *\n-     * @param registryURL the {@link URL url} of registry\n-     * @return <code>null</code> if not supported\n-     */\n-    public static ServiceDiscoveryRegistry create(URL registryURL) {\n-        return supports(registryURL) ? new ServiceDiscoveryRegistry(registryURL) : null;\n-    }\n-\n-    /**\n-     * Supports or not ?\n-     *\n-     * @param registryURL the {@link URL url} of registry\n-     * @return if supported, return <code>true</code>, or <code>false</code>\n-     */\n-    public static boolean supports(URL registryURL) {\n-        return SERVICE_REGISTRY_TYPE.equalsIgnoreCase(registryURL.getParameter(REGISTRY_TYPE_KEY));\n-    }\n-\n-    private static List<URL> filterSubscribedURLs(URL subscribedURL, List<URL> exportedURLs) {\n-        return exportedURLs.stream()\n-                .filter(url -> isSameServiceInterface(subscribedURL, url))\n-                .filter(url -> isSameParameter(subscribedURL, url, VERSION_KEY))\n-                .filter(url -> isSameParameter(subscribedURL, url, GROUP_KEY))\n-                .filter(url -> isCompatibleProtocol(subscribedURL, url))\n-                .collect(Collectors.toList());\n-    }\n-\n-    private static boolean isSameServiceInterface(URL one, URL another) {\n-        return Objects.equals(one.getServiceInterface(), another.getServiceInterface());\n-    }\n-\n-    private static boolean isSameParameter(URL one, URL another, String key) {\n-        return Objects.equals(one.getParameter(key), another.getParameter(key));\n-    }\n-\n-    private static boolean isCompatibleProtocol(URL one, URL another) {\n-        String protocol = one.getParameter(PROTOCOL_KEY);\n-        return isCompatibleProtocol(protocol, another);\n-    }\n-\n-    private static boolean isCompatibleProtocol(String protocol, URL targetURL) {\n-        return protocol == null || Objects.equals(protocol, targetURL.getParameter(PROTOCOL_KEY))\n-                || Objects.equals(protocol, targetURL.getProtocol());\n-    }\n-\n-    private class DefaultMappingListener implements MappingListener {\n-        private URL url;\n-        private Set<String> oldApps;\n-        private NotifyListener listener;\n-\n-        public DefaultMappingListener(URL subscribedURL, Set<String> serviceNames, NotifyListener listener) {\n-            this.url = subscribedURL;\n-            this.oldApps = serviceNames;\n-            this.listener = listener;\n-        }\n-\n-        @Override\n-        public void onEvent(MappingChangedEvent event) {\n-            Set<String> newApps = event.getApps();\n-            Set<String> tempOldApps = oldApps;\n-            oldApps = newApps;\n-\n-            if (CollectionUtils.isEmpty(newApps)) {\n-                return;\n-            }\n-\n-            if (CollectionUtils.isEmpty(tempOldApps) && newApps.size() > 0) {\n-                subscribeURLs(url, listener, newApps);\n-                return;\n-            }\n-\n-            for (String newAppName : newApps) {\n-                if (!tempOldApps.contains(newAppName)) {\n-                    subscribeURLs(url, listener, newApps);\n-                    return;\n-                }\n-            }\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MappingChangedEvent;\r\n+import org.apache.dubbo.metadata.MappingListener;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.lang.String.format;\r\n+import static java.util.Collections.emptySet;\r\n+import static java.util.Collections.unmodifiableSet;\r\n+import static java.util.stream.Collectors.toSet;\r\n+import static java.util.stream.Stream.of;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MAPPING_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDED_BY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_TYPE_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_TYPE;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\r\n+import static org.apache.dubbo.common.function.ThrowableAction.execute;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.registry.client.ServiceDiscoveryFactory.getExtension;\r\n+import static org.apache.dubbo.rpc.Constants.ID_KEY;\r\n+\r\n+/**\r\n+ * Being different to the traditional registry, {@link ServiceDiscoveryRegistry} that is a new service-oriented\r\n+ * {@link Registry} based on {@link ServiceDiscovery}, it will not interact in the external registry directly,\r\n+ * but store the {@link URL urls} that Dubbo services exported and referenced into {@link WritableMetadataService}\r\n+ * when {@link #register(URL)} and {@link #subscribe(URL, NotifyListener)} methods are executed. After that the exported\r\n+ * {@link URL urls} can be get from {@link WritableMetadataService#getExportedURLs()} and its variant methods. In contrast,\r\n+ * {@link WritableMetadataService#getSubscribedURLs()} method offers the subscribed {@link URL URLs}.\r\n+ * <p>\r\n+ * Every {@link ServiceDiscoveryRegistry} object has its own {@link ServiceDiscovery} instance that was initialized\r\n+ * under {@link #ServiceDiscoveryRegistry(URL) the construction}. As the primary argument of constructor , the\r\n+ * {@link URL} of connection the registry decides what the kind of ServiceDiscovery is. Generally, each\r\n+ * protocol associates with a kind of {@link ServiceDiscovery}'s implementation if present, or the\r\n+ * {@link FileSystemServiceDiscovery} will be the default one. Obviously, it's also allowed to extend\r\n+ * {@link ServiceDiscovery} using {@link SPI the Dubbo SPI}.\r\n+ * In contrast, current {@link ServiceInstance service instance} will not be registered to the registry whether any\r\n+ * Dubbo service is exported or not.\r\n+ * <p>\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see FailbackRegistry\r\n+ * @see WritableMetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryRegistry implements Registry {\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+\r\n+    private final Set<String> subscribedServices;\r\n+\r\n+    private final ServiceNameMapping serviceNameMapping;\r\n+\r\n+    private final WritableMetadataService writableMetadataService;\r\n+\r\n+    private final Set<String> registeredListeners = new LinkedHashSet<>();\r\n+\r\n+    /* apps - listener */\r\n+    private final Map<String, ServiceInstancesChangedListener> serviceListeners = new HashMap<>();\r\n+    private final Map<String, String> serviceToAppsMapping = new HashMap<>();\r\n+\r\n+    private URL registryURL;\r\n+\r\n+    /**\r\n+     * A cache for all URLs of services that the subscribed services exported\r\n+     * The key is the service name\r\n+     * The value is a nested {@link Map} whose key is the revision and value is all URLs of services\r\n+     */\r\n+    private final Map<String, Map<String, List<URL>>> serviceRevisionExportedURLsCache = new LinkedHashMap<>();\r\n+\r\n+    public ServiceDiscoveryRegistry(URL registryURL) {\r\n+        this.registryURL = registryURL;\r\n+        this.serviceDiscovery = createServiceDiscovery(registryURL);\r\n+        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\r\n+        this.serviceNameMapping = ServiceNameMapping.getExtension(registryURL.getParameter(MAPPING_KEY));\r\n+        this.writableMetadataService = WritableMetadataService.getDefaultExtension();\r\n+    }\r\n+\r\n+    public ServiceDiscovery getServiceDiscovery() {\r\n+        return serviceDiscovery;\r\n+    }\r\n+\r\n+    /**\r\n+     * Create the {@link ServiceDiscovery} from the registry {@link URL}\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return non-null\r\n+     */\r\n+    protected ServiceDiscovery createServiceDiscovery(URL registryURL) {\r\n+        ServiceDiscovery originalServiceDiscovery = getServiceDiscovery(registryURL);\r\n+        ServiceDiscovery serviceDiscovery = enhanceEventPublishing(originalServiceDiscovery);\r\n+        execute(() -> {\r\n+            serviceDiscovery.initialize(registryURL.addParameter(INTERFACE_KEY, ServiceDiscovery.class.getName())\r\n+                    .removeParameter(REGISTRY_TYPE_KEY));\r\n+        });\r\n+        return serviceDiscovery;\r\n+    }\r\n+\r\n+    private List<SubscribedURLsSynthesizer> initSubscribedURLsSynthesizers() {\r\n+        ExtensionLoader<SubscribedURLsSynthesizer> loader = ExtensionLoader.getExtensionLoader(SubscribedURLsSynthesizer.class);\r\n+        return Collections.unmodifiableList(new ArrayList<>(loader.getSupportedExtensionInstances()));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the instance {@link ServiceDiscovery} from the registry {@link URL} using\r\n+     * {@link ServiceDiscoveryFactory} SPI\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return\r\n+     */\r\n+    private ServiceDiscovery getServiceDiscovery(URL registryURL) {\r\n+        ServiceDiscoveryFactory factory = getExtension(registryURL);\r\n+        return factory.getServiceDiscovery(registryURL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Enhance the original {@link ServiceDiscovery} with event publishing feature\r\n+     *\r\n+     * @param original the original {@link ServiceDiscovery}\r\n+     * @return {@link EventPublishingServiceDiscovery} instance\r\n+     */\r\n+    private ServiceDiscovery enhanceEventPublishing(ServiceDiscovery original) {\r\n+        return new EventPublishingServiceDiscovery(original);\r\n+    }\r\n+\r\n+    protected boolean shouldRegister(URL providerURL) {\r\n+\r\n+        String side = providerURL.getParameter(SIDE_KEY);\r\n+\r\n+        boolean should = PROVIDER_SIDE.equals(side); // Only register the Provider.\r\n+\r\n+        if (!should) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(String.format(\"The URL[%s] should not be registered.\", providerURL.toString()));\r\n+            }\r\n+        }\r\n+\r\n+        return should;\r\n+    }\r\n+\r\n+    protected boolean shouldSubscribe(URL subscribedURL) {\r\n+        return !shouldRegister(subscribedURL);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void register(URL url) {\r\n+        if (!shouldRegister(url)) { // Should Not Register\r\n+            return;\r\n+        }\r\n+        doRegister(url);\r\n+    }\r\n+\r\n+    public void doRegister(URL url) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        if (writableMetadataService.exportURL(url)) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The URL[%s] registered successfully.\", url.toString()));\r\n+            }\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.info(format(\"The URL[%s] has been registered.\", url.toString()));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unregister(URL url) {\r\n+        if (!shouldRegister(url)) {\r\n+            return;\r\n+        }\r\n+        doUnregister(url);\r\n+    }\r\n+\r\n+    public void doUnregister(URL url) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        if (writableMetadataService.unexportURL(url)) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(format(\"The URL[%s] deregistered successfully.\", url.toString()));\r\n+            }\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.info(format(\"The URL[%s] has been deregistered.\", url.toString()));\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void subscribe(URL url, NotifyListener listener) {\r\n+        if (!shouldSubscribe(url)) { // Should Not Subscribe\r\n+            return;\r\n+        }\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        doSubscribe(url, listener);\r\n+    }\r\n+\r\n+    public void doSubscribe(URL url, NotifyListener listener) {\r\n+        writableMetadataService.subscribeURL(url);\r\n+\r\n+        Set<String> serviceNames = getServices(url, listener);\r\n+\r\n+        if (CollectionUtils.isEmpty(serviceNames)) {\r\n+            logger.warn(\"Should has at least one way to know which services this interface belongs to, subscription url: \" + url);\r\n+            return;\r\n+        }\r\n+\r\n+        subscribeURLs(url, listener, serviceNames);\r\n+    }\r\n+\r\n+    @Override\r\n+    public final void unsubscribe(URL url, NotifyListener listener) {\r\n+        if (!shouldSubscribe(url)) { // Should Not Subscribe\r\n+            return;\r\n+        }\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster != null && url.getParameter(REGISTRY_CLUSTER_KEY) == null) {\r\n+            url = url.addParameter(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+        }\r\n+        doUnsubscribe(url, listener);\r\n+    }\r\n+\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        writableMetadataService.unsubscribeURL(url);\r\n+        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\r\n+        String serviceNamesKey = serviceToAppsMapping.remove(protocolServiceKey);\r\n+        ServiceInstancesChangedListener instancesChangedListener = serviceListeners.get(serviceNamesKey);\r\n+        instancesChangedListener.removeListener(protocolServiceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> lookup(URL url) {\r\n+        throw new UnsupportedOperationException(\"\");\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registryURL;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return !serviceDiscovery.getServices().isEmpty();\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        AbstractRegistryFactory.removeDestroyedRegistry(this);\r\n+        execute(() -> {\r\n+            // stop ServiceDiscovery\r\n+            serviceDiscovery.destroy();\r\n+        });\r\n+    }\r\n+\r\n+    protected void subscribeURLs(URL url, NotifyListener listener, Set<String> serviceNames) {\r\n+        String serviceNamesKey = serviceNames.toString();\r\n+        String protocolServiceKey = url.getServiceKey() + GROUP_CHAR_SEPARATOR + url.getParameter(PROTOCOL_KEY, DUBBO);\r\n+        serviceToAppsMapping.put(protocolServiceKey, serviceNamesKey);\r\n+\r\n+        // register ServiceInstancesChangedListener\r\n+        ServiceInstancesChangedListener serviceListener = serviceListeners.computeIfAbsent(serviceNamesKey,\r\n+                k -> new ServiceInstancesChangedListener(serviceNames, serviceDiscovery));\r\n+        serviceListener.setUrl(url);\r\n+        listener.addServiceListener(serviceListener);\r\n+\r\n+        serviceListener.addListener(protocolServiceKey, listener);\r\n+        registerServiceInstancesChangedListener(url, serviceListener);\r\n+\r\n+        // FIXME: This will cause redundant duplicate notifications\r\n+        serviceNames.forEach(serviceName -> {\r\n+            List<ServiceInstance> serviceInstances = serviceDiscovery.getInstances(serviceName);\r\n+            if (CollectionUtils.isNotEmpty(serviceInstances)) {\r\n+                serviceListener.onEvent(new ServiceInstancesChangedEvent(serviceName, serviceInstances));\r\n+            } else {\r\n+                logger.info(\"getInstances by serviceName=\" + serviceName + \" is empty, waiting for serviceListener callback. url=\" + url);\r\n+            }\r\n+        });\r\n+\r\n+        listener.notify(serviceListener.getUrls(protocolServiceKey));\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Register the {@link ServiceInstancesChangedListener} If absent\r\n+     *\r\n+     * @param url      {@link URL}\r\n+     * @param listener the {@link ServiceInstancesChangedListener}\r\n+     */\r\n+    private void registerServiceInstancesChangedListener(URL url, ServiceInstancesChangedListener listener) {\r\n+        String listenerId = createListenerId(url, listener);\r\n+        if (registeredListeners.add(listenerId)) {\r\n+            serviceDiscovery.addServiceInstancesChangedListener(listener);\r\n+        }\r\n+    }\r\n+\r\n+    private String createListenerId(URL url, ServiceInstancesChangedListener listener) {\r\n+        return listener.getServiceNames() + \":\" + url.toString(VERSION_KEY, GROUP_KEY, PROTOCOL_KEY);\r\n+    }\r\n+\r\n+    /**\r\n+     * 1.developer explicitly specifies the application name this interface belongs to\r\n+     * 2.check Interface-App mapping\r\n+     * 3.use the services specified in registry url.\r\n+     *\r\n+     * @param subscribedURL\r\n+     * @return\r\n+     */\r\n+    protected Set<String> getServices(URL subscribedURL, final NotifyListener listener) {\r\n+        Set<String> subscribedServices = new TreeSet<>();\r\n+\r\n+        String serviceNames = subscribedURL.getParameter(PROVIDED_BY);\r\n+        if (StringUtils.isNotEmpty(serviceNames)) {\r\n+            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by provided-by set by user.\");\r\n+            subscribedServices.addAll(parseServices(serviceNames));\r\n+        }\r\n+\r\n+        if (isEmpty(subscribedServices)) {\r\n+            Set<String> mappedServices = findMappedServices(subscribedURL, new DefaultMappingListener(subscribedURL, subscribedServices, listener));\r\n+            logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" instructed by remote metadata center.\");\r\n+            subscribedServices.addAll(mappedServices);\r\n+            if (isEmpty(subscribedServices)) {\r\n+                logger.info(subscribedURL.getServiceInterface() + \" mapping to \" + serviceNames + \" by default.\");\r\n+                subscribedServices.addAll(getSubscribedServices());\r\n+            }\r\n+        }\r\n+        return subscribedServices;\r\n+    }\r\n+\r\n+    public static Set<String> parseServices(String literalServices) {\r\n+        return isBlank(literalServices) ? emptySet() :\r\n+                unmodifiableSet(of(literalServices.split(\",\"))\r\n+                        .map(String::trim)\r\n+                        .filter(StringUtils::isNotEmpty)\r\n+                        .collect(toSet()));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the subscribed service names\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    public Set<String> getSubscribedServices() {\r\n+        return subscribedServices;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the mapped services name by the specified {@link URL}\r\n+     *\r\n+     * @param subscribedURL\r\n+     * @return\r\n+     */\r\n+    protected Set<String> findMappedServices(URL subscribedURL, MappingListener listener) {\r\n+        return serviceNameMapping.getAndListen(subscribedURL, listener);\r\n+    }\r\n+\r\n+    /**\r\n+     * Create an instance of {@link ServiceDiscoveryRegistry} if supported\r\n+     *\r\n+     * @param registryURL the {@link URL url} of registry\r\n+     * @return <code>null</code> if not supported\r\n+     */\r\n+    public static ServiceDiscoveryRegistry create(URL registryURL) {\r\n+        return supports(registryURL) ? new ServiceDiscoveryRegistry(registryURL) : null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Supports or not ?\r\n+     *\r\n+     * @param registryURL the {@link URL url} of registry\r\n+     * @return if supported, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public static boolean supports(URL registryURL) {\r\n+        return SERVICE_REGISTRY_TYPE.equalsIgnoreCase(registryURL.getParameter(REGISTRY_TYPE_KEY));\r\n+    }\r\n+\r\n+    private static List<URL> filterSubscribedURLs(URL subscribedURL, List<URL> exportedURLs) {\r\n+        return exportedURLs.stream()\r\n+                .filter(url -> isSameServiceInterface(subscribedURL, url))\r\n+                .filter(url -> isSameParameter(subscribedURL, url, VERSION_KEY))\r\n+                .filter(url -> isSameParameter(subscribedURL, url, GROUP_KEY))\r\n+                .filter(url -> isCompatibleProtocol(subscribedURL, url))\r\n+                .collect(Collectors.toList());\r\n+    }\r\n+\r\n+    private static boolean isSameServiceInterface(URL one, URL another) {\r\n+        return Objects.equals(one.getServiceInterface(), another.getServiceInterface());\r\n+    }\r\n+\r\n+    private static boolean isSameParameter(URL one, URL another, String key) {\r\n+        return Objects.equals(one.getParameter(key), another.getParameter(key));\r\n+    }\r\n+\r\n+    private static boolean isCompatibleProtocol(URL one, URL another) {\r\n+        String protocol = one.getParameter(PROTOCOL_KEY);\r\n+        return isCompatibleProtocol(protocol, another);\r\n+    }\r\n+\r\n+    private static boolean isCompatibleProtocol(String protocol, URL targetURL) {\r\n+        return protocol == null || Objects.equals(protocol, targetURL.getParameter(PROTOCOL_KEY))\r\n+                || Objects.equals(protocol, targetURL.getProtocol());\r\n+    }\r\n+\r\n+    private class DefaultMappingListener implements MappingListener {\r\n+        private URL url;\r\n+        private Set<String> oldApps;\r\n+        private NotifyListener listener;\r\n+\r\n+        public DefaultMappingListener(URL subscribedURL, Set<String> serviceNames, NotifyListener listener) {\r\n+            this.url = subscribedURL;\r\n+            this.oldApps = serviceNames;\r\n+            this.listener = listener;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void onEvent(MappingChangedEvent event) {\r\n+            Set<String> newApps = event.getApps();\r\n+            Set<String> tempOldApps = oldApps;\r\n+            oldApps = newApps;\r\n+\r\n+            if (CollectionUtils.isEmpty(newApps)) {\r\n+                return;\r\n+            }\r\n+\r\n+            if (CollectionUtils.isEmpty(tempOldApps) && newApps.size() > 0) {\r\n+                subscribeURLs(url, listener, newApps);\r\n+                return;\r\n+            }\r\n+\r\n+            for (String newAppName : newApps) {\r\n+                if (!tempOldApps.contains(newAppName)) {\r\n+                    subscribeURLs(url, listener, newApps);\r\n+                    return;\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryDirectory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,265 +1,265 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.Assert;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.registry.AddressListener;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.integration.DynamicDirectory;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.RpcContext;\n-\n-import java.util.ArrayList;\n-import java.util.Collection;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.DISABLED_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ENABLED_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\n-\n-public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> implements NotifyListener {\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class);\n-\n-    // instance address to invoker mapping.\n-    private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference\n-\n-    private ServiceInstancesChangedListener listener;\n-\n-    public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {\n-        super(serviceType, url);\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        if (isDestroyed()) {\n-            return false;\n-        }\n-        Map<String, Invoker<T>> localUrlInvokerMap = urlInvokerMap;\n-        if (localUrlInvokerMap != null && localUrlInvokerMap.size() > 0) {\n-            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\n-                if (invoker.isAvailable()) {\n-                    return true;\n-                }\n-            }\n-        }\n-        return false;\n-    }\n-\n-    @Override\n-    public synchronized void notify(List<URL> instanceUrls) {\n-        // Set the context of the address notification thread.\n-        RpcContext.setRpcContext(getConsumerUrl());\n-\n-        /**\n-         * 3.x added for extend URL address\n-         */\n-        ExtensionLoader<AddressListener> addressListenerExtensionLoader = ExtensionLoader.getExtensionLoader(AddressListener.class);\n-        List<AddressListener> supportedListeners = addressListenerExtensionLoader.getActivateExtension(getUrl(), (String[]) null);\n-        if (supportedListeners != null && !supportedListeners.isEmpty()) {\n-            for (AddressListener addressListener : supportedListeners) {\n-                instanceUrls = addressListener.notify(instanceUrls, getConsumerUrl(), this);\n-            }\n-        }\n-\n-        refreshInvoker(instanceUrls);\n-    }\n-\n-    private void refreshInvoker(List<URL> invokerUrls) {\n-        Assert.notNull(invokerUrls, \"invokerUrls should not be null, use empty url list to clear address.\");\n-\n-        if (invokerUrls.size() == 0) {\n-            this.forbidden = true; // Forbid to access\n-            this.invokers = Collections.emptyList();\n-            routerChain.setInvokers(this.invokers);\n-            destroyAllInvokers(); // Close all invokers\n-            return;\n-        }\n-\n-        this.forbidden = false; // Allow to access\n-        Map<String, Invoker<T>> oldUrlInvokerMap = this.urlInvokerMap; // local reference\n-        if (CollectionUtils.isEmpty(invokerUrls)) {\n-            return;\n-        }\n-\n-        Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);// Translate url list to Invoker map\n-\n-        if (CollectionUtils.isEmptyMap(newUrlInvokerMap)) {\n-            logger.error(new IllegalStateException(\"Cannot create invokers from url address list (total \" + invokerUrls.size() + \")\"));\n-            return;\n-        }\n-\n-        List<Invoker<T>> newInvokers = Collections.unmodifiableList(new ArrayList<>(newUrlInvokerMap.values()));\n-        // pre-route and build cache, notice that route cache should build on original Invoker list.\n-        // toMergeMethodInvokerMap() will wrap some invokers having different groups, those wrapped invokers not should be routed.\n-        routerChain.setInvokers(newInvokers);\n-        this.invokers = multiGroup ? toMergeInvokerList(newInvokers) : newInvokers;\n-        this.urlInvokerMap = newUrlInvokerMap;\n-\n-        if (oldUrlInvokerMap != null) {\n-            try {\n-                destroyUnusedInvokers(oldUrlInvokerMap, newUrlInvokerMap); // Close the unused Invoker\n-            } catch (Exception e) {\n-                logger.warn(\"destroyUnusedInvokers error. \", e);\n-            }\n-        }\n-\n-        // notify invokers refreshed\n-        this.invokersChanged();\n-    }\n-\n-    /**\n-     * Turn urls into invokers, and if url has been refer, will not re-reference.\n-     *\n-     * @param urls\n-     * @return invokers\n-     */\n-    private Map<String, Invoker<T>> toInvokers(List<URL> urls) {\n-        Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<>();\n-        if (urls == null || urls.isEmpty()) {\n-            return newUrlInvokerMap;\n-        }\n-        for (URL url : urls) {\n-            InstanceAddressURL instanceAddressURL = (InstanceAddressURL) url;\n-            if (EMPTY_PROTOCOL.equals(instanceAddressURL.getProtocol())) {\n-                continue;\n-            }\n-            if (!ExtensionLoader.getExtensionLoader(Protocol.class).hasExtension(instanceAddressURL.getProtocol())) {\n-                logger.error(new IllegalStateException(\"Unsupported protocol \" + instanceAddressURL.getProtocol() +\n-                        \" in notified url: \" + instanceAddressURL + \" from registry \" + getUrl().getAddress() +\n-                        \" to consumer \" + NetUtils.getLocalHost() + \", supported protocol: \" +\n-                        ExtensionLoader.getExtensionLoader(Protocol.class).getSupportedExtensions()));\n-                continue;\n-            }\n-\n-            // FIXME, some keys may need to be removed.\n-            instanceAddressURL.addConsumerParams(getConsumerUrl().getProtocolServiceKey(), queryMap);\n-\n-            Invoker<T> invoker = urlInvokerMap == null ? null : urlInvokerMap.get(instanceAddressURL.getAddress());\n-            if (invoker == null || urlChanged(invoker, instanceAddressURL)) { // Not in the cache, refer again\n-                try {\n-                    boolean enabled = true;\n-                    if (instanceAddressURL.hasParameter(DISABLED_KEY)) {\n-                        enabled = !instanceAddressURL.getParameter(DISABLED_KEY, false);\n-                    } else {\n-                        enabled = instanceAddressURL.getParameter(ENABLED_KEY, true);\n-                    }\n-                    if (enabled) {\n-                        invoker = protocol.refer(serviceType, instanceAddressURL);\n-                    }\n-                } catch (Throwable t) {\n-                    logger.error(\"Failed to refer invoker for interface:\" + serviceType + \",url:(\" + instanceAddressURL + \")\" + t.getMessage(), t);\n-                }\n-                if (invoker != null) { // Put new invoker in cache\n-                    newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\n-                }\n-            } else {\n-                newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\n-            }\n-        }\n-        return newUrlInvokerMap;\n-    }\n-\n-    private boolean urlChanged(Invoker<T> invoker, InstanceAddressURL newURL) {\n-        InstanceAddressURL oldURL = (InstanceAddressURL) invoker.getUrl();\n-\n-        if (!newURL.getInstance().equals(oldURL.getInstance())) {\n-            return true;\n-        }\n-\n-        return !oldURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey())\n-                .equals(newURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey()));\n-    }\n-\n-    private List<Invoker<T>> toMergeInvokerList(List<Invoker<T>> invokers) {\n-        return invokers;\n-    }\n-\n-    /**\n-     * Close all invokers\n-     */\n-    @Override\n-    protected void destroyAllInvokers() {\n-        Map<String, Invoker<T>> localUrlInvokerMap = this.urlInvokerMap; // local reference\n-        if (localUrlInvokerMap != null) {\n-            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\n-                try {\n-                    invoker.destroy();\n-                } catch (Throwable t) {\n-                    logger.warn(\"Failed to destroy service \" + serviceKey + \" to provider \" + invoker.getUrl(), t);\n-                }\n-            }\n-            localUrlInvokerMap.clear();\n-        }\n-        invokers = null;\n-    }\n-\n-    /**\n-     * Check whether the invoker in the cache needs to be destroyed\n-     * If set attribute of url: refer.autodestroy=false, the invokers will only increase without decreasing,there may be a refer leak\n-     *\n-     * @param oldUrlInvokerMap\n-     * @param newUrlInvokerMap\n-     */\n-    private void destroyUnusedInvokers(Map<String, Invoker<T>> oldUrlInvokerMap, Map<String, Invoker<T>> newUrlInvokerMap) {\n-        if (newUrlInvokerMap == null || newUrlInvokerMap.size() == 0) {\n-            destroyAllInvokers();\n-            return;\n-        }\n-        // check deleted invoker\n-        List<String> deleted = null;\n-        if (oldUrlInvokerMap != null) {\n-            Collection<Invoker<T>> newInvokers = newUrlInvokerMap.values();\n-            for (Map.Entry<String, Invoker<T>> entry : oldUrlInvokerMap.entrySet()) {\n-                if (!newInvokers.contains(entry.getValue())) {\n-                    if (deleted == null) {\n-                        deleted = new ArrayList<>();\n-                    }\n-                    deleted.add(entry.getKey());\n-                }\n-            }\n-        }\n-\n-        if (deleted != null) {\n-            for (String addressKey : deleted) {\n-                if (addressKey != null) {\n-                    Invoker<T> invoker = oldUrlInvokerMap.remove(addressKey);\n-                    if (invoker != null) {\n-                        try {\n-                            invoker.destroy();\n-                            if (logger.isDebugEnabled()) {\n-                                logger.debug(\"destroy invoker[\" + invoker.getUrl() + \"] success. \");\n-                            }\n-                        } catch (Exception e) {\n-                            logger.warn(\"destroy invoker[\" + invoker.getUrl() + \"] failed. \" + e.getMessage(), e);\n-                        }\n-                    }\n-                }\n-            }\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.Assert;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NetUtils;\r\n+import org.apache.dubbo.registry.AddressListener;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.integration.DynamicDirectory;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.RpcContext;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collection;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DISABLED_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ENABLED_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.EMPTY_PROTOCOL;\r\n+\r\n+public class ServiceDiscoveryRegistryDirectory<T> extends DynamicDirectory<T> implements NotifyListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryRegistryDirectory.class);\r\n+\r\n+    // instance address to invoker mapping.\r\n+    private volatile Map<String, Invoker<T>> urlInvokerMap; // The initial value is null and the midway may be assigned to null, please use the local variable reference\r\n+\r\n+    private ServiceInstancesChangedListener listener;\r\n+\r\n+    public ServiceDiscoveryRegistryDirectory(Class<T> serviceType, URL url) {\r\n+        super(serviceType, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        if (isDestroyed()) {\r\n+            return false;\r\n+        }\r\n+        Map<String, Invoker<T>> localUrlInvokerMap = urlInvokerMap;\r\n+        if (localUrlInvokerMap != null && localUrlInvokerMap.size() > 0) {\r\n+            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\r\n+                if (invoker.isAvailable()) {\r\n+                    return true;\r\n+                }\r\n+            }\r\n+        }\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void notify(List<URL> instanceUrls) {\r\n+        // Set the context of the address notification thread.\r\n+        RpcContext.setRpcContext(getConsumerUrl());\r\n+\r\n+        /**\r\n+         * 3.x added for extend URL address\r\n+         */\r\n+        ExtensionLoader<AddressListener> addressListenerExtensionLoader = ExtensionLoader.getExtensionLoader(AddressListener.class);\r\n+        List<AddressListener> supportedListeners = addressListenerExtensionLoader.getActivateExtension(getUrl(), (String[]) null);\r\n+        if (supportedListeners != null && !supportedListeners.isEmpty()) {\r\n+            for (AddressListener addressListener : supportedListeners) {\r\n+                instanceUrls = addressListener.notify(instanceUrls, getConsumerUrl(), this);\r\n+            }\r\n+        }\r\n+\r\n+        refreshInvoker(instanceUrls);\r\n+    }\r\n+\r\n+    private void refreshInvoker(List<URL> invokerUrls) {\r\n+        Assert.notNull(invokerUrls, \"invokerUrls should not be null, use empty url list to clear address.\");\r\n+\r\n+        if (invokerUrls.size() == 0) {\r\n+            this.forbidden = true; // Forbid to access\r\n+            this.invokers = Collections.emptyList();\r\n+            routerChain.setInvokers(this.invokers);\r\n+            destroyAllInvokers(); // Close all invokers\r\n+            return;\r\n+        }\r\n+\r\n+        this.forbidden = false; // Allow to access\r\n+        Map<String, Invoker<T>> oldUrlInvokerMap = this.urlInvokerMap; // local reference\r\n+        if (CollectionUtils.isEmpty(invokerUrls)) {\r\n+            return;\r\n+        }\r\n+\r\n+        Map<String, Invoker<T>> newUrlInvokerMap = toInvokers(invokerUrls);// Translate url list to Invoker map\r\n+\r\n+        if (CollectionUtils.isEmptyMap(newUrlInvokerMap)) {\r\n+            logger.error(new IllegalStateException(\"Cannot create invokers from url address list (total \" + invokerUrls.size() + \")\"));\r\n+            return;\r\n+        }\r\n+\r\n+        List<Invoker<T>> newInvokers = Collections.unmodifiableList(new ArrayList<>(newUrlInvokerMap.values()));\r\n+        // pre-route and build cache, notice that route cache should build on original Invoker list.\r\n+        // toMergeMethodInvokerMap() will wrap some invokers having different groups, those wrapped invokers not should be routed.\r\n+        routerChain.setInvokers(newInvokers);\r\n+        this.invokers = multiGroup ? toMergeInvokerList(newInvokers) : newInvokers;\r\n+        this.urlInvokerMap = newUrlInvokerMap;\r\n+\r\n+        if (oldUrlInvokerMap != null) {\r\n+            try {\r\n+                destroyUnusedInvokers(oldUrlInvokerMap, newUrlInvokerMap); // Close the unused Invoker\r\n+            } catch (Exception e) {\r\n+                logger.warn(\"destroyUnusedInvokers error. \", e);\r\n+            }\r\n+        }\r\n+\r\n+        // notify invokers refreshed\r\n+        this.invokersChanged();\r\n+    }\r\n+\r\n+    /**\r\n+     * Turn urls into invokers, and if url has been refer, will not re-reference.\r\n+     *\r\n+     * @param urls\r\n+     * @return invokers\r\n+     */\r\n+    private Map<String, Invoker<T>> toInvokers(List<URL> urls) {\r\n+        Map<String, Invoker<T>> newUrlInvokerMap = new HashMap<>();\r\n+        if (urls == null || urls.isEmpty()) {\r\n+            return newUrlInvokerMap;\r\n+        }\r\n+        for (URL url : urls) {\r\n+            InstanceAddressURL instanceAddressURL = (InstanceAddressURL) url;\r\n+            if (EMPTY_PROTOCOL.equals(instanceAddressURL.getProtocol())) {\r\n+                continue;\r\n+            }\r\n+            if (!ExtensionLoader.getExtensionLoader(Protocol.class).hasExtension(instanceAddressURL.getProtocol())) {\r\n+                logger.error(new IllegalStateException(\"Unsupported protocol \" + instanceAddressURL.getProtocol() +\r\n+                        \" in notified url: \" + instanceAddressURL + \" from registry \" + getUrl().getAddress() +\r\n+                        \" to consumer \" + NetUtils.getLocalHost() + \", supported protocol: \" +\r\n+                        ExtensionLoader.getExtensionLoader(Protocol.class).getSupportedExtensions()));\r\n+                continue;\r\n+            }\r\n+\r\n+            // FIXME, some keys may need to be removed.\r\n+            instanceAddressURL.addConsumerParams(getConsumerUrl().getProtocolServiceKey(), queryMap);\r\n+\r\n+            Invoker<T> invoker = urlInvokerMap == null ? null : urlInvokerMap.get(instanceAddressURL.getAddress());\r\n+            if (invoker == null || urlChanged(invoker, instanceAddressURL)) { // Not in the cache, refer again\r\n+                try {\r\n+                    boolean enabled = true;\r\n+                    if (instanceAddressURL.hasParameter(DISABLED_KEY)) {\r\n+                        enabled = !instanceAddressURL.getParameter(DISABLED_KEY, false);\r\n+                    } else {\r\n+                        enabled = instanceAddressURL.getParameter(ENABLED_KEY, true);\r\n+                    }\r\n+                    if (enabled) {\r\n+                        invoker = protocol.refer(serviceType, instanceAddressURL);\r\n+                    }\r\n+                } catch (Throwable t) {\r\n+                    logger.error(\"Failed to refer invoker for interface:\" + serviceType + \",url:(\" + instanceAddressURL + \")\" + t.getMessage(), t);\r\n+                }\r\n+                if (invoker != null) { // Put new invoker in cache\r\n+                    newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\r\n+                }\r\n+            } else {\r\n+                newUrlInvokerMap.put(instanceAddressURL.getAddress(), invoker);\r\n+            }\r\n+        }\r\n+        return newUrlInvokerMap;\r\n+    }\r\n+\r\n+    private boolean urlChanged(Invoker<T> invoker, InstanceAddressURL newURL) {\r\n+        InstanceAddressURL oldURL = (InstanceAddressURL) invoker.getUrl();\r\n+\r\n+        if (!newURL.getInstance().equals(oldURL.getInstance())) {\r\n+            return true;\r\n+        }\r\n+\r\n+        return !oldURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey())\r\n+                .equals(newURL.getMetadataInfo().getServiceInfo(getConsumerUrl().getProtocolServiceKey()));\r\n+    }\r\n+\r\n+    private List<Invoker<T>> toMergeInvokerList(List<Invoker<T>> invokers) {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    /**\r\n+     * Close all invokers\r\n+     */\r\n+    @Override\r\n+    protected void destroyAllInvokers() {\r\n+        Map<String, Invoker<T>> localUrlInvokerMap = this.urlInvokerMap; // local reference\r\n+        if (localUrlInvokerMap != null) {\r\n+            for (Invoker<T> invoker : new ArrayList<>(localUrlInvokerMap.values())) {\r\n+                try {\r\n+                    invoker.destroy();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(\"Failed to destroy service \" + serviceKey + \" to provider \" + invoker.getUrl(), t);\r\n+                }\r\n+            }\r\n+            localUrlInvokerMap.clear();\r\n+        }\r\n+        invokers = null;\r\n+    }\r\n+\r\n+    /**\r\n+     * Check whether the invoker in the cache needs to be destroyed\r\n+     * If set attribute of url: refer.autodestroy=false, the invokers will only increase without decreasing,there may be a refer leak\r\n+     *\r\n+     * @param oldUrlInvokerMap\r\n+     * @param newUrlInvokerMap\r\n+     */\r\n+    private void destroyUnusedInvokers(Map<String, Invoker<T>> oldUrlInvokerMap, Map<String, Invoker<T>> newUrlInvokerMap) {\r\n+        if (newUrlInvokerMap == null || newUrlInvokerMap.size() == 0) {\r\n+            destroyAllInvokers();\r\n+            return;\r\n+        }\r\n+        // check deleted invoker\r\n+        List<String> deleted = null;\r\n+        if (oldUrlInvokerMap != null) {\r\n+            Collection<Invoker<T>> newInvokers = newUrlInvokerMap.values();\r\n+            for (Map.Entry<String, Invoker<T>> entry : oldUrlInvokerMap.entrySet()) {\r\n+                if (!newInvokers.contains(entry.getValue())) {\r\n+                    if (deleted == null) {\r\n+                        deleted = new ArrayList<>();\r\n+                    }\r\n+                    deleted.add(entry.getKey());\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (deleted != null) {\r\n+            for (String addressKey : deleted) {\r\n+                if (addressKey != null) {\r\n+                    Invoker<T> invoker = oldUrlInvokerMap.remove(addressKey);\r\n+                    if (invoker != null) {\r\n+                        try {\r\n+                            invoker.destroy();\r\n+                            if (logger.isDebugEnabled()) {\r\n+                                logger.debug(\"destroy invoker[\" + invoker.getUrl() + \"] success. \");\r\n+                            }\r\n+                        } catch (Exception e) {\r\n+                            logger.warn(\"destroy invoker[\" + invoker.getUrl() + \"] failed. \" + e.getMessage(), e);\r\n+                        }\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java", "source2": "org/apache/dubbo/registry/client/ServiceDiscoveryRegistryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\n-\n-public class ServiceDiscoveryRegistryFactory extends AbstractRegistryFactory {\n-\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        if (SERVICE_REGISTRY_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\n-            String protocol = url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\n-            url = url.setProtocol(protocol).removeParameter(REGISTRY_KEY);\n-        }\n-        return new ServiceDiscoveryRegistry(url);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\r\n+\r\n+public class ServiceDiscoveryRegistryFactory extends AbstractRegistryFactory {\r\n+\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        if (SERVICE_REGISTRY_PROTOCOL.equalsIgnoreCase(url.getProtocol())) {\r\n+            String protocol = url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\r\n+            url = url.setProtocol(protocol).removeParameter(REGISTRY_KEY);\r\n+        }\r\n+        return new ServiceDiscoveryRegistry(url);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceInstance.java", "source2": "org/apache/dubbo/registry/client/ServiceInstance.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,126 +1,126 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import java.io.Serializable;\n-import java.util.Map;\n-\n-/**\n- * The model class of an instance of a service, which is used for service registration and discovery.\n- * <p>\n- *\n- * @since 2.7.5\n- */\n-public interface ServiceInstance extends Serializable {\n-\n-    /**\n-     * The id of the registered service instance.\n-     *\n-     * @return nullable\n-     */\n-    String getId();\n-\n-    /**\n-     * The name of service that current instance belongs to.\n-     *\n-     * @return non-null\n-     */\n-    String getServiceName();\n-\n-    /**\n-     * The hostname of the registered service instance.\n-     *\n-     * @return non-null\n-     */\n-    String getHost();\n-\n-    /**\n-     * The port of the registered service instance.\n-     *\n-     * @return the positive integer if present\n-     */\n-    Integer getPort();\n-\n-    String getAddress();\n-\n-    /**\n-     * The enable status of the registered service instance.\n-     *\n-     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client should remove this one.\n-     * The default value is <code>true</code>\n-     */\n-    default boolean isEnabled() {\n-        return true;\n-    }\n-\n-    /**\n-     * The registered service instance is health or not.\n-     *\n-     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client may ignore this one.\n-     * The default value is <code>true</code>\n-     */\n-    default boolean isHealthy() {\n-        return true;\n-    }\n-\n-    /**\n-     * The key / value pair metadata associated with the service instance.\n-     *\n-     * @return non-null, mutable and unsorted {@link Map}\n-     */\n-    Map<String, String> getMetadata();\n-\n-    Map<String, String> getExtendParams();\n-\n-    Map<String, String> getAllParams();\n-\n-    /**\n-     * Get the value of metadata by the specified name\n-     *\n-     * @param name the specified name\n-     * @return the value of metadata if found, or <code>null</code>\n-     * @since 2.7.8\n-     */\n-    default String getMetadata(String name) {\n-        return getMetadata(name, null);\n-    }\n-\n-    /**\n-     * Get the value of metadata by the specified name\n-     *\n-     * @param name the specified name\n-     * @return the value of metadata if found, or <code>defaultValue</code>\n-     * @since 2.7.8\n-     */\n-    default String getMetadata(String name, String defaultValue) {\n-        return getMetadata().getOrDefault(name, defaultValue);\n-    }\n-\n-    /**\n-     * @return the hash code of current instance.\n-     */\n-    int hashCode();\n-\n-    /**\n-     * @param another another {@link ServiceInstance}\n-     * @return if equals , return <code>true</code>, or <code>false</code>\n-     */\n-    boolean equals(Object another);\n-\n-    InstanceAddressURL toURL();\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import java.io.Serializable;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * The model class of an instance of a service, which is used for service registration and discovery.\r\n+ * <p>\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public interface ServiceInstance extends Serializable {\r\n+\r\n+    /**\r\n+     * The id of the registered service instance.\r\n+     *\r\n+     * @return nullable\r\n+     */\r\n+    String getId();\r\n+\r\n+    /**\r\n+     * The name of service that current instance belongs to.\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    String getServiceName();\r\n+\r\n+    /**\r\n+     * The hostname of the registered service instance.\r\n+     *\r\n+     * @return non-null\r\n+     */\r\n+    String getHost();\r\n+\r\n+    /**\r\n+     * The port of the registered service instance.\r\n+     *\r\n+     * @return the positive integer if present\r\n+     */\r\n+    Integer getPort();\r\n+\r\n+    String getAddress();\r\n+\r\n+    /**\r\n+     * The enable status of the registered service instance.\r\n+     *\r\n+     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client should remove this one.\r\n+     * The default value is <code>true</code>\r\n+     */\r\n+    default boolean isEnabled() {\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * The registered service instance is health or not.\r\n+     *\r\n+     * @return if <code>true</code>, indicates current instance is enabled, or disable, the client may ignore this one.\r\n+     * The default value is <code>true</code>\r\n+     */\r\n+    default boolean isHealthy() {\r\n+        return true;\r\n+    }\r\n+\r\n+    /**\r\n+     * The key / value pair metadata associated with the service instance.\r\n+     *\r\n+     * @return non-null, mutable and unsorted {@link Map}\r\n+     */\r\n+    Map<String, String> getMetadata();\r\n+\r\n+    Map<String, String> getExtendParams();\r\n+\r\n+    Map<String, String> getAllParams();\r\n+\r\n+    /**\r\n+     * Get the value of metadata by the specified name\r\n+     *\r\n+     * @param name the specified name\r\n+     * @return the value of metadata if found, or <code>null</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    default String getMetadata(String name) {\r\n+        return getMetadata(name, null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the value of metadata by the specified name\r\n+     *\r\n+     * @param name the specified name\r\n+     * @return the value of metadata if found, or <code>defaultValue</code>\r\n+     * @since 2.7.8\r\n+     */\r\n+    default String getMetadata(String name, String defaultValue) {\r\n+        return getMetadata().getOrDefault(name, defaultValue);\r\n+    }\r\n+\r\n+    /**\r\n+     * @return the hash code of current instance.\r\n+     */\r\n+    int hashCode();\r\n+\r\n+    /**\r\n+     * @param another another {@link ServiceInstance}\r\n+     * @return if equals , return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean equals(Object another);\r\n+\r\n+    InstanceAddressURL toURL();\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java", "source2": "org/apache/dubbo/registry/client/ServiceInstanceCustomizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,38 +1,38 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-\n-/**\n- * The interface to customize {@link ServiceInstance the service instance} on {@link ServiceInstancePreRegisteredEvent}\n- *\n- * @see ServiceInstance#getMetadata()\n- * @since 2.7.5\n- */\n-@SPI\n-public interface ServiceInstanceCustomizer extends Prioritized {\n-\n-    /**\n-     * Customizes {@link ServiceInstance the service instance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance the service instance}\n-     */\n-    void customize(ServiceInstance serviceInstance);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+\r\n+/**\r\n+ * The interface to customize {@link ServiceInstance the service instance} on {@link ServiceInstancePreRegisteredEvent}\r\n+ *\r\n+ * @see ServiceInstance#getMetadata()\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface ServiceInstanceCustomizer extends Prioritized {\r\n+\r\n+    /**\r\n+     * Customizes {@link ServiceInstance the service instance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance the service instance}\r\n+     */\r\n+    void customize(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised after the {@link ServiceDiscovery Service Discovery} destroyed.\n- *\n- * @see ServiceDiscovery#destroy()\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryDestroyedEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryDestroyedEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceDiscovery Service Discovery} destroyed.\r\n+ *\r\n+ * @see ServiceDiscovery#destroy()\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryDestroyedEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryDestroyedEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryDestroyingEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} is destroying.\n- *\n- * @see ServiceDiscovery#destroy()\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryDestroyingEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryDestroyingEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} is destroying.\r\n+ *\r\n+ * @see ServiceDiscovery#destroy()\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryDestroyingEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryDestroyingEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,67 +1,67 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An abstract {@link Event} class for {@link ServiceDiscovery}\n- *\n- * @see Event\n- * @see ServiceDiscovery\n- * @since 2.7.5\n- */\n-public abstract class ServiceDiscoveryEvent extends Event {\n-\n-    private final ServiceDiscovery original;\n-\n-    /**\n-     * Constructs a prototypical Event.\n-     *\n-     * @param source   The object on which the Event initially occurred.\n-     * @param original The original {@link ServiceDiscovery}\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public ServiceDiscoveryEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source);\n-        this.original = original;\n-    }\n-\n-    @Override\n-    public ServiceDiscovery getSource() {\n-        return (ServiceDiscovery) super.getSource();\n-    }\n-\n-    /**\n-     * Get the {@link ServiceDiscovery} on which the Event initially occurred.\n-     *\n-     * @return {@link ServiceDiscovery} instance\n-     */\n-    public final ServiceDiscovery getServiceDiscovery() {\n-        return getSource();\n-    }\n-\n-    /**\n-     * Get the original {@link ServiceDiscovery}\n-     *\n-     * @return the original {@link ServiceDiscovery}\n-     */\n-    public final ServiceDiscovery getOriginal() {\n-        return original;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An abstract {@link Event} class for {@link ServiceDiscovery}\r\n+ *\r\n+ * @see Event\r\n+ * @see ServiceDiscovery\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class ServiceDiscoveryEvent extends Event {\r\n+\r\n+    private final ServiceDiscovery original;\r\n+\r\n+    /**\r\n+     * Constructs a prototypical Event.\r\n+     *\r\n+     * @param source   The object on which the Event initially occurred.\r\n+     * @param original The original {@link ServiceDiscovery}\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public ServiceDiscoveryEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source);\r\n+        this.original = original;\r\n+    }\r\n+\r\n+    @Override\r\n+    public ServiceDiscovery getSource() {\r\n+        return (ServiceDiscovery) super.getSource();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link ServiceDiscovery} on which the Event initially occurred.\r\n+     *\r\n+     * @return {@link ServiceDiscovery} instance\r\n+     */\r\n+    public final ServiceDiscovery getServiceDiscovery() {\r\n+        return getSource();\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the original {@link ServiceDiscovery}\r\n+     *\r\n+     * @return the original {@link ServiceDiscovery}\r\n+     */\r\n+    public final ServiceDiscovery getOriginal() {\r\n+        return original;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryExceptionEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,48 +1,48 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} met with some exception\n- *\n- * @see ServiceDiscovery\n- * @see org.apache.dubbo.event.Event\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryExceptionEvent extends ServiceDiscoveryEvent {\n-\n-    private final Throwable cause;\n-\n-    public ServiceDiscoveryExceptionEvent(ServiceDiscovery source, ServiceDiscovery original, Throwable cause) {\n-        super(source, original);\n-        if (cause == null) {\n-            throw new NullPointerException(\"The cause of Exception must not null\");\n-        }\n-        this.cause = cause;\n-    }\n-\n-    /**\n-     * The cause of {@link Throwable}\n-     *\n-     * @return non-nul\n-     */\n-    public Throwable getCause() {\n-        return cause;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} met with some exception\r\n+ *\r\n+ * @see ServiceDiscovery\r\n+ * @see org.apache.dubbo.event.Event\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryExceptionEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    private final Throwable cause;\r\n+\r\n+    public ServiceDiscoveryExceptionEvent(ServiceDiscovery source, ServiceDiscovery original, Throwable cause) {\r\n+        super(source, original);\r\n+        if (cause == null) {\r\n+            throw new NullPointerException(\"The cause of Exception must not null\");\r\n+        }\r\n+        this.cause = cause;\r\n+    }\r\n+\r\n+    /**\r\n+     * The cause of {@link Throwable}\r\n+     *\r\n+     * @return non-nul\r\n+     */\r\n+    public Throwable getCause() {\r\n+        return cause;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised after the {@link ServiceDiscovery Service Discovery} initialized\n- *\n- * @see ServiceDiscovery#initialize(URL)\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryInitializedEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryInitializedEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceDiscovery Service Discovery} initialized\r\n+ *\r\n+ * @see ServiceDiscovery#initialize(URL)\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryInitializedEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryInitializedEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceDiscoveryInitializingEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,33 +1,33 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-/**\n- * An event raised when the {@link ServiceDiscovery Service Discovery} is initializing.\n- *\n- * @see ServiceDiscovery#initialize(URL)\n- * @since 2.7.5\n- */\n-public class ServiceDiscoveryInitializingEvent extends ServiceDiscoveryEvent {\n-\n-    public ServiceDiscoveryInitializingEvent(ServiceDiscovery source, ServiceDiscovery original) {\n-        super(source, original);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+/**\r\n+ * An event raised when the {@link ServiceDiscovery Service Discovery} is initializing.\r\n+ *\r\n+ * @see ServiceDiscovery#initialize(URL)\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceDiscoveryInitializingEvent extends ServiceDiscoveryEvent {\r\n+\r\n+    public ServiceDiscoveryInitializingEvent(ServiceDiscovery source, ServiceDiscovery original) {\r\n+        super(source, original);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,47 +1,47 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-/**\n- * The {@link Event Dubbo event} for {@link ServiceInstance an service instance}\n- *\n- * @since 2.7.5\n- */\n-public abstract class ServiceInstanceEvent extends Event {\n-\n-    private final ServiceInstance serviceInstance;\n-\n-    /**\n-     * @param serviceInstance {@link ServiceInstance an service instance}\n-     */\n-    public ServiceInstanceEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source);\n-        this.serviceInstance = serviceInstance;\n-    }\n-\n-    /**\n-     * Get current {@link ServiceInstance service instance}\n-     *\n-     * @return current {@link ServiceInstance service instance}\n-     */\n-    public ServiceInstance getServiceInstance() {\n-        return serviceInstance;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+/**\r\n+ * The {@link Event Dubbo event} for {@link ServiceInstance an service instance}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public abstract class ServiceInstanceEvent extends Event {\r\n+\r\n+    private final ServiceInstance serviceInstance;\r\n+\r\n+    /**\r\n+     * @param serviceInstance {@link ServiceInstance an service instance}\r\n+     */\r\n+    public ServiceInstanceEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source);\r\n+        this.serviceInstance = serviceInstance;\r\n+    }\r\n+\r\n+    /**\r\n+     * Get current {@link ServiceInstance service instance}\r\n+     *\r\n+     * @return current {@link ServiceInstance service instance}\r\n+     */\r\n+    public ServiceInstance getServiceInstance() {\r\n+        return serviceInstance;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancePreRegisteredEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised before a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#register(ServiceInstance) registered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePreRegisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstancePreRegisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised before a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#register(ServiceInstance) registered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePreRegisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstancePreRegisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancePreUnregisteredEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised before a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstancePreUnregisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstancePreUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised before a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancePreUnregisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstancePreUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceRegisteredEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,34 +1,34 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised after a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#register(ServiceInstance) registered}\n- *\n- * @since 2.7.5\n- */\n-public class ServiceInstanceRegisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstanceRegisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised after a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#register(ServiceInstance) registered}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceRegisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstanceRegisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstanceUnregisteredEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,35 +1,35 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-\n-/**\n- * An event raised after a {@link ServiceInstance service instance}\n- * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\n- *\n- * @see ServiceInstanceEvent\n- * @since 2.7.5\n- */\n-public class ServiceInstanceUnregisteredEvent extends ServiceInstanceEvent {\n-\n-    public ServiceInstanceUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\n-        super(source, serviceInstance);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+\r\n+/**\r\n+ * An event raised after a {@link ServiceInstance service instance}\r\n+ * {@link ServiceDiscovery#unregister(ServiceInstance) unregistered}\r\n+ *\r\n+ * @see ServiceInstanceEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceUnregisteredEvent extends ServiceInstanceEvent {\r\n+\r\n+    public ServiceInstanceUnregisteredEvent(Object source, ServiceInstance serviceInstance) {\r\n+        super(source, serviceInstance);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java", "source2": "org/apache/dubbo/registry/client/event/ServiceInstancesChangedEvent.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event;\n-\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-\n-import java.util.List;\n-\n-import static java.util.Collections.unmodifiableList;\n-\n-/**\n- * An event raised after the {@link ServiceInstance instances} of one service has been changed.\n- *\n- * @see ServiceInstancesChangedListener\n- * @since 2.7.5\n- */\n-public class ServiceInstancesChangedEvent extends Event {\n-\n-    private final String serviceName;\n-\n-    private final List<ServiceInstance> serviceInstances;\n-\n-    /**\n-     * @param serviceName      The name of service that was changed\n-     * @param serviceInstances all {@link ServiceInstance service instances}\n-     * @throws IllegalArgumentException if source is null.\n-     */\n-    public ServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\n-        super(serviceName);\n-        this.serviceName = serviceName;\n-        this.serviceInstances = unmodifiableList(serviceInstances);\n-    }\n-\n-    /**\n-     * @return The name of service that was changed\n-     */\n-    public String getServiceName() {\n-        return serviceName;\n-    }\n-\n-\n-    /**\n-     * @return all {@link ServiceInstance service instances}\n-     */\n-    public List<ServiceInstance> getServiceInstances() {\n-        return serviceInstances;\n-    }\n-\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event;\r\n+\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+\r\n+import java.util.List;\r\n+\r\n+import static java.util.Collections.unmodifiableList;\r\n+\r\n+/**\r\n+ * An event raised after the {@link ServiceInstance instances} of one service has been changed.\r\n+ *\r\n+ * @see ServiceInstancesChangedListener\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancesChangedEvent extends Event {\r\n+\r\n+    private final String serviceName;\r\n+\r\n+    private final List<ServiceInstance> serviceInstances;\r\n+\r\n+    /**\r\n+     * @param serviceName      The name of service that was changed\r\n+     * @param serviceInstances all {@link ServiceInstance service instances}\r\n+     * @throws IllegalArgumentException if source is null.\r\n+     */\r\n+    public ServiceInstancesChangedEvent(String serviceName, List<ServiceInstance> serviceInstances) {\r\n+        super(serviceName);\r\n+        this.serviceName = serviceName;\r\n+        this.serviceInstances = unmodifiableList(serviceInstances);\r\n+    }\r\n+\r\n+    /**\r\n+     * @return The name of service that was changed\r\n+     */\r\n+    public String getServiceName() {\r\n+        return serviceName;\r\n+    }\r\n+\r\n+\r\n+    /**\r\n+     * @return all {@link ServiceInstance service instances}\r\n+     */\r\n+    public List<ServiceInstance> getServiceInstances() {\r\n+        return serviceInstances;\r\n+    }\r\n+\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java", "source2": "org/apache/dubbo/registry/client/event/listener/LoggingEventListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,85 +1,85 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event.listener;\n-\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.event.Event;\n-import org.apache.dubbo.event.GenericEventListener;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\n-import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-\n-import static java.lang.String.format;\n-\n-/**\n- * A listener for logging the {@link Event Dubbo event}\n- *\n- * @since 2.7.5\n- */\n-public class LoggingEventListener extends GenericEventListener {\n-\n-    private final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    public void onEvent(ServiceDiscoveryInitializingEvent event) {\n-        info(\"%s is initializing...\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryInitializedEvent event) {\n-        info(\"%s is initialized.\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceInstancePreRegisteredEvent event) {\n-        info(\"%s is registering into %s...\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstanceRegisteredEvent event) {\n-        info(\"%s has been registered into %s.\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstancesChangedEvent event) {\n-        info(\"The service[name : %s] instances[size : %s] has been changed.\", event.getServiceName(), event.getServiceInstances().size());\n-    }\n-\n-    public void onEvent(ServiceInstancePreUnregisteredEvent event) {\n-        info(\"%s is unregistering from %s...\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceInstanceUnregisteredEvent event) {\n-        info(\"%s has been unregistered from %s.\", event.getServiceInstance(), event.getSource());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryDestroyingEvent event) {\n-        info(\"%s is stopping...\", event.getServiceDiscovery());\n-    }\n-\n-    public void onEvent(ServiceDiscoveryDestroyedEvent event) {\n-        info(\"%s is stopped.\", event.getServiceDiscovery());\n-    }\n-\n-    private void info(String pattern, Object... args) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(format(pattern, args));\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event.listener;\r\n+\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.event.Event;\r\n+import org.apache.dubbo.event.GenericEventListener;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryDestroyingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializedEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceDiscoveryInitializingEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancePreUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceRegisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstanceUnregisteredEvent;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+\r\n+import static java.lang.String.format;\r\n+\r\n+/**\r\n+ * A listener for logging the {@link Event Dubbo event}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class LoggingEventListener extends GenericEventListener {\r\n+\r\n+    private final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    public void onEvent(ServiceDiscoveryInitializingEvent event) {\r\n+        info(\"%s is initializing...\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryInitializedEvent event) {\r\n+        info(\"%s is initialized.\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancePreRegisteredEvent event) {\r\n+        info(\"%s is registering into %s...\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstanceRegisteredEvent event) {\r\n+        info(\"%s has been registered into %s.\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancesChangedEvent event) {\r\n+        info(\"The service[name : %s] instances[size : %s] has been changed.\", event.getServiceName(), event.getServiceInstances().size());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstancePreUnregisteredEvent event) {\r\n+        info(\"%s is unregistering from %s...\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceInstanceUnregisteredEvent event) {\r\n+        info(\"%s has been unregistered from %s.\", event.getServiceInstance(), event.getSource());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryDestroyingEvent event) {\r\n+        info(\"%s is stopping...\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    public void onEvent(ServiceDiscoveryDestroyedEvent event) {\r\n+        info(\"%s is stopped.\", event.getServiceDiscovery());\r\n+    }\r\n+\r\n+    private void info(String pattern, Object... args) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(format(pattern, args));\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java", "source2": "org/apache/dubbo/registry/client/event/listener/ServiceInstancesChangedListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,268 +1,268 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.event.listener;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.event.ConditionalEventListener;\n-import org.apache.dubbo.event.EventListener;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.metadata.MetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.HashMap;\n-import java.util.HashSet;\n-import java.util.LinkedList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Set;\n-import java.util.TreeSet;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-import static org.apache.dubbo.metadata.MetadataInfo.DEFAULT_REVISION;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getExportedServicesRevision;\n-\n-/**\n- * The Service Discovery Changed {@link EventListener Event Listener}\n- *\n- * @see ServiceInstancesChangedEvent\n- * @since 2.7.5\n- */\n-public class ServiceInstancesChangedListener implements ConditionalEventListener<ServiceInstancesChangedEvent> {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceInstancesChangedListener.class);\n-\n-    private final Set<String> serviceNames;\n-    private final ServiceDiscovery serviceDiscovery;\n-    private final String registryId;\n-    private URL url;\n-    private Map<String, Set<NotifyListener>> listeners;\n-\n-    private Map<String, List<ServiceInstance>> allInstances;\n-\n-    private Map<String, List<URL>> serviceUrls;\n-\n-    private Map<String, MetadataInfo> revisionToMetadata;\n-\n-    public ServiceInstancesChangedListener(Set<String> serviceNames, ServiceDiscovery serviceDiscovery) {\n-        this.serviceNames = serviceNames;\n-        this.serviceDiscovery = serviceDiscovery;\n-        this.registryId = serviceDiscovery.getUrl().getParameter(\"id\");\n-        this.listeners = new HashMap<>();\n-        this.allInstances = new HashMap<>();\n-        this.serviceUrls = new HashMap<>();\n-        this.revisionToMetadata = new HashMap<>();\n-    }\n-\n-    /**\n-     * On {@link ServiceInstancesChangedEvent the service instances change event}\n-     *\n-     * @param event {@link ServiceInstancesChangedEvent}\n-     */\n-    public synchronized void onEvent(ServiceInstancesChangedEvent event) {\n-        logger.info(\"Received instance notification, serviceName: \" + event.getServiceName() + \", instances: \" + event.getServiceInstances().size());\n-        String appName = event.getServiceName();\n-        allInstances.put(appName, event.getServiceInstances());\n-        if (logger.isDebugEnabled()) {\n-            logger.debug(event.getServiceInstances().toString());\n-        }\n-\n-        Map<String, List<ServiceInstance>> revisionToInstances = new HashMap<>();\n-        Map<String, Set<String>> localServiceToRevisions = new HashMap<>();\n-        Map<Set<String>, List<URL>> revisionsToUrls = new HashMap();\n-        Map<String, List<URL>> tmpServiceUrls = new HashMap<>();\n-        for (Map.Entry<String, List<ServiceInstance>> entry : allInstances.entrySet()) {\n-            List<ServiceInstance> instances = entry.getValue();\n-            for (ServiceInstance instance : instances) {\n-                String revision = getExportedServicesRevision(instance);\n-                if (DEFAULT_REVISION.equals(revision)) {\n-                    logger.info(\"Find instance without valid service metadata: \" + instance.getAddress());\n-                    continue;\n-                }\n-                List<ServiceInstance> subInstances = revisionToInstances.computeIfAbsent(revision, r -> new LinkedList<>());\n-                subInstances.add(instance);\n-\n-                MetadataInfo metadata = revisionToMetadata.get(revision);\n-                if (metadata == null) {\n-                    metadata = getMetadataInfo(instance);\n-                    logger.info(\"MetadataInfo for instance \" + instance.getAddress() + \"?revision=\" + revision + \" is \" + metadata);\n-                    if (metadata != null) {\n-                        revisionToMetadata.put(revision, metadata);\n-                    } else {\n-\n-                    }\n-                }\n-\n-                if (metadata != null) {\n-                    parseMetadata(revision, metadata, localServiceToRevisions);\n-                    ((DefaultServiceInstance) instance).setServiceMetadata(metadata);\n-                }\n-//                else {\n-//                    logger.error(\"Failed to load service metadata for instance \" + instance);\n-//                    Set<String> set = localServiceToRevisions.computeIfAbsent(url.getServiceKey(), k -> new TreeSet<>());\n-//                    set.add(revision);\n-//                }\n-            }\n-\n-            localServiceToRevisions.forEach((serviceKey, revisions) -> {\n-                List<URL> urls = revisionsToUrls.get(revisions);\n-                if (urls != null) {\n-                    tmpServiceUrls.put(serviceKey, urls);\n-                } else {\n-                    urls = new ArrayList<>();\n-                    for (String r : revisions) {\n-                        for (ServiceInstance i : revisionToInstances.get(r)) {\n-                            urls.add(i.toURL());\n-                        }\n-                    }\n-                    revisionsToUrls.put(revisions, urls);\n-                    tmpServiceUrls.put(serviceKey, urls);\n-                }\n-            });\n-        }\n-\n-        this.serviceUrls = tmpServiceUrls;\n-        this.notifyAddressChanged();\n-    }\n-\n-    private Map<String, Set<String>> parseMetadata(String revision, MetadataInfo metadata, Map<String, Set<String>> localServiceToRevisions) {\n-        Map<String, ServiceInfo> serviceInfos = metadata.getServices();\n-        for (Map.Entry<String, ServiceInfo> entry : serviceInfos.entrySet()) {\n-            Set<String> set = localServiceToRevisions.computeIfAbsent(entry.getKey(), k -> new TreeSet<>());\n-            set.add(revision);\n-        }\n-\n-        return localServiceToRevisions;\n-    }\n-\n-    private MetadataInfo getMetadataInfo(ServiceInstance instance) {\n-        String metadataType = ServiceInstanceMetadataUtils.getMetadataStorageType(instance);\n-        // FIXME, check \"REGISTRY_CLUSTER_KEY\" must be set by every registry implementation.\n-        instance.getExtendParams().putIfAbsent(REGISTRY_CLUSTER_KEY, RegistryClusterIdentifier.getExtension(url).consumerKey(url));\n-        MetadataInfo metadataInfo;\n-        try {\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Instance \" + instance.getAddress() + \" is using metadata type \" + metadataType);\n-            }\n-            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\n-                RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-                metadataInfo = remoteMetadataService.getMetadata(instance);\n-            } else {\n-                MetadataService metadataServiceProxy = MetadataUtils.getMetadataServiceProxy(instance, serviceDiscovery);\n-                metadataInfo = metadataServiceProxy.getMetadataInfo(ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\n-            }\n-            if (logger.isDebugEnabled()) {\n-                logger.info(\"Metadata \" + metadataInfo.toString());\n-            }\n-        } catch (Exception e) {\n-            logger.error(\"Failed to load service metadata, metadata type is \" + metadataType, e);\n-            metadataInfo = null;\n-            // TODO, load metadata backup. Stop getting metadata after x times of failure for one revision?\n-        }\n-        return metadataInfo;\n-    }\n-\n-    private void notifyAddressChanged() {\n-        listeners.forEach((key, notifyListeners) -> {\n-            notifyListeners.forEach(notifyListener -> {\n-                notifyListener.notify(toUrlsWithEmpty(serviceUrls.get(key)));\n-            });\n-        });\n-    }\n-\n-    private List<URL> toUrlsWithEmpty(List<URL> urls) {\n-        if (urls == null) {\n-            urls = Collections.emptyList();\n-        }\n-        return urls;\n-    }\n-\n-    public void addListener(String serviceKey, NotifyListener listener) {\n-        this.listeners.computeIfAbsent(serviceKey, k -> new HashSet<>()).add(listener);\n-    }\n-\n-    public void removeListener(String serviceKey) {\n-        listeners.remove(serviceKey);\n-        if (listeners.isEmpty()) {\n-            serviceDiscovery.removeServiceInstancesChangedListener(this);\n-        }\n-    }\n-\n-    public List<URL> getUrls(String serviceKey) {\n-        return toUrlsWithEmpty(serviceUrls.get(serviceKey));\n-    }\n-\n-    /**\n-     * Get the correlative service name\n-     *\n-     * @return the correlative service name\n-     */\n-    public final Set<String> getServiceNames() {\n-        return serviceNames;\n-    }\n-\n-    public void setUrl(URL url) {\n-        this.url = url;\n-    }\n-\n-    public URL getUrl() {\n-        return url;\n-    }\n-\n-    /**\n-     * @param event {@link ServiceInstancesChangedEvent event}\n-     * @return If service name matches, return <code>true</code>, or <code>false</code>\n-     */\n-    public final boolean accept(ServiceInstancesChangedEvent event) {\n-        return serviceNames.contains(event.getServiceName());\n-    }\n-\n-    public String getRegistryId() {\n-        return registryId;\n-    }\n-\n-    @Override\n-    public boolean equals(Object o) {\n-        if (this == o) {\n-            return true;\n-        }\n-        if (!(o instanceof ServiceInstancesChangedListener)) {\n-            return false;\n-        }\n-        ServiceInstancesChangedListener that = (ServiceInstancesChangedListener) o;\n-        return Objects.equals(getServiceNames(), that.getServiceNames()) && Objects.equals(getRegistryId(), that.getRegistryId());\n-    }\n-\n-    @Override\n-    public int hashCode() {\n-        return Objects.hash(getClass(), getServiceNames(), getRegistryId());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.event.listener;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.event.ConditionalEventListener;\r\n+import org.apache.dubbo.event.EventListener;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.metadata.MetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\r\n+import java.util.HashMap;\r\n+import java.util.HashSet;\r\n+import java.util.LinkedList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Objects;\r\n+import java.util.Set;\r\n+import java.util.TreeSet;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.REMOTE_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+import static org.apache.dubbo.metadata.MetadataInfo.DEFAULT_REVISION;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getExportedServicesRevision;\r\n+\r\n+/**\r\n+ * The Service Discovery Changed {@link EventListener Event Listener}\r\n+ *\r\n+ * @see ServiceInstancesChangedEvent\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstancesChangedListener implements ConditionalEventListener<ServiceInstancesChangedEvent> {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceInstancesChangedListener.class);\r\n+\r\n+    private final Set<String> serviceNames;\r\n+    private final ServiceDiscovery serviceDiscovery;\r\n+    private final String registryId;\r\n+    private URL url;\r\n+    private Map<String, Set<NotifyListener>> listeners;\r\n+\r\n+    private Map<String, List<ServiceInstance>> allInstances;\r\n+\r\n+    private Map<String, List<URL>> serviceUrls;\r\n+\r\n+    private Map<String, MetadataInfo> revisionToMetadata;\r\n+\r\n+    public ServiceInstancesChangedListener(Set<String> serviceNames, ServiceDiscovery serviceDiscovery) {\r\n+        this.serviceNames = serviceNames;\r\n+        this.serviceDiscovery = serviceDiscovery;\r\n+        this.registryId = serviceDiscovery.getUrl().getParameter(\"id\");\r\n+        this.listeners = new HashMap<>();\r\n+        this.allInstances = new HashMap<>();\r\n+        this.serviceUrls = new HashMap<>();\r\n+        this.revisionToMetadata = new HashMap<>();\r\n+    }\r\n+\r\n+    /**\r\n+     * On {@link ServiceInstancesChangedEvent the service instances change event}\r\n+     *\r\n+     * @param event {@link ServiceInstancesChangedEvent}\r\n+     */\r\n+    public synchronized void onEvent(ServiceInstancesChangedEvent event) {\r\n+        logger.info(\"Received instance notification, serviceName: \" + event.getServiceName() + \", instances: \" + event.getServiceInstances().size());\r\n+        String appName = event.getServiceName();\r\n+        allInstances.put(appName, event.getServiceInstances());\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.debug(event.getServiceInstances().toString());\r\n+        }\r\n+\r\n+        Map<String, List<ServiceInstance>> revisionToInstances = new HashMap<>();\r\n+        Map<String, Set<String>> localServiceToRevisions = new HashMap<>();\r\n+        Map<Set<String>, List<URL>> revisionsToUrls = new HashMap();\r\n+        Map<String, List<URL>> tmpServiceUrls = new HashMap<>();\r\n+        for (Map.Entry<String, List<ServiceInstance>> entry : allInstances.entrySet()) {\r\n+            List<ServiceInstance> instances = entry.getValue();\r\n+            for (ServiceInstance instance : instances) {\r\n+                String revision = getExportedServicesRevision(instance);\r\n+                if (DEFAULT_REVISION.equals(revision)) {\r\n+                    logger.info(\"Find instance without valid service metadata: \" + instance.getAddress());\r\n+                    continue;\r\n+                }\r\n+                List<ServiceInstance> subInstances = revisionToInstances.computeIfAbsent(revision, r -> new LinkedList<>());\r\n+                subInstances.add(instance);\r\n+\r\n+                MetadataInfo metadata = revisionToMetadata.get(revision);\r\n+                if (metadata == null) {\r\n+                    metadata = getMetadataInfo(instance);\r\n+                    logger.info(\"MetadataInfo for instance \" + instance.getAddress() + \"?revision=\" + revision + \" is \" + metadata);\r\n+                    if (metadata != null) {\r\n+                        revisionToMetadata.put(revision, metadata);\r\n+                    } else {\r\n+\r\n+                    }\r\n+                }\r\n+\r\n+                if (metadata != null) {\r\n+                    parseMetadata(revision, metadata, localServiceToRevisions);\r\n+                    ((DefaultServiceInstance) instance).setServiceMetadata(metadata);\r\n+                }\r\n+//                else {\r\n+//                    logger.error(\"Failed to load service metadata for instance \" + instance);\r\n+//                    Set<String> set = localServiceToRevisions.computeIfAbsent(url.getServiceKey(), k -> new TreeSet<>());\r\n+//                    set.add(revision);\r\n+//                }\r\n+            }\r\n+\r\n+            localServiceToRevisions.forEach((serviceKey, revisions) -> {\r\n+                List<URL> urls = revisionsToUrls.get(revisions);\r\n+                if (urls != null) {\r\n+                    tmpServiceUrls.put(serviceKey, urls);\r\n+                } else {\r\n+                    urls = new ArrayList<>();\r\n+                    for (String r : revisions) {\r\n+                        for (ServiceInstance i : revisionToInstances.get(r)) {\r\n+                            urls.add(i.toURL());\r\n+                        }\r\n+                    }\r\n+                    revisionsToUrls.put(revisions, urls);\r\n+                    tmpServiceUrls.put(serviceKey, urls);\r\n+                }\r\n+            });\r\n+        }\r\n+\r\n+        this.serviceUrls = tmpServiceUrls;\r\n+        this.notifyAddressChanged();\r\n+    }\r\n+\r\n+    private Map<String, Set<String>> parseMetadata(String revision, MetadataInfo metadata, Map<String, Set<String>> localServiceToRevisions) {\r\n+        Map<String, ServiceInfo> serviceInfos = metadata.getServices();\r\n+        for (Map.Entry<String, ServiceInfo> entry : serviceInfos.entrySet()) {\r\n+            Set<String> set = localServiceToRevisions.computeIfAbsent(entry.getKey(), k -> new TreeSet<>());\r\n+            set.add(revision);\r\n+        }\r\n+\r\n+        return localServiceToRevisions;\r\n+    }\r\n+\r\n+    private MetadataInfo getMetadataInfo(ServiceInstance instance) {\r\n+        String metadataType = ServiceInstanceMetadataUtils.getMetadataStorageType(instance);\r\n+        // FIXME, check \"REGISTRY_CLUSTER_KEY\" must be set by every registry implementation.\r\n+        instance.getExtendParams().putIfAbsent(REGISTRY_CLUSTER_KEY, RegistryClusterIdentifier.getExtension(url).consumerKey(url));\r\n+        MetadataInfo metadataInfo;\r\n+        try {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Instance \" + instance.getAddress() + \" is using metadata type \" + metadataType);\r\n+            }\r\n+            if (REMOTE_METADATA_STORAGE_TYPE.equals(metadataType)) {\r\n+                RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+                metadataInfo = remoteMetadataService.getMetadata(instance);\r\n+            } else {\r\n+                MetadataService metadataServiceProxy = MetadataUtils.getMetadataServiceProxy(instance, serviceDiscovery);\r\n+                metadataInfo = metadataServiceProxy.getMetadataInfo(ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\r\n+            }\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.info(\"Metadata \" + metadataInfo.toString());\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Failed to load service metadata, metadata type is \" + metadataType, e);\r\n+            metadataInfo = null;\r\n+            // TODO, load metadata backup. Stop getting metadata after x times of failure for one revision?\r\n+        }\r\n+        return metadataInfo;\r\n+    }\r\n+\r\n+    private void notifyAddressChanged() {\r\n+        listeners.forEach((key, notifyListeners) -> {\r\n+            notifyListeners.forEach(notifyListener -> {\r\n+                notifyListener.notify(toUrlsWithEmpty(serviceUrls.get(key)));\r\n+            });\r\n+        });\r\n+    }\r\n+\r\n+    private List<URL> toUrlsWithEmpty(List<URL> urls) {\r\n+        if (urls == null) {\r\n+            urls = Collections.emptyList();\r\n+        }\r\n+        return urls;\r\n+    }\r\n+\r\n+    public void addListener(String serviceKey, NotifyListener listener) {\r\n+        this.listeners.computeIfAbsent(serviceKey, k -> new HashSet<>()).add(listener);\r\n+    }\r\n+\r\n+    public void removeListener(String serviceKey) {\r\n+        listeners.remove(serviceKey);\r\n+        if (listeners.isEmpty()) {\r\n+            serviceDiscovery.removeServiceInstancesChangedListener(this);\r\n+        }\r\n+    }\r\n+\r\n+    public List<URL> getUrls(String serviceKey) {\r\n+        return toUrlsWithEmpty(serviceUrls.get(serviceKey));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the correlative service name\r\n+     *\r\n+     * @return the correlative service name\r\n+     */\r\n+    public final Set<String> getServiceNames() {\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    public void setUrl(URL url) {\r\n+        this.url = url;\r\n+    }\r\n+\r\n+    public URL getUrl() {\r\n+        return url;\r\n+    }\r\n+\r\n+    /**\r\n+     * @param event {@link ServiceInstancesChangedEvent event}\r\n+     * @return If service name matches, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public final boolean accept(ServiceInstancesChangedEvent event) {\r\n+        return serviceNames.contains(event.getServiceName());\r\n+    }\r\n+\r\n+    public String getRegistryId() {\r\n+        return registryId;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean equals(Object o) {\r\n+        if (this == o) {\r\n+            return true;\r\n+        }\r\n+        if (!(o instanceof ServiceInstancesChangedListener)) {\r\n+            return false;\r\n+        }\r\n+        ServiceInstancesChangedListener that = (ServiceInstancesChangedListener) o;\r\n+        return Objects.equals(getServiceNames(), that.getServiceNames()) && Objects.equals(getRegistryId(), that.getRegistryId());\r\n+    }\r\n+\r\n+    @Override\r\n+    public int hashCode() {\r\n+        return Objects.hash(getClass(), getServiceNames(), getRegistryId());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceNameMapping.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,86 +1,86 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.metadata.MappingListener;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.ServiceNameMapping;\n-import org.apache.dubbo.metadata.report.MetadataReport;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Set;\n-\n-import static java.util.Arrays.asList;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.rpc.model.ApplicationModel.getName;\n-\n-public class MetadataServiceNameMapping implements ServiceNameMapping {\n-    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());\n-\n-    @Override\n-    public void map(URL url) {\n-        String serviceInterface = url.getServiceInterface();\n-        String group = url.getParameter(GROUP_KEY);\n-        String version = url.getParameter(VERSION_KEY);\n-        String protocol = url.getProtocol();\n-\n-        if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {\n-            return;\n-        }\n-        String registryCluster = getRegistryCluster(url);\n-        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\n-        metadataReport.registerServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), getName(), url);\n-    }\n-\n-    @Override\n-    public Set<String> getAndListen(URL url, MappingListener mappingListener) {\n-        String serviceInterface = url.getServiceInterface();\n-        String group = url.getParameter(GROUP_KEY);\n-        String version = url.getParameter(VERSION_KEY);\n-        String protocol = url.getProtocol();\n-\n-        String mappingKey = ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol);\n-        Set<String> serviceNames = new LinkedHashSet<>();\n-        String registryCluster = getRegistryCluster(url);\n-        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\n-        Set<String> apps = metadataReport.getServiceAppMapping(\n-                mappingKey,\n-                mappingListener,\n-                url);\n-        if (CollectionUtils.isNotEmpty(apps)) {\n-            serviceNames.addAll(apps);\n-        }\n-\n-        return serviceNames;\n-    }\n-\n-    protected String getRegistryCluster(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-\n-        int i = registryCluster.indexOf(\",\");\n-        if (i > 0) {\n-            registryCluster = registryCluster.substring(0, i);\n-        }\n-        return registryCluster;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.metadata.MappingListener;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.ServiceNameMapping;\r\n+import org.apache.dubbo.metadata.report.MetadataReport;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\r\n+\r\n+import java.util.LinkedHashSet;\r\n+import java.util.List;\r\n+import java.util.Set;\r\n+\r\n+import static java.util.Arrays.asList;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.rpc.model.ApplicationModel.getName;\r\n+\r\n+public class MetadataServiceNameMapping implements ServiceNameMapping {\r\n+    private static final List<String> IGNORED_SERVICE_INTERFACES = asList(MetadataService.class.getName());\r\n+\r\n+    @Override\r\n+    public void map(URL url) {\r\n+        String serviceInterface = url.getServiceInterface();\r\n+        String group = url.getParameter(GROUP_KEY);\r\n+        String version = url.getParameter(VERSION_KEY);\r\n+        String protocol = url.getProtocol();\r\n+\r\n+        if (IGNORED_SERVICE_INTERFACES.contains(serviceInterface)) {\r\n+            return;\r\n+        }\r\n+        String registryCluster = getRegistryCluster(url);\r\n+        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\r\n+        metadataReport.registerServiceAppMapping(ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol), getName(), url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getAndListen(URL url, MappingListener mappingListener) {\r\n+        String serviceInterface = url.getServiceInterface();\r\n+        String group = url.getParameter(GROUP_KEY);\r\n+        String version = url.getParameter(VERSION_KEY);\r\n+        String protocol = url.getProtocol();\r\n+\r\n+        String mappingKey = ServiceNameMapping.buildGroup(serviceInterface, group, version, protocol);\r\n+        Set<String> serviceNames = new LinkedHashSet<>();\r\n+        String registryCluster = getRegistryCluster(url);\r\n+        MetadataReport metadataReport = MetadataReportInstance.getMetadataReport(registryCluster);\r\n+        Set<String> apps = metadataReport.getServiceAppMapping(\r\n+                mappingKey,\r\n+                mappingListener,\r\n+                url);\r\n+        if (CollectionUtils.isNotEmpty(apps)) {\r\n+            serviceNames.addAll(apps);\r\n+        }\r\n+\r\n+        return serviceNames;\r\n+    }\r\n+\r\n+    protected String getRegistryCluster(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+\r\n+        int i = registryCluster.indexOf(\",\");\r\n+        if (i > 0) {\r\n+            registryCluster = registryCluster.substring(0, i);\r\n+        }\r\n+        return registryCluster;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,40 +1,40 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-\n-/**\n- * Used to build metadata service url from ServiceInstance.\n- *\n- * @since 2.7.5\n- */\n-@SPI\n-public interface MetadataServiceURLBuilder {\n-\n-    /**\n-     * Build the {@link URL URLs} from the specified {@link ServiceInstance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     * @return TODO, usually, we generate one metadata url from one instance. There's no scenario to return a metadata url list.\n-     */\n-    List<URL> build(ServiceInstance serviceInstance);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * Used to build metadata service url from ServiceInstance.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface MetadataServiceURLBuilder {\r\n+\r\n+    /**\r\n+     * Build the {@link URL URLs} from the specified {@link ServiceInstance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     * @return TODO, usually, we generate one metadata url from one instance. There's no scenario to return a metadata url list.\r\n+     */\r\n+    List<URL> build(ServiceInstance serviceInstance);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataServiceURLParamsMetadataCustomizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,65 +1,65 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-\n-import java.util.Map;\n-import java.util.SortedSet;\n-\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.metadata.MetadataService.toURLs;\n-import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceParameter;\n-\n-public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-\n-        String propertyName = resolveMetadataPropertyName(serviceInstance);\n-        String propertyValue = resolveMetadataPropertyValue(serviceInstance);\n-\n-        if (!isBlank(propertyName) && !isBlank(propertyValue)) {\n-            metadata.put(propertyName, propertyValue);\n-        }\n-    }\n-\n-    private String resolveMetadataPropertyName(ServiceInstance serviceInstance) {\n-        return METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\n-    }\n-\n-    private String resolveMetadataPropertyValue(ServiceInstance serviceInstance) {\n-        WritableMetadataService writableMetadataService = getDefaultExtension();\n-\n-        String serviceInterface = MetadataService.class.getName();\n-\n-        String group = serviceInstance.getServiceName();\n-\n-        String version = MetadataService.VERSION;\n-\n-        SortedSet<String> urls = writableMetadataService.getExportedURLs(serviceInterface, group, version);\n-\n-        return getMetadataServiceParameter(toURLs(urls));\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+\r\n+import java.util.Map;\r\n+import java.util.SortedSet;\r\n+\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.metadata.MetadataService.toURLs;\r\n+import static org.apache.dubbo.metadata.WritableMetadataService.getDefaultExtension;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceParameter;\r\n+\r\n+public class MetadataServiceURLParamsMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+\r\n+        String propertyName = resolveMetadataPropertyName(serviceInstance);\r\n+        String propertyValue = resolveMetadataPropertyValue(serviceInstance);\r\n+\r\n+        if (!isBlank(propertyName) && !isBlank(propertyValue)) {\r\n+            metadata.put(propertyName, propertyValue);\r\n+        }\r\n+    }\r\n+\r\n+    private String resolveMetadataPropertyName(ServiceInstance serviceInstance) {\r\n+        return METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME;\r\n+    }\r\n+\r\n+    private String resolveMetadataPropertyValue(ServiceInstance serviceInstance) {\r\n+        WritableMetadataService writableMetadataService = getDefaultExtension();\r\n+\r\n+        String serviceInterface = MetadataService.class.getName();\r\n+\r\n+        String group = serviceInstance.getServiceName();\r\n+\r\n+        String version = MetadataService.VERSION;\r\n+\r\n+        SortedSet<String> urls = writableMetadataService.getExportedURLs(serviceInterface, group, version);\r\n+\r\n+        return getMetadataServiceParameter(toURLs(urls));\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/MetadataUtils.java", "source2": "org/apache/dubbo/registry/client/metadata/MetadataUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,102 +1,102 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\n-\n-public class MetadataUtils {\n-\n-    private static final Object REMOTE_LOCK = new Object();\n-\n-    public static ConcurrentMap<String, MetadataService> metadataServiceProxies = new ConcurrentHashMap<>();\n-\n-    private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\n-\n-    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\n-\n-    public static RemoteMetadataServiceImpl remoteMetadataService;\n-\n-    public static WritableMetadataService localMetadataService;\n-\n-    public static RemoteMetadataServiceImpl getRemoteMetadataService() {\n-        if (remoteMetadataService == null) {\n-            synchronized (REMOTE_LOCK) {\n-                if (remoteMetadataService == null) {\n-                    remoteMetadataService = new RemoteMetadataServiceImpl(WritableMetadataService.getDefaultExtension());\n-                }\n-            }\n-        }\n-        return remoteMetadataService;\n-    }\n-\n-    public static void publishServiceDefinition(URL url) {\n-        // store in local\n-        WritableMetadataService.getDefaultExtension().publishServiceDefinition(url);\n-        // send to remote\n-//        if (REMOTE_METADATA_STORAGE_TYPE.equals(url.getParameter(METADATA_KEY))) {\n-        getRemoteMetadataService().publishServiceDefinition(url);\n-//        }\n-    }\n-\n-    public static MetadataService getMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) {\n-        String key = instance.getServiceName() + \"##\" +\n-                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance);\n-        return metadataServiceProxies.computeIfAbsent(key, k -> {\n-            MetadataServiceURLBuilder builder = null;\n-            ExtensionLoader<MetadataServiceURLBuilder> loader\n-                    = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class);\n-\n-            Map<String, String> metadata = instance.getMetadata();\n-            // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba.\n-            String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-            if (StringUtils.isNotEmpty(dubboURLsJSON)) {\n-                builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME);\n-            } else {\n-                builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME);\n-            }\n-\n-            List<URL> urls = builder.build(instance);\n-            if (CollectionUtils.isEmpty(urls)) {\n-                throw new IllegalStateException(\"You have enabled introspection service discovery mode for instance \"\n-                        + instance + \", but no metadata service can build from it.\");\n-            }\n-\n-            // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder.\n-            Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0));\n-\n-            return proxyFactory.getProxy(invoker);\n-        });\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\r\n+\r\n+public class MetadataUtils {\r\n+\r\n+    private static final Object REMOTE_LOCK = new Object();\r\n+\r\n+    public static ConcurrentMap<String, MetadataService> metadataServiceProxies = new ConcurrentHashMap<>();\r\n+\r\n+    private static final ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();\r\n+\r\n+    private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();\r\n+\r\n+    public static RemoteMetadataServiceImpl remoteMetadataService;\r\n+\r\n+    public static WritableMetadataService localMetadataService;\r\n+\r\n+    public static RemoteMetadataServiceImpl getRemoteMetadataService() {\r\n+        if (remoteMetadataService == null) {\r\n+            synchronized (REMOTE_LOCK) {\r\n+                if (remoteMetadataService == null) {\r\n+                    remoteMetadataService = new RemoteMetadataServiceImpl(WritableMetadataService.getDefaultExtension());\r\n+                }\r\n+            }\r\n+        }\r\n+        return remoteMetadataService;\r\n+    }\r\n+\r\n+    public static void publishServiceDefinition(URL url) {\r\n+        // store in local\r\n+        WritableMetadataService.getDefaultExtension().publishServiceDefinition(url);\r\n+        // send to remote\r\n+//        if (REMOTE_METADATA_STORAGE_TYPE.equals(url.getParameter(METADATA_KEY))) {\r\n+        getRemoteMetadataService().publishServiceDefinition(url);\r\n+//        }\r\n+    }\r\n+\r\n+    public static MetadataService getMetadataServiceProxy(ServiceInstance instance, ServiceDiscovery serviceDiscovery) {\r\n+        String key = instance.getServiceName() + \"##\" +\r\n+                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance);\r\n+        return metadataServiceProxies.computeIfAbsent(key, k -> {\r\n+            MetadataServiceURLBuilder builder = null;\r\n+            ExtensionLoader<MetadataServiceURLBuilder> loader\r\n+                    = ExtensionLoader.getExtensionLoader(MetadataServiceURLBuilder.class);\r\n+\r\n+            Map<String, String> metadata = instance.getMetadata();\r\n+            // METADATA_SERVICE_URLS_PROPERTY_NAME is a unique key exists only on instances of spring-cloud-alibaba.\r\n+            String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+            if (StringUtils.isNotEmpty(dubboURLsJSON)) {\r\n+                builder = loader.getExtension(SpringCloudMetadataServiceURLBuilder.NAME);\r\n+            } else {\r\n+                builder = loader.getExtension(StandardMetadataServiceURLBuilder.NAME);\r\n+            }\r\n+\r\n+            List<URL> urls = builder.build(instance);\r\n+            if (CollectionUtils.isEmpty(urls)) {\r\n+                throw new IllegalStateException(\"You have enabled introspection service discovery mode for instance \"\r\n+                        + instance + \", but no metadata service can build from it.\");\r\n+            }\r\n+\r\n+            // Simply rely on the first metadata url, as stated in MetadataServiceURLBuilder.\r\n+            Invoker<MetadataService> invoker = protocol.refer(MetadataService.class, urls.get(0));\r\n+\r\n+            return proxyFactory.getProxy(invoker);\r\n+        });\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/ProtocolPortsMetadataCustomizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,55 +1,55 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setEndpoints;\n-\n-/**\n- * A Class to customize the ports of {@link Protocol protocols} into\n- * {@link ServiceInstance#getMetadata() the metadata of service instance}\n- *\n- * @since 2.7.5\n- */\n-public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension();\n-\n-        Map<String, Integer> protocols = new HashMap<>();\n-        writableMetadataService.getExportedURLs()\n-                .stream()\n-                .map(URL::valueOf)\n-                .filter(url -> !MetadataService.class.getName().equals(url.getServiceInterface()))\n-                .forEach(url -> {\n-                    // TODO, same protocol listen on different ports will override with each other.\n-                    protocols.put(url.getProtocol(), url.getPort());\n-                });\n-\n-        setEndpoints(serviceInstance, protocols);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.setEndpoints;\r\n+\r\n+/**\r\n+ * A Class to customize the ports of {@link Protocol protocols} into\r\n+ * {@link ServiceInstance#getMetadata() the metadata of service instance}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ProtocolPortsMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+        WritableMetadataService writableMetadataService = WritableMetadataService.getDefaultExtension();\r\n+\r\n+        Map<String, Integer> protocols = new HashMap<>();\r\n+        writableMetadataService.getExportedURLs()\r\n+                .stream()\r\n+                .map(URL::valueOf)\r\n+                .filter(url -> !MetadataService.class.getName().equals(url.getServiceInterface()))\r\n+                .forEach(url -> {\r\n+                    // TODO, same protocol listen on different ports will override with each other.\r\n+                    protocols.put(url.getProtocol(), url.getPort());\r\n+                });\r\n+\r\n+        setEndpoints(serviceInstance, protocols);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java", "source2": "org/apache/dubbo/registry/client/metadata/RestProtocolSubscribedURLsSynthesizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,67 +1,67 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.rpc.Protocol;\n-\n-import java.util.Collection;\n-import java.util.List;\n-import java.util.stream.Collectors;\n-\n-import static java.lang.Boolean.TRUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-\n-/**\n- * {@link SubscribedURLsSynthesizer} implementation for REST {@link Protocol protocol}\n- *\n- * @since 2.7.5\n- */\n-public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynthesizer {\n-\n-    @Override\n-    public boolean supports(URL subscribedURL) {\n-        return \"rest\".equals(subscribedURL.getProtocol()) ||\n-                \"rest\".equals(subscribedURL.getParameter(PROTOCOL_KEY));\n-    }\n-\n-    @Override\n-    public List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances) {\n-\n-        String protocol = subscribedURL.getParameter(PROTOCOL_KEY);\n-\n-        return serviceInstances.stream().map(serviceInstance -> {\n-            URLBuilder urlBuilder = new URLBuilder()\n-                    .setProtocol(protocol)\n-                    .setHost(serviceInstance.getHost())\n-                    .setPort(serviceInstance.getPort())\n-                    .setPath(subscribedURL.getServiceInterface())\n-                    .addParameter(SIDE_KEY, PROVIDER)\n-                    .addParameter(APPLICATION_KEY, serviceInstance.getServiceName())\n-                    .addParameter(REGISTER_KEY, TRUE.toString());\n-\n-            return urlBuilder.build();\n-        }).collect(Collectors.toList());\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.List;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static java.lang.Boolean.TRUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+\r\n+/**\r\n+ * {@link SubscribedURLsSynthesizer} implementation for REST {@link Protocol protocol}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class RestProtocolSubscribedURLsSynthesizer implements SubscribedURLsSynthesizer {\r\n+\r\n+    @Override\r\n+    public boolean supports(URL subscribedURL) {\r\n+        return \"rest\".equals(subscribedURL.getProtocol()) ||\r\n+                \"rest\".equals(subscribedURL.getParameter(PROTOCOL_KEY));\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances) {\r\n+\r\n+        String protocol = subscribedURL.getParameter(PROTOCOL_KEY);\r\n+\r\n+        return serviceInstances.stream().map(serviceInstance -> {\r\n+            URLBuilder urlBuilder = new URLBuilder()\r\n+                    .setProtocol(protocol)\r\n+                    .setHost(serviceInstance.getHost())\r\n+                    .setPort(serviceInstance.getPort())\r\n+                    .setPath(subscribedURL.getServiceInterface())\r\n+                    .addParameter(SIDE_KEY, PROVIDER)\r\n+                    .addParameter(APPLICATION_KEY, serviceInstance.getServiceName())\r\n+                    .addParameter(REGISTER_KEY, TRUE.toString());\r\n+\r\n+            return urlBuilder.build();\r\n+        }).collect(Collectors.toList());\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java", "source2": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataCustomizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,88 +1,88 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.infra.InfraAdapter;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataParamsFilter;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\n-import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-\n-/**\n- *\n- */\n-public class ServiceInstanceMetadataCustomizer implements ServiceInstanceCustomizer {\n-\n-    @Override\n-    public void customize(ServiceInstance serviceInstance) {\n-        Map<String, String> params = new HashMap<>();\n-\n-        ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);\n-        Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();\n-\n-        InMemoryWritableMetadataService localMetadataService\n-                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\n-        // pick the first interface metadata available.\n-        // FIXME, check the same key in different urls has the same value\n-        MetadataInfo metadataInfo = localMetadataService.getMetadataInfos().values().iterator().next();\n-        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();\n-        Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());\n-\n-        // load instance params users want to load.\n-        // TODO, duplicate logic with that in ApplicationConfig\n-        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(adapters)) {\n-            Map<String, String> inputParameters = new HashMap<>();\n-            inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());\n-            for (InfraAdapter adapter : adapters) {\n-                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\n-                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\n-                    extraParameters.forEach(allParams::putIfAbsent);\n-                }\n-            }\n-        }\n-\n-        if (CollectionUtils.isEmpty(paramsFilters)) {\n-            serviceInstance.getMetadata().putAll(allParams);\n-            return;\n-        }\n-\n-        paramsFilters.forEach(filter -> {\n-            String[] included = filter.instanceParamsIncluded();\n-            if (included == null) {\n-                serviceInstance.getMetadata().putAll(allParams);\n-            } else {\n-                for (String p : included) {\n-                    if (allParams.get(p) != null) {\n-                        serviceInstance.getMetadata().put(p, allParams.get(p));\n-                    }\n-                }\n-            }\n-        });\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.infra.InfraAdapter;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataParamsFilter;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.ServiceInstanceCustomizer;\r\n+import org.apache.dubbo.registry.client.metadata.store.InMemoryWritableMetadataService;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class ServiceInstanceMetadataCustomizer implements ServiceInstanceCustomizer {\r\n+\r\n+    @Override\r\n+    public void customize(ServiceInstance serviceInstance) {\r\n+        Map<String, String> params = new HashMap<>();\r\n+\r\n+        ExtensionLoader<MetadataParamsFilter> loader = ExtensionLoader.getExtensionLoader(MetadataParamsFilter.class);\r\n+        Set<MetadataParamsFilter> paramsFilters = loader.getSupportedExtensionInstances();\r\n+\r\n+        InMemoryWritableMetadataService localMetadataService\r\n+                = (InMemoryWritableMetadataService) WritableMetadataService.getDefaultExtension();\r\n+        // pick the first interface metadata available.\r\n+        // FIXME, check the same key in different urls has the same value\r\n+        MetadataInfo metadataInfo = localMetadataService.getMetadataInfos().values().iterator().next();\r\n+        MetadataInfo.ServiceInfo serviceInfo = metadataInfo.getServices().values().iterator().next();\r\n+        Map<String, String> allParams = new HashMap<>(serviceInfo.getUrl().getParameters());\r\n+\r\n+        // load instance params users want to load.\r\n+        // TODO, duplicate logic with that in ApplicationConfig\r\n+        Set<InfraAdapter> adapters = ExtensionLoader.getExtensionLoader(InfraAdapter.class).getSupportedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(adapters)) {\r\n+            Map<String, String> inputParameters = new HashMap<>();\r\n+            inputParameters.put(APPLICATION_KEY, ApplicationModel.getName());\r\n+            for (InfraAdapter adapter : adapters) {\r\n+                Map<String, String> extraParameters = adapter.getExtraAttributes(inputParameters);\r\n+                if (CollectionUtils.isNotEmptyMap(extraParameters)) {\r\n+                    extraParameters.forEach(allParams::putIfAbsent);\r\n+                }\r\n+            }\r\n+        }\r\n+\r\n+        if (CollectionUtils.isEmpty(paramsFilters)) {\r\n+            serviceInstance.getMetadata().putAll(allParams);\r\n+            return;\r\n+        }\r\n+\r\n+        paramsFilters.forEach(filter -> {\r\n+            String[] included = filter.instanceParamsIncluded();\r\n+            if (included == null) {\r\n+                serviceInstance.getMetadata().putAll(allParams);\r\n+            } else {\r\n+                for (String p : included) {\r\n+                    if (allParams.get(p) != null) {\r\n+                        serviceInstance.getMetadata().put(p, allParams.get(p));\r\n+                    }\r\n+                }\r\n+            }\r\n+        });\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java", "source2": "org/apache/dubbo/registry/client/metadata/ServiceInstanceMetadataUtils.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,318 +1,318 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import com.alibaba.fastjson.JSON;\n-\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.LinkedHashMap;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static java.util.Collections.emptyMap;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.utils.StringUtils.isBlank;\n-import static org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.DEFAULT_REGISTER_PROVIDER_KEYS;\n-import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\n-import static org.apache.dubbo.rpc.Constants.ID_KEY;\n-\n-/**\n- * The Utilities class for the {@link ServiceInstance#getMetadata() metadata of the service instance}\n- *\n- * @see StandardMetadataServiceURLBuilder\n- * @see ServiceInstance#getMetadata()\n- * @see MetadataService\n- * @see URL\n- * @since 2.7.5\n- */\n-public class ServiceInstanceMetadataUtils {\n-\n-    /**\n-     * The prefix of {@link MetadataService} : \"dubbo.metadata-service.\"\n-     */\n-    public static final String METADATA_SERVICE_PREFIX = \"dubbo.metadata-service.\";\n-\n-    public static final String ENDPOINTS = \"dubbo.endpoints\";\n-\n-    /**\n-     * The property name of metadata JSON of {@link MetadataService}'s {@link URL}\n-     */\n-    public static String METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"url-params\";\n-\n-    /**\n-     * The {@link URL URLs} property name of {@link MetadataService} :\n-     * \"dubbo.metadata-service.urls\", which is used to be compatible with Dubbo Spring Cloud and\n-     * discovery the metadata of instance\n-     */\n-    public static final String METADATA_SERVICE_URLS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"urls\";\n-\n-    /**\n-     * The property name of The revision for all exported Dubbo services.\n-     */\n-    public static String EXPORTED_SERVICES_REVISION_PROPERTY_NAME = \"dubbo.metadata.revision\";\n-\n-    /**\n-     * The property name of metadata storage type.\n-     */\n-    public static String METADATA_STORAGE_TYPE_PROPERTY_NAME = \"dubbo.metadata.storage-type\";\n-\n-    public static String METADATA_CLUSTER_PROPERTY_NAME = \"dubbo.metadata.cluster\";\n-\n-    public static String INSTANCE_REVISION_UPDATED_KEY = \"dubbo.instance.revision.updated\";\n-\n-    /**\n-     * Get the multiple {@link URL urls'} parameters of {@link MetadataService MetadataService's} Metadata\n-     *\n-     * @param serviceInstance the instance of {@link ServiceInstance}\n-     * @return non-null {@link Map}, the key is {@link URL#getProtocol() the protocol of URL}, the value is\n-     * {@link #getMetadataServiceURLParams(ServiceInstance, String)}\n-     */\n-    public static Map<String, Map<String, String>> getMetadataServiceURLsParams(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String param = metadata.get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);\n-        return isBlank(param) ? emptyMap() : (Map) JSON.parse(param);\n-    }\n-\n-    /**\n-     * Get the {@link URL url's} parameters of {@link MetadataService MetadataService's} Metadata\n-     *\n-     * @param serviceInstance the instance of {@link ServiceInstance}\n-     * @return non-null {@link Map}\n-     */\n-    public static Map<String, String> getMetadataServiceURLParams(ServiceInstance serviceInstance, String protocol) {\n-        Map<String, Map<String, String>> params = getMetadataServiceURLsParams(serviceInstance);\n-        return params.getOrDefault(protocol, emptyMap());\n-    }\n-\n-    public static String getMetadataServiceParameter(List<URL> urls) {\n-\n-        Map<String, Map<String, String>> params = new HashMap<>();\n-\n-        urls.stream()\n-                // remove APPLICATION_KEY because service name must be present\n-                .map(url -> url.removeParameter(APPLICATION_KEY))\n-                // remove GROUP_KEY, always uses application name.\n-                .map(url -> url.removeParameter(GROUP_KEY))\n-                // remove DEPRECATED_KEY because it's always false\n-                .map(url -> url.removeParameter(DEPRECATED_KEY))\n-                // remove TIMESTAMP_KEY because it's nonsense\n-                .map(url -> url.removeParameter(TIMESTAMP_KEY))\n-                .forEach(url -> {\n-                    String protocol = url.getProtocol();\n-                    params.put(protocol, getParams(url));\n-                });\n-\n-        if (params.isEmpty()) {\n-            return null;\n-        }\n-\n-        return JSON.toJSONString(params);\n-    }\n-\n-    private static Map<String, String> getParams(URL providerURL) {\n-        Map<String, String> params = new LinkedHashMap<>();\n-        setDefaultParams(params, providerURL);\n-        params.put(PORT_KEY, String.valueOf(providerURL.getPort()));\n-        return params;\n-    }\n-\n-    /**\n-     * The revision for all exported Dubbo services from the specified {@link ServiceInstance}.\n-     *\n-     * @param serviceInstance the specified {@link ServiceInstance}\n-     * @return <code>null</code> if not exits\n-     */\n-    public static String getExportedServicesRevision(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\n-    }\n-\n-    /**\n-     * Get metadata's storage type\n-     *\n-     * @param registryURL the {@link URL} to connect the registry\n-     * @return if not found in {@link URL#getParameters() parameters} of {@link URL registry URL}, return\n-     */\n-    public static String getMetadataStorageType(URL registryURL) {\n-        return registryURL.getParameter(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\n-    }\n-\n-    /**\n-     * Get the metadata's storage type is used to which {@link WritableMetadataService} instance.\n-     *\n-     * @param serviceInstance the specified {@link ServiceInstance}\n-     * @return if not found in {@link ServiceInstance#getMetadata() metadata} of {@link ServiceInstance}, return\n-     */\n-    public static String getMetadataStorageType(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.getOrDefault(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\n-    }\n-\n-    /**\n-     * Set the metadata storage type in specified {@link ServiceInstance service instance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @param metadataType    remote or local\n-     */\n-    public static void setMetadataStorageType(ServiceInstance serviceInstance, String metadataType) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, metadataType);\n-    }\n-\n-    public static String getRemoteCluster(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.get(METADATA_CLUSTER_PROPERTY_NAME);\n-    }\n-\n-    /**\n-     * Is Dubbo Service instance or not\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @return if Dubbo Service instance, return <code>true</code>, or <code>false</code>\n-     */\n-    public static boolean isDubboServiceInstance(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        return metadata.containsKey(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME)\n-                || metadata.containsKey(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-    }\n-\n-    public static void setEndpoints(ServiceInstance serviceInstance, Map<String, Integer> protocolPorts) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        List<Endpoint> endpoints = new ArrayList<>();\n-        protocolPorts.forEach((k, v) -> {\n-            Endpoint endpoint = new Endpoint(v, k);\n-            endpoints.add(endpoint);\n-        });\n-\n-        metadata.put(ENDPOINTS, JSON.toJSONString(endpoints));\n-    }\n-\n-    /**\n-     * Get the property value of port by the specified {@link ServiceInstance#getMetadata() the metadata of\n-     * service instance} and protocol\n-     *\n-     * @param serviceInstance {@link ServiceInstance service instance}\n-     * @param protocol        the name of protocol, e.g, dubbo, rest, and so on\n-     * @return if not found, return <code>null</code>\n-     */\n-    public static Integer getProtocolPort(ServiceInstance serviceInstance, String protocol) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String rawEndpoints = metadata.get(ENDPOINTS);\n-        if (StringUtils.isNotEmpty(rawEndpoints)) {\n-            List<Endpoint> endpoints = JSON.parseArray(rawEndpoints, Endpoint.class);\n-            for (Endpoint endpoint : endpoints) {\n-                if (endpoint.getProtocol().equals(protocol)) {\n-                    return endpoint.getPort();\n-                }\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public static void calInstanceRevision(ServiceDiscovery serviceDiscovery, ServiceInstance instance) {\n-        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\n-        if (registryCluster == null) {\n-            return;\n-        }\n-        MetadataInfo metadataInfo = WritableMetadataService.getDefaultExtension().getMetadataInfos().get(registryCluster);\n-        if (metadataInfo != null) {\n-            String existingInstanceRevision = instance.getMetadata().get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\n-            if (!metadataInfo.calAndGetRevision().equals(existingInstanceRevision)) {\n-                instance.getMetadata().put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, metadataInfo.calAndGetRevision());\n-                if (existingInstanceRevision != null) {// skip the first registration.\n-                    instance.getExtendParams().put(INSTANCE_REVISION_UPDATED_KEY, \"true\");\n-                }\n-            }\n-        }\n-    }\n-\n-    public static boolean isInstanceUpdated(ServiceInstance instance) {\n-        return \"true\".equals(instance.getExtendParams().get(INSTANCE_REVISION_UPDATED_KEY));\n-    }\n-\n-    public static void resetInstanceUpdateKey(ServiceInstance instance) {\n-        instance.getExtendParams().remove(INSTANCE_REVISION_UPDATED_KEY);\n-    }\n-\n-    public static void refreshMetadataAndInstance() {\n-        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\n-        remoteMetadataService.publishMetadata(ApplicationModel.getName());\n-\n-        AbstractRegistryFactory.getServiceDiscoveries().forEach(serviceDiscovery -> {\n-            calInstanceRevision(serviceDiscovery, serviceDiscovery.getLocalInstance());\n-            // update service instance revision\n-            serviceDiscovery.update(serviceDiscovery.getLocalInstance());\n-        });\n-    }\n-\n-    /**\n-     * Set the default parameters via the specified {@link URL providerURL}\n-     *\n-     * @param params      the parameters\n-     * @param providerURL the provider's {@link URL}\n-     */\n-    private static void setDefaultParams(Map<String, String> params, URL providerURL) {\n-        for (String parameterName : DEFAULT_REGISTER_PROVIDER_KEYS) {\n-            String parameterValue = providerURL.getParameter(parameterName);\n-            if (!isBlank(parameterValue)) {\n-                params.put(parameterName, parameterValue);\n-            }\n-        }\n-    }\n-\n-    public static class Endpoint {\n-        Integer port;\n-        String protocol;\n-\n-        public Endpoint(Integer port, String protocol) {\n-            this.port = port;\n-            this.protocol = protocol;\n-        }\n-\n-        public Integer getPort() {\n-            return port;\n-        }\n-\n-        public void setPort(Integer port) {\n-            this.port = port;\n-        }\n-\n-        public String getProtocol() {\n-            return protocol;\n-        }\n-\n-        public void setProtocol(String protocol) {\n-            this.protocol = protocol;\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.metadata.store.RemoteMetadataServiceImpl;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.LinkedHashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static java.util.Collections.emptyMap;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_METADATA_STORAGE_TYPE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.utils.StringUtils.isBlank;\r\n+import static org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol.DEFAULT_REGISTER_PROVIDER_KEYS;\r\n+import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.ID_KEY;\r\n+\r\n+/**\r\n+ * The Utilities class for the {@link ServiceInstance#getMetadata() metadata of the service instance}\r\n+ *\r\n+ * @see StandardMetadataServiceURLBuilder\r\n+ * @see ServiceInstance#getMetadata()\r\n+ * @see MetadataService\r\n+ * @see URL\r\n+ * @since 2.7.5\r\n+ */\r\n+public class ServiceInstanceMetadataUtils {\r\n+\r\n+    /**\r\n+     * The prefix of {@link MetadataService} : \"dubbo.metadata-service.\"\r\n+     */\r\n+    public static final String METADATA_SERVICE_PREFIX = \"dubbo.metadata-service.\";\r\n+\r\n+    public static final String ENDPOINTS = \"dubbo.endpoints\";\r\n+\r\n+    /**\r\n+     * The property name of metadata JSON of {@link MetadataService}'s {@link URL}\r\n+     */\r\n+    public static String METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"url-params\";\r\n+\r\n+    /**\r\n+     * The {@link URL URLs} property name of {@link MetadataService} :\r\n+     * \"dubbo.metadata-service.urls\", which is used to be compatible with Dubbo Spring Cloud and\r\n+     * discovery the metadata of instance\r\n+     */\r\n+    public static final String METADATA_SERVICE_URLS_PROPERTY_NAME = METADATA_SERVICE_PREFIX + \"urls\";\r\n+\r\n+    /**\r\n+     * The property name of The revision for all exported Dubbo services.\r\n+     */\r\n+    public static String EXPORTED_SERVICES_REVISION_PROPERTY_NAME = \"dubbo.metadata.revision\";\r\n+\r\n+    /**\r\n+     * The property name of metadata storage type.\r\n+     */\r\n+    public static String METADATA_STORAGE_TYPE_PROPERTY_NAME = \"dubbo.metadata.storage-type\";\r\n+\r\n+    public static String METADATA_CLUSTER_PROPERTY_NAME = \"dubbo.metadata.cluster\";\r\n+\r\n+    public static String INSTANCE_REVISION_UPDATED_KEY = \"dubbo.instance.revision.updated\";\r\n+\r\n+    /**\r\n+     * Get the multiple {@link URL urls'} parameters of {@link MetadataService MetadataService's} Metadata\r\n+     *\r\n+     * @param serviceInstance the instance of {@link ServiceInstance}\r\n+     * @return non-null {@link Map}, the key is {@link URL#getProtocol() the protocol of URL}, the value is\r\n+     * {@link #getMetadataServiceURLParams(ServiceInstance, String)}\r\n+     */\r\n+    public static Map<String, Map<String, String>> getMetadataServiceURLsParams(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String param = metadata.get(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME);\r\n+        return isBlank(param) ? emptyMap() : (Map) JSON.parse(param);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the {@link URL url's} parameters of {@link MetadataService MetadataService's} Metadata\r\n+     *\r\n+     * @param serviceInstance the instance of {@link ServiceInstance}\r\n+     * @return non-null {@link Map}\r\n+     */\r\n+    public static Map<String, String> getMetadataServiceURLParams(ServiceInstance serviceInstance, String protocol) {\r\n+        Map<String, Map<String, String>> params = getMetadataServiceURLsParams(serviceInstance);\r\n+        return params.getOrDefault(protocol, emptyMap());\r\n+    }\r\n+\r\n+    public static String getMetadataServiceParameter(List<URL> urls) {\r\n+\r\n+        Map<String, Map<String, String>> params = new HashMap<>();\r\n+\r\n+        urls.stream()\r\n+                // remove APPLICATION_KEY because service name must be present\r\n+                .map(url -> url.removeParameter(APPLICATION_KEY))\r\n+                // remove GROUP_KEY, always uses application name.\r\n+                .map(url -> url.removeParameter(GROUP_KEY))\r\n+                // remove DEPRECATED_KEY because it's always false\r\n+                .map(url -> url.removeParameter(DEPRECATED_KEY))\r\n+                // remove TIMESTAMP_KEY because it's nonsense\r\n+                .map(url -> url.removeParameter(TIMESTAMP_KEY))\r\n+                .forEach(url -> {\r\n+                    String protocol = url.getProtocol();\r\n+                    params.put(protocol, getParams(url));\r\n+                });\r\n+\r\n+        if (params.isEmpty()) {\r\n+            return null;\r\n+        }\r\n+\r\n+        return JSON.toJSONString(params);\r\n+    }\r\n+\r\n+    private static Map<String, String> getParams(URL providerURL) {\r\n+        Map<String, String> params = new LinkedHashMap<>();\r\n+        setDefaultParams(params, providerURL);\r\n+        params.put(PORT_KEY, String.valueOf(providerURL.getPort()));\r\n+        return params;\r\n+    }\r\n+\r\n+    /**\r\n+     * The revision for all exported Dubbo services from the specified {@link ServiceInstance}.\r\n+     *\r\n+     * @param serviceInstance the specified {@link ServiceInstance}\r\n+     * @return <code>null</code> if not exits\r\n+     */\r\n+    public static String getExportedServicesRevision(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get metadata's storage type\r\n+     *\r\n+     * @param registryURL the {@link URL} to connect the registry\r\n+     * @return if not found in {@link URL#getParameters() parameters} of {@link URL registry URL}, return\r\n+     */\r\n+    public static String getMetadataStorageType(URL registryURL) {\r\n+        return registryURL.getParameter(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the metadata's storage type is used to which {@link WritableMetadataService} instance.\r\n+     *\r\n+     * @param serviceInstance the specified {@link ServiceInstance}\r\n+     * @return if not found in {@link ServiceInstance#getMetadata() metadata} of {@link ServiceInstance}, return\r\n+     */\r\n+    public static String getMetadataStorageType(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.getOrDefault(METADATA_STORAGE_TYPE_PROPERTY_NAME, DEFAULT_METADATA_STORAGE_TYPE);\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the metadata storage type in specified {@link ServiceInstance service instance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @param metadataType    remote or local\r\n+     */\r\n+    public static void setMetadataStorageType(ServiceInstance serviceInstance, String metadataType) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        metadata.put(METADATA_STORAGE_TYPE_PROPERTY_NAME, metadataType);\r\n+    }\r\n+\r\n+    public static String getRemoteCluster(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.get(METADATA_CLUSTER_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    /**\r\n+     * Is Dubbo Service instance or not\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @return if Dubbo Service instance, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    public static boolean isDubboServiceInstance(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        return metadata.containsKey(METADATA_SERVICE_URL_PARAMS_PROPERTY_NAME)\r\n+                || metadata.containsKey(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+    }\r\n+\r\n+    public static void setEndpoints(ServiceInstance serviceInstance, Map<String, Integer> protocolPorts) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        List<Endpoint> endpoints = new ArrayList<>();\r\n+        protocolPorts.forEach((k, v) -> {\r\n+            Endpoint endpoint = new Endpoint(v, k);\r\n+            endpoints.add(endpoint);\r\n+        });\r\n+\r\n+        metadata.put(ENDPOINTS, JSON.toJSONString(endpoints));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the property value of port by the specified {@link ServiceInstance#getMetadata() the metadata of\r\n+     * service instance} and protocol\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance service instance}\r\n+     * @param protocol        the name of protocol, e.g, dubbo, rest, and so on\r\n+     * @return if not found, return <code>null</code>\r\n+     */\r\n+    public static Integer getProtocolPort(ServiceInstance serviceInstance, String protocol) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String rawEndpoints = metadata.get(ENDPOINTS);\r\n+        if (StringUtils.isNotEmpty(rawEndpoints)) {\r\n+            List<Endpoint> endpoints = JSON.parseArray(rawEndpoints, Endpoint.class);\r\n+            for (Endpoint endpoint : endpoints) {\r\n+                if (endpoint.getProtocol().equals(protocol)) {\r\n+                    return endpoint.getPort();\r\n+                }\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public static void calInstanceRevision(ServiceDiscovery serviceDiscovery, ServiceInstance instance) {\r\n+        String registryCluster = serviceDiscovery.getUrl().getParameter(ID_KEY);\r\n+        if (registryCluster == null) {\r\n+            return;\r\n+        }\r\n+        MetadataInfo metadataInfo = WritableMetadataService.getDefaultExtension().getMetadataInfos().get(registryCluster);\r\n+        if (metadataInfo != null) {\r\n+            String existingInstanceRevision = instance.getMetadata().get(EXPORTED_SERVICES_REVISION_PROPERTY_NAME);\r\n+            if (!metadataInfo.calAndGetRevision().equals(existingInstanceRevision)) {\r\n+                instance.getMetadata().put(EXPORTED_SERVICES_REVISION_PROPERTY_NAME, metadataInfo.calAndGetRevision());\r\n+                if (existingInstanceRevision != null) {// skip the first registration.\r\n+                    instance.getExtendParams().put(INSTANCE_REVISION_UPDATED_KEY, \"true\");\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static boolean isInstanceUpdated(ServiceInstance instance) {\r\n+        return \"true\".equals(instance.getExtendParams().get(INSTANCE_REVISION_UPDATED_KEY));\r\n+    }\r\n+\r\n+    public static void resetInstanceUpdateKey(ServiceInstance instance) {\r\n+        instance.getExtendParams().remove(INSTANCE_REVISION_UPDATED_KEY);\r\n+    }\r\n+\r\n+    public static void refreshMetadataAndInstance() {\r\n+        RemoteMetadataServiceImpl remoteMetadataService = MetadataUtils.getRemoteMetadataService();\r\n+        remoteMetadataService.publishMetadata(ApplicationModel.getName());\r\n+\r\n+        AbstractRegistryFactory.getServiceDiscoveries().forEach(serviceDiscovery -> {\r\n+            calInstanceRevision(serviceDiscovery, serviceDiscovery.getLocalInstance());\r\n+            // update service instance revision\r\n+            serviceDiscovery.update(serviceDiscovery.getLocalInstance());\r\n+        });\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the default parameters via the specified {@link URL providerURL}\r\n+     *\r\n+     * @param params      the parameters\r\n+     * @param providerURL the provider's {@link URL}\r\n+     */\r\n+    private static void setDefaultParams(Map<String, String> params, URL providerURL) {\r\n+        for (String parameterName : DEFAULT_REGISTER_PROVIDER_KEYS) {\r\n+            String parameterValue = providerURL.getParameter(parameterName);\r\n+            if (!isBlank(parameterValue)) {\r\n+                params.put(parameterName, parameterValue);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public static class Endpoint {\r\n+        Integer port;\r\n+        String protocol;\r\n+\r\n+        public Endpoint(Integer port, String protocol) {\r\n+            this.port = port;\r\n+            this.protocol = protocol;\r\n+        }\r\n+\r\n+        public Integer getPort() {\r\n+            return port;\r\n+        }\r\n+\r\n+        public void setPort(Integer port) {\r\n+            this.port = port;\r\n+        }\r\n+\r\n+        public String getProtocol() {\r\n+            return protocol;\r\n+        }\r\n+\r\n+        public void setProtocol(String protocol) {\r\n+            this.protocol = protocol;\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/SpringCloudMetadataServiceURLBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,51 +1,51 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import com.alibaba.fastjson.JSON;\n-\n-import java.util.Collections;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.stream.Collectors;\n-\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\n-\n-/**\n- * Supporting interaction with Dubbo Spring Cloud at https://github.com/alibaba/spring-cloud-alibaba\n- * Dubbo Spring Cloud is a Dubbo extension that favours a per instance registry model and exposes metadata service.\n- *\n- * @since 2.7.5\n- */\n-public class SpringCloudMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\n-    public static final String NAME = \"spring-cloud\";\n-\n-    @Override\n-    public List<URL> build(ServiceInstance serviceInstance) {\n-        Map<String, String> metadata = serviceInstance.getMetadata();\n-        String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\n-        if (StringUtils.isBlank(dubboURLsJSON)) {\n-            return Collections.emptyList();\n-        }\n-        List<String> urlStrings = JSON.parseArray(dubboURLsJSON, String.class);\n-        return urlStrings.stream().map(URL::valueOf).collect(Collectors.toList());\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import com.alibaba.fastjson.JSON;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.stream.Collectors;\r\n+\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.METADATA_SERVICE_URLS_PROPERTY_NAME;\r\n+\r\n+/**\r\n+ * Supporting interaction with Dubbo Spring Cloud at https://github.com/alibaba/spring-cloud-alibaba\r\n+ * Dubbo Spring Cloud is a Dubbo extension that favours a per instance registry model and exposes metadata service.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+public class SpringCloudMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\r\n+    public static final String NAME = \"spring-cloud\";\r\n+\r\n+    @Override\r\n+    public List<URL> build(ServiceInstance serviceInstance) {\r\n+        Map<String, String> metadata = serviceInstance.getMetadata();\r\n+        String dubboURLsJSON = metadata.get(METADATA_SERVICE_URLS_PROPERTY_NAME);\r\n+        if (StringUtils.isBlank(dubboURLsJSON)) {\r\n+            return Collections.emptyList();\r\n+        }\r\n+        List<String> urlStrings = JSON.parseArray(dubboURLsJSON, String.class);\r\n+        return urlStrings.stream().map(URL::valueOf).collect(Collectors.toList());\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java", "source2": "org/apache/dubbo/registry/client/metadata/StandardMetadataServiceURLBuilder.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,89 +1,89 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-\n-import static java.lang.String.valueOf;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_TIMEOUT_VALUE;\n-import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PROXY_TIMEOUT_KEY;\n-import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceURLsParams;\n-\n-/**\n- * Standard Dubbo provider enabling introspection service discovery mode.\n- *\n- * @see MetadataService\n- * @since 2.7.5\n- */\n-public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\n-    \n-    public static final String NAME = \"standard\";\n-\n-    /**\n-     * Build the {@link URL urls} from {@link ServiceInstance#getMetadata() the metadata} of {@link ServiceInstance}\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     * @return the not-null {@link List}\n-     */\n-    @Override\n-    public List<URL> build(ServiceInstance serviceInstance) {\n-\n-        Map<String, Map<String, String>> paramsMap = getMetadataServiceURLsParams(serviceInstance);\n-\n-        List<URL> urls = new ArrayList<>(paramsMap.size());\n-\n-        String serviceName = serviceInstance.getServiceName();\n-\n-        String host = serviceInstance.getHost();\n-\n-        for (Map.Entry<String, Map<String, String>> entry : paramsMap.entrySet()) {\n-            String protocol = entry.getKey();\n-            Map<String, String> params = entry.getValue();\n-            int port = Integer.parseInt(params.get(PORT_KEY));\n-            URLBuilder urlBuilder = new URLBuilder()\n-                    .setHost(host)\n-                    .setPort(port)\n-                    .setProtocol(protocol)\n-                    .setPath(MetadataService.class.getName())\n-                    .addParameter(TIMEOUT_KEY, ConfigurationUtils.get(METADATA_PROXY_TIMEOUT_KEY, DEFAULT_METADATA_TIMEOUT_VALUE))\n-                    .addParameter(SIDE_KEY, CONSUMER);\n-\n-            // add parameters\n-            params.forEach((name, value) -> urlBuilder.addParameter(name, valueOf(value)));\n-\n-            // add the default parameters\n-            urlBuilder.addParameter(GROUP_KEY, serviceName);\n-\n-            urls.add(urlBuilder.build());\n-        }\n-\n-        return urls;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+\r\n+import static java.lang.String.valueOf;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PORT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.DEFAULT_METADATA_TIMEOUT_VALUE;\r\n+import static org.apache.dubbo.metadata.MetadataConstants.METADATA_PROXY_TIMEOUT_KEY;\r\n+import static org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils.getMetadataServiceURLsParams;\r\n+\r\n+/**\r\n+ * Standard Dubbo provider enabling introspection service discovery mode.\r\n+ *\r\n+ * @see MetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class StandardMetadataServiceURLBuilder implements MetadataServiceURLBuilder {\r\n+    \r\n+    public static final String NAME = \"standard\";\r\n+\r\n+    /**\r\n+     * Build the {@link URL urls} from {@link ServiceInstance#getMetadata() the metadata} of {@link ServiceInstance}\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     * @return the not-null {@link List}\r\n+     */\r\n+    @Override\r\n+    public List<URL> build(ServiceInstance serviceInstance) {\r\n+\r\n+        Map<String, Map<String, String>> paramsMap = getMetadataServiceURLsParams(serviceInstance);\r\n+\r\n+        List<URL> urls = new ArrayList<>(paramsMap.size());\r\n+\r\n+        String serviceName = serviceInstance.getServiceName();\r\n+\r\n+        String host = serviceInstance.getHost();\r\n+\r\n+        for (Map.Entry<String, Map<String, String>> entry : paramsMap.entrySet()) {\r\n+            String protocol = entry.getKey();\r\n+            Map<String, String> params = entry.getValue();\r\n+            int port = Integer.parseInt(params.get(PORT_KEY));\r\n+            URLBuilder urlBuilder = new URLBuilder()\r\n+                    .setHost(host)\r\n+                    .setPort(port)\r\n+                    .setProtocol(protocol)\r\n+                    .setPath(MetadataService.class.getName())\r\n+                    .addParameter(TIMEOUT_KEY, ConfigurationUtils.get(METADATA_PROXY_TIMEOUT_KEY, DEFAULT_METADATA_TIMEOUT_VALUE))\r\n+                    .addParameter(SIDE_KEY, CONSUMER);\r\n+\r\n+            // add parameters\r\n+            params.forEach((name, value) -> urlBuilder.addParameter(name, valueOf(value)));\r\n+\r\n+            // add the default parameters\r\n+            urlBuilder.addParameter(GROUP_KEY, serviceName);\r\n+\r\n+            urls.add(urlBuilder.build());\r\n+        }\r\n+\r\n+        return urls;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java", "source2": "org/apache/dubbo/registry/client/metadata/SubscribedURLsSynthesizer.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,55 +1,55 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.common.lang.Prioritized;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.Collection;\n-import java.util.List;\n-\n-/**\n- * The interface to synthesize the subscribed {@link URL URLs}\n- *\n- * @since 2.7.5\n- */\n-@SPI\n-public interface SubscribedURLsSynthesizer extends Prioritized {\n-\n-    /**\n-     * Supports the synthesis of the subscribed {@link URL URLs} or not\n-     *\n-     * @param subscribedURL the original subscribed {@link URL} from the execution of`\n-     *                      {@link Registry#subscribe(URL, NotifyListener)} method\n-     * @return if supports, return <code>true</code>, or <code>false</code>\n-     */\n-    boolean supports(URL subscribedURL);\n-\n-    /**\n-     * synthesize the subscribed {@link URL URLs}\n-     *\n-     * @param subscribedURL    the original subscribed {@link URL} from the execution of`\n-     *                         {@link Registry#subscribe(URL, NotifyListener)} method\n-     * @param serviceInstances\n-     * @return\n-     */\n-    List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.common.lang.Prioritized;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.Collection;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The interface to synthesize the subscribed {@link URL URLs}\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI\r\n+public interface SubscribedURLsSynthesizer extends Prioritized {\r\n+\r\n+    /**\r\n+     * Supports the synthesis of the subscribed {@link URL URLs} or not\r\n+     *\r\n+     * @param subscribedURL the original subscribed {@link URL} from the execution of`\r\n+     *                      {@link Registry#subscribe(URL, NotifyListener)} method\r\n+     * @return if supports, return <code>true</code>, or <code>false</code>\r\n+     */\r\n+    boolean supports(URL subscribedURL);\r\n+\r\n+    /**\r\n+     * synthesize the subscribed {@link URL URLs}\r\n+     *\r\n+     * @param subscribedURL    the original subscribed {@link URL} from the execution of`\r\n+     *                         {@link Registry#subscribe(URL, NotifyListener)} method\r\n+     * @param serviceInstances\r\n+     * @return\r\n+     */\r\n+    List<URL> synthesize(URL subscribedURL, Collection<ServiceInstance> serviceInstances);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java", "source2": "org/apache/dubbo/registry/client/metadata/store/InMemoryWritableMetadataService.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,301 +1,301 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata.store;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\n-import org.apache.dubbo.metadata.MetadataService;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\n-import org.apache.dubbo.metadata.definition.model.ServiceDefinition;\n-import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.support.ProtocolUtils;\n-\n-import com.google.gson.Gson;\n-\n-import java.util.Comparator;\n-import java.util.Map;\n-import java.util.SortedSet;\n-import java.util.TreeSet;\n-import java.util.concurrent.Callable;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ConcurrentNavigableMap;\n-import java.util.concurrent.ConcurrentSkipListMap;\n-import java.util.concurrent.Semaphore;\n-import java.util.concurrent.locks.Lock;\n-import java.util.concurrent.locks.ReentrantLock;\n-\n-import static java.util.Collections.emptySortedSet;\n-import static java.util.Collections.unmodifiableSortedSet;\n-import static org.apache.dubbo.common.URL.buildKey;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\n-import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\n-\n-/**\n- * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in memory locally when they\n- * exported. It is used by server (provider).\n- *\n- * @see MetadataService\n- * @see WritableMetadataService\n- * @since 2.7.5\n- */\n-public class InMemoryWritableMetadataService implements WritableMetadataService {\n-\n-    final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    private final Lock lock = new ReentrantLock();\n-\n-    // =================================== Registration =================================== //\n-\n-    /**\n-     * All exported {@link URL urls} {@link Map} whose key is the return value of {@link URL#getServiceKey()} method\n-     * and value is the {@link SortedSet sorted set} of the {@link URL URLs}\n-     */\n-    ConcurrentNavigableMap<String, SortedSet<URL>> exportedServiceURLs = new ConcurrentSkipListMap<>();\n-    ConcurrentMap<String, MetadataInfo> metadataInfos;\n-    final Semaphore metadataSemaphore = new Semaphore(1);\n-\n-    // ==================================================================================== //\n-\n-    // =================================== Subscription =================================== //\n-\n-    /**\n-     * The subscribed {@link URL urls} {@link Map} of {@link MetadataService},\n-     * whose key is the return value of {@link URL#getServiceKey()} method and value is\n-     * the {@link SortedSet sorted set} of the {@link URL URLs}\n-     */\n-    ConcurrentNavigableMap<String, SortedSet<URL>> subscribedServiceURLs = new ConcurrentSkipListMap<>();\n-\n-    ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();\n-\n-    public InMemoryWritableMetadataService() {\n-        this.metadataInfos = new ConcurrentHashMap<>();\n-    }\n-\n-    @Override\n-    public SortedSet<String> getSubscribedURLs() {\n-        return getAllUnmodifiableServiceURLs(subscribedServiceURLs);\n-    }\n-\n-    private SortedSet<String> getAllUnmodifiableServiceURLs(Map<String, SortedSet<URL>> serviceURLs) {\n-        SortedSet<URL> bizURLs = new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\n-        for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {\n-            SortedSet<URL> urls = entry.getValue();\n-            if (urls != null) {\n-                for (URL url : urls) {\n-                    if (!MetadataService.class.getName().equals(url.getServiceInterface())) {\n-                        bizURLs.add(url);\n-                    }\n-                }\n-            }\n-        }\n-        return MetadataService.toSortedStrings(bizURLs);\n-    }\n-\n-    @Override\n-    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {\n-        if (ALL_SERVICE_INTERFACES.equals(serviceInterface)) {\n-            return getAllUnmodifiableServiceURLs(exportedServiceURLs);\n-        }\n-        String serviceKey = buildKey(serviceInterface, group, version);\n-        return unmodifiableSortedSet(getServiceURLs(exportedServiceURLs, serviceKey, protocol));\n-    }\n-\n-    @Override\n-    public boolean exportURL(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-        String[] clusters = registryCluster.split(\",\");\n-        for (String cluster : clusters) {\n-            MetadataInfo metadataInfo = metadataInfos.computeIfAbsent(cluster, k -> {\n-                return new MetadataInfo(ApplicationModel.getName());\n-            });\n-            metadataInfo.addService(new ServiceInfo(url));\n-        }\n-        metadataSemaphore.release();\n-        return addURL(exportedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean unexportURL(URL url) {\n-        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\n-        String[] clusters = registryCluster.split(\",\");\n-        for (String cluster : clusters) {\n-            MetadataInfo metadataInfo = metadataInfos.get(cluster);\n-            metadataInfo.removeService(url.getProtocolServiceKey());\n-            if (metadataInfo.getServices().isEmpty()) {\n-                metadataInfos.remove(cluster);\n-            }\n-        }\n-        metadataSemaphore.release();\n-        return removeURL(exportedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean subscribeURL(URL url) {\n-        return addURL(subscribedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public boolean unsubscribeURL(URL url) {\n-        return removeURL(subscribedServiceURLs, url);\n-    }\n-\n-    @Override\n-    public void publishServiceDefinition(URL providerUrl) {\n-        try {\n-            if (!ProtocolUtils.isGeneric(providerUrl.getParameter(GENERIC_KEY))) {\n-                String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\n-                if (StringUtils.isNotEmpty(interfaceName)) {\n-                    Class interfaceClass = Class.forName(interfaceName);\n-                    ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);\n-                    Gson gson = new Gson();\n-                    String data = gson.toJson(serviceDefinition);\n-                    serviceDefinitions.put(providerUrl.getServiceKey(), data);\n-                    return;\n-                }\n-                logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\n-            } else if (CONSUMER_SIDE.equalsIgnoreCase(providerUrl.getParameter(SIDE_KEY))) {\n-                //to avoid consumer generic invoke style error\n-                return;\n-            }\n-        } catch (ClassNotFoundException e) {\n-            //ignore error\n-            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\n-        }\n-    }\n-\n-    @Override\n-    public String getServiceDefinition(String interfaceName, String version, String group) {\n-        return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));\n-    }\n-\n-    @Override\n-    public String getServiceDefinition(String serviceKey) {\n-        return serviceDefinitions.get(serviceKey);\n-    }\n-\n-    @Override\n-    public MetadataInfo getMetadataInfo(String revision) {\n-        if (StringUtils.isEmpty(revision)) {\n-            return null;\n-        }\n-        for (Map.Entry<String, MetadataInfo> entry : metadataInfos.entrySet()) {\n-            MetadataInfo metadataInfo = entry.getValue();\n-            if (revision.equals(metadataInfo.calAndGetRevision())) {\n-                return metadataInfo;\n-            }\n-        }\n-        return null;\n-    }\n-\n-    public void blockUntilUpdated() {\n-        try {\n-            metadataSemaphore.acquire();\n-        } catch (InterruptedException e) {\n-            logger.warn(\"metadata refresh thread has been interrupted unexpectedly while waiting for update.\", e);\n-        }\n-    }\n-\n-    public Map<String, MetadataInfo> getMetadataInfos() {\n-        return metadataInfos;\n-    }\n-\n-    boolean addURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\n-        return executeMutually(() -> {\n-            SortedSet<URL> urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs);\n-            // make sure the parameters of tmpUrl is variable\n-            return urls.add(url);\n-        });\n-    }\n-\n-    boolean removeURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\n-        return executeMutually(() -> {\n-            String key = url.getServiceKey();\n-            SortedSet<URL> urls = serviceURLs.getOrDefault(key, null);\n-            if (urls == null) {\n-                return true;\n-            }\n-            boolean r = urls.remove(url);\n-            // if it is empty\n-            if (urls.isEmpty()) {\n-                serviceURLs.remove(key);\n-            }\n-            return r;\n-        });\n-    }\n-\n-    private SortedSet<URL> newSortedURLs(String serviceKey) {\n-        return new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\n-    }\n-\n-    boolean executeMutually(Callable<Boolean> callable) {\n-        boolean success = false;\n-        try {\n-            lock.lock();\n-            try {\n-                success = callable.call();\n-            } catch (Exception e) {\n-                if (logger.isErrorEnabled()) {\n-                    logger.error(e);\n-                }\n-            }\n-        } finally {\n-            lock.unlock();\n-        }\n-        return success;\n-    }\n-\n-    private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,\n-                                             String protocol) {\n-\n-        SortedSet<URL> serviceURLs = exportedServiceURLs.get(serviceKey);\n-\n-        if (isEmpty(serviceURLs)) {\n-            return emptySortedSet();\n-        }\n-\n-        return MetadataService.toSortedStrings(serviceURLs.stream().filter(url -> isAcceptableProtocol(protocol, url)));\n-    }\n-\n-    private boolean isAcceptableProtocol(String protocol, URL url) {\n-        return protocol == null\n-                || protocol.equals(url.getParameter(PROTOCOL_KEY))\n-                || protocol.equals(url.getProtocol());\n-    }\n-\n-\n-    static class URLComparator implements Comparator<URL> {\n-\n-        public static final URLComparator INSTANCE = new URLComparator();\n-\n-        @Override\n-        public int compare(URL o1, URL o2) {\n-            return o1.toFullString().compareTo(o2.toFullString());\n-        }\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata.store;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.MetadataInfo.ServiceInfo;\r\n+import org.apache.dubbo.metadata.MetadataService;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\r\n+import org.apache.dubbo.metadata.definition.model.ServiceDefinition;\r\n+import org.apache.dubbo.registry.client.RegistryClusterIdentifier;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.support.ProtocolUtils;\r\n+\r\n+import com.google.gson.Gson;\r\n+\r\n+import java.util.Comparator;\r\n+import java.util.Map;\r\n+import java.util.SortedSet;\r\n+import java.util.TreeSet;\r\n+import java.util.concurrent.Callable;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ConcurrentNavigableMap;\r\n+import java.util.concurrent.ConcurrentSkipListMap;\r\n+import java.util.concurrent.Semaphore;\r\n+import java.util.concurrent.locks.Lock;\r\n+import java.util.concurrent.locks.ReentrantLock;\r\n+\r\n+import static java.util.Collections.emptySortedSet;\r\n+import static java.util.Collections.unmodifiableSortedSet;\r\n+import static org.apache.dubbo.common.URL.buildKey;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.utils.CollectionUtils.isEmpty;\r\n+import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;\r\n+\r\n+/**\r\n+ * The {@link WritableMetadataService} implementation stores the metadata of Dubbo services in memory locally when they\r\n+ * exported. It is used by server (provider).\r\n+ *\r\n+ * @see MetadataService\r\n+ * @see WritableMetadataService\r\n+ * @since 2.7.5\r\n+ */\r\n+public class InMemoryWritableMetadataService implements WritableMetadataService {\r\n+\r\n+    final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    private final Lock lock = new ReentrantLock();\r\n+\r\n+    // =================================== Registration =================================== //\r\n+\r\n+    /**\r\n+     * All exported {@link URL urls} {@link Map} whose key is the return value of {@link URL#getServiceKey()} method\r\n+     * and value is the {@link SortedSet sorted set} of the {@link URL URLs}\r\n+     */\r\n+    ConcurrentNavigableMap<String, SortedSet<URL>> exportedServiceURLs = new ConcurrentSkipListMap<>();\r\n+    ConcurrentMap<String, MetadataInfo> metadataInfos;\r\n+    final Semaphore metadataSemaphore = new Semaphore(1);\r\n+\r\n+    // ==================================================================================== //\r\n+\r\n+    // =================================== Subscription =================================== //\r\n+\r\n+    /**\r\n+     * The subscribed {@link URL urls} {@link Map} of {@link MetadataService},\r\n+     * whose key is the return value of {@link URL#getServiceKey()} method and value is\r\n+     * the {@link SortedSet sorted set} of the {@link URL URLs}\r\n+     */\r\n+    ConcurrentNavigableMap<String, SortedSet<URL>> subscribedServiceURLs = new ConcurrentSkipListMap<>();\r\n+\r\n+    ConcurrentNavigableMap<String, String> serviceDefinitions = new ConcurrentSkipListMap<>();\r\n+\r\n+    public InMemoryWritableMetadataService() {\r\n+        this.metadataInfos = new ConcurrentHashMap<>();\r\n+    }\r\n+\r\n+    @Override\r\n+    public SortedSet<String> getSubscribedURLs() {\r\n+        return getAllUnmodifiableServiceURLs(subscribedServiceURLs);\r\n+    }\r\n+\r\n+    private SortedSet<String> getAllUnmodifiableServiceURLs(Map<String, SortedSet<URL>> serviceURLs) {\r\n+        SortedSet<URL> bizURLs = new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\r\n+        for (Map.Entry<String, SortedSet<URL>> entry : serviceURLs.entrySet()) {\r\n+            SortedSet<URL> urls = entry.getValue();\r\n+            if (urls != null) {\r\n+                for (URL url : urls) {\r\n+                    if (!MetadataService.class.getName().equals(url.getServiceInterface())) {\r\n+                        bizURLs.add(url);\r\n+                    }\r\n+                }\r\n+            }\r\n+        }\r\n+        return MetadataService.toSortedStrings(bizURLs);\r\n+    }\r\n+\r\n+    @Override\r\n+    public SortedSet<String> getExportedURLs(String serviceInterface, String group, String version, String protocol) {\r\n+        if (ALL_SERVICE_INTERFACES.equals(serviceInterface)) {\r\n+            return getAllUnmodifiableServiceURLs(exportedServiceURLs);\r\n+        }\r\n+        String serviceKey = buildKey(serviceInterface, group, version);\r\n+        return unmodifiableSortedSet(getServiceURLs(exportedServiceURLs, serviceKey, protocol));\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean exportURL(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+        String[] clusters = registryCluster.split(\",\");\r\n+        for (String cluster : clusters) {\r\n+            MetadataInfo metadataInfo = metadataInfos.computeIfAbsent(cluster, k -> {\r\n+                return new MetadataInfo(ApplicationModel.getName());\r\n+            });\r\n+            metadataInfo.addService(new ServiceInfo(url));\r\n+        }\r\n+        metadataSemaphore.release();\r\n+        return addURL(exportedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean unexportURL(URL url) {\r\n+        String registryCluster = RegistryClusterIdentifier.getExtension(url).providerKey(url);\r\n+        String[] clusters = registryCluster.split(\",\");\r\n+        for (String cluster : clusters) {\r\n+            MetadataInfo metadataInfo = metadataInfos.get(cluster);\r\n+            metadataInfo.removeService(url.getProtocolServiceKey());\r\n+            if (metadataInfo.getServices().isEmpty()) {\r\n+                metadataInfos.remove(cluster);\r\n+            }\r\n+        }\r\n+        metadataSemaphore.release();\r\n+        return removeURL(exportedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean subscribeURL(URL url) {\r\n+        return addURL(subscribedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean unsubscribeURL(URL url) {\r\n+        return removeURL(subscribedServiceURLs, url);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void publishServiceDefinition(URL providerUrl) {\r\n+        try {\r\n+            if (!ProtocolUtils.isGeneric(providerUrl.getParameter(GENERIC_KEY))) {\r\n+                String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\r\n+                if (StringUtils.isNotEmpty(interfaceName)) {\r\n+                    Class interfaceClass = Class.forName(interfaceName);\r\n+                    ServiceDefinition serviceDefinition = ServiceDefinitionBuilder.build(interfaceClass);\r\n+                    Gson gson = new Gson();\r\n+                    String data = gson.toJson(serviceDefinition);\r\n+                    serviceDefinitions.put(providerUrl.getServiceKey(), data);\r\n+                    return;\r\n+                }\r\n+                logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\r\n+            } else if (CONSUMER_SIDE.equalsIgnoreCase(providerUrl.getParameter(SIDE_KEY))) {\r\n+                //to avoid consumer generic invoke style error\r\n+                return;\r\n+            }\r\n+        } catch (ClassNotFoundException e) {\r\n+            //ignore error\r\n+            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceDefinition(String interfaceName, String version, String group) {\r\n+        return serviceDefinitions.get(URL.buildKey(interfaceName, group, version));\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getServiceDefinition(String serviceKey) {\r\n+        return serviceDefinitions.get(serviceKey);\r\n+    }\r\n+\r\n+    @Override\r\n+    public MetadataInfo getMetadataInfo(String revision) {\r\n+        if (StringUtils.isEmpty(revision)) {\r\n+            return null;\r\n+        }\r\n+        for (Map.Entry<String, MetadataInfo> entry : metadataInfos.entrySet()) {\r\n+            MetadataInfo metadataInfo = entry.getValue();\r\n+            if (revision.equals(metadataInfo.calAndGetRevision())) {\r\n+                return metadataInfo;\r\n+            }\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    public void blockUntilUpdated() {\r\n+        try {\r\n+            metadataSemaphore.acquire();\r\n+        } catch (InterruptedException e) {\r\n+            logger.warn(\"metadata refresh thread has been interrupted unexpectedly while waiting for update.\", e);\r\n+        }\r\n+    }\r\n+\r\n+    public Map<String, MetadataInfo> getMetadataInfos() {\r\n+        return metadataInfos;\r\n+    }\r\n+\r\n+    boolean addURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\r\n+        return executeMutually(() -> {\r\n+            SortedSet<URL> urls = serviceURLs.computeIfAbsent(url.getServiceKey(), this::newSortedURLs);\r\n+            // make sure the parameters of tmpUrl is variable\r\n+            return urls.add(url);\r\n+        });\r\n+    }\r\n+\r\n+    boolean removeURL(Map<String, SortedSet<URL>> serviceURLs, URL url) {\r\n+        return executeMutually(() -> {\r\n+            String key = url.getServiceKey();\r\n+            SortedSet<URL> urls = serviceURLs.getOrDefault(key, null);\r\n+            if (urls == null) {\r\n+                return true;\r\n+            }\r\n+            boolean r = urls.remove(url);\r\n+            // if it is empty\r\n+            if (urls.isEmpty()) {\r\n+                serviceURLs.remove(key);\r\n+            }\r\n+            return r;\r\n+        });\r\n+    }\r\n+\r\n+    private SortedSet<URL> newSortedURLs(String serviceKey) {\r\n+        return new TreeSet<>(InMemoryWritableMetadataService.URLComparator.INSTANCE);\r\n+    }\r\n+\r\n+    boolean executeMutually(Callable<Boolean> callable) {\r\n+        boolean success = false;\r\n+        try {\r\n+            lock.lock();\r\n+            try {\r\n+                success = callable.call();\r\n+            } catch (Exception e) {\r\n+                if (logger.isErrorEnabled()) {\r\n+                    logger.error(e);\r\n+                }\r\n+            }\r\n+        } finally {\r\n+            lock.unlock();\r\n+        }\r\n+        return success;\r\n+    }\r\n+\r\n+    private SortedSet<String> getServiceURLs(Map<String, SortedSet<URL>> exportedServiceURLs, String serviceKey,\r\n+                                             String protocol) {\r\n+\r\n+        SortedSet<URL> serviceURLs = exportedServiceURLs.get(serviceKey);\r\n+\r\n+        if (isEmpty(serviceURLs)) {\r\n+            return emptySortedSet();\r\n+        }\r\n+\r\n+        return MetadataService.toSortedStrings(serviceURLs.stream().filter(url -> isAcceptableProtocol(protocol, url)));\r\n+    }\r\n+\r\n+    private boolean isAcceptableProtocol(String protocol, URL url) {\r\n+        return protocol == null\r\n+                || protocol.equals(url.getParameter(PROTOCOL_KEY))\r\n+                || protocol.equals(url.getProtocol());\r\n+    }\r\n+\r\n+\r\n+    static class URLComparator implements Comparator<URL> {\r\n+\r\n+        public static final URLComparator INSTANCE = new URLComparator();\r\n+\r\n+        @Override\r\n+        public int compare(URL o1, URL o2) {\r\n+            return o1.toFullString().compareTo(o2.toFullString());\r\n+        }\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java", "source2": "org/apache/dubbo/registry/client/metadata/store/RemoteMetadataServiceImpl.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,143 +1,143 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.metadata.store;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.metadata.MetadataInfo;\n-import org.apache.dubbo.metadata.WritableMetadataService;\n-import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\n-import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;\n-import org.apache.dubbo.metadata.report.MetadataReport;\n-import org.apache.dubbo.metadata.report.MetadataReportInstance;\n-import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;\n-import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\n-import org.apache.dubbo.remoting.Constants;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import java.util.Map;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\n-import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\n-\n-public class RemoteMetadataServiceImpl {\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-    private WritableMetadataService localMetadataService;\n-\n-    public RemoteMetadataServiceImpl(WritableMetadataService writableMetadataService) {\n-        this.localMetadataService = writableMetadataService;\n-    }\n-\n-    public Map<String, MetadataReport> getMetadataReports() {\n-        return MetadataReportInstance.getMetadataReports(false);\n-    }\n-\n-    public void publishMetadata(String serviceName) {\n-        Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();\n-        metadataInfos.forEach((registryCluster, metadataInfo) -> {\n-            if (!metadataInfo.hasReported()) {\n-                SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(serviceName, metadataInfo.calAndGetRevision());\n-                metadataInfo.calAndGetRevision();\n-                metadataInfo.getExtendParams().put(REGISTRY_CLUSTER_KEY, registryCluster);\n-                MetadataReport metadataReport = getMetadataReports().get(registryCluster);\n-                if (metadataReport == null) {\n-                    metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\n-                }\n-                logger.info(\"Publishing metadata to \" + metadataReport.getClass().getSimpleName());\n-                if (logger.isDebugEnabled()) {\n-                    logger.debug(metadataInfo.toString());\n-                }\n-                metadataReport.publishAppMetadata(identifier, metadataInfo);\n-                metadataInfo.markReported();\n-            }\n-        });\n-    }\n-\n-    public MetadataInfo getMetadata(ServiceInstance instance) {\n-        SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(),\n-                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\n-\n-        String registryCluster = instance.getExtendParams().get(REGISTRY_CLUSTER_KEY);\n-\n-        MetadataReport metadataReport = getMetadataReports().get(registryCluster);\n-        if (metadataReport == null) {\n-            metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\n-        }\n-        return metadataReport.getAppMetadata(identifier, instance.getExtendParams());\n-    }\n-\n-    public void publishServiceDefinition(URL url) {\n-        String side = url.getParameter(SIDE_KEY);\n-        if (PROVIDER_SIDE.equalsIgnoreCase(side)) {\n-            //TODO, the params part is duplicate with that stored by exportURL(url), can be further optimized in the future.\n-            publishProvider(url);\n-        } else {\n-            //TODO, only useful for ops showing the url parameters, this is duplicate with subscribeURL(url), can be removed in the future.\n-            publishConsumer(url);\n-        }\n-    }\n-\n-    private void publishProvider(URL providerUrl) throws RpcException {\n-        //first add into the list\n-        // remove the individual param\n-        providerUrl = providerUrl.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\n-                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\n-\n-        try {\n-            String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\n-            if (StringUtils.isNotEmpty(interfaceName)) {\n-                Class interfaceClass = Class.forName(interfaceName);\n-                FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass,\n-                        providerUrl.getParameters());\n-                for (Map.Entry<String, MetadataReport> entry : getMetadataReports().entrySet()) {\n-                    MetadataReport metadataReport = entry.getValue();\n-                    metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),\n-                            providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),\n-                            PROVIDER_SIDE, providerUrl.getParameter(APPLICATION_KEY)), fullServiceDefinition);\n-                }\n-                return;\n-            }\n-            logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\n-        } catch (ClassNotFoundException e) {\n-            //ignore error\n-            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\n-        }\n-    }\n-\n-    private void publishConsumer(URL consumerURL) throws RpcException {\n-        final URL url = consumerURL.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\n-                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\n-        getMetadataReports().forEach((registryKey, config) -> {\n-            config.storeConsumerMetadata(new MetadataIdentifier(url.getServiceInterface(),\n-                    url.getParameter(VERSION_KEY), url.getParameter(GROUP_KEY), CONSUMER_SIDE,\n-                    url.getParameter(APPLICATION_KEY)), url.getParameters());\n-        });\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.metadata.store;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.metadata.MetadataInfo;\r\n+import org.apache.dubbo.metadata.WritableMetadataService;\r\n+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;\r\n+import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;\r\n+import org.apache.dubbo.metadata.report.MetadataReport;\r\n+import org.apache.dubbo.metadata.report.MetadataReportInstance;\r\n+import org.apache.dubbo.metadata.report.identifier.MetadataIdentifier;\r\n+import org.apache.dubbo.metadata.report.identifier.SubscriberMetadataIdentifier;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;\r\n+import org.apache.dubbo.remoting.Constants;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import java.util.Map;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CONSUMER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PID_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER_SIDE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.SIDE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_CLUSTER_KEY;\r\n+\r\n+public class RemoteMetadataServiceImpl {\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+    private WritableMetadataService localMetadataService;\r\n+\r\n+    public RemoteMetadataServiceImpl(WritableMetadataService writableMetadataService) {\r\n+        this.localMetadataService = writableMetadataService;\r\n+    }\r\n+\r\n+    public Map<String, MetadataReport> getMetadataReports() {\r\n+        return MetadataReportInstance.getMetadataReports(false);\r\n+    }\r\n+\r\n+    public void publishMetadata(String serviceName) {\r\n+        Map<String, MetadataInfo> metadataInfos = localMetadataService.getMetadataInfos();\r\n+        metadataInfos.forEach((registryCluster, metadataInfo) -> {\r\n+            if (!metadataInfo.hasReported()) {\r\n+                SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(serviceName, metadataInfo.calAndGetRevision());\r\n+                metadataInfo.calAndGetRevision();\r\n+                metadataInfo.getExtendParams().put(REGISTRY_CLUSTER_KEY, registryCluster);\r\n+                MetadataReport metadataReport = getMetadataReports().get(registryCluster);\r\n+                if (metadataReport == null) {\r\n+                    metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\r\n+                }\r\n+                logger.info(\"Publishing metadata to \" + metadataReport.getClass().getSimpleName());\r\n+                if (logger.isDebugEnabled()) {\r\n+                    logger.debug(metadataInfo.toString());\r\n+                }\r\n+                metadataReport.publishAppMetadata(identifier, metadataInfo);\r\n+                metadataInfo.markReported();\r\n+            }\r\n+        });\r\n+    }\r\n+\r\n+    public MetadataInfo getMetadata(ServiceInstance instance) {\r\n+        SubscriberMetadataIdentifier identifier = new SubscriberMetadataIdentifier(instance.getServiceName(),\r\n+                ServiceInstanceMetadataUtils.getExportedServicesRevision(instance));\r\n+\r\n+        String registryCluster = instance.getExtendParams().get(REGISTRY_CLUSTER_KEY);\r\n+\r\n+        MetadataReport metadataReport = getMetadataReports().get(registryCluster);\r\n+        if (metadataReport == null) {\r\n+            metadataReport = getMetadataReports().entrySet().iterator().next().getValue();\r\n+        }\r\n+        return metadataReport.getAppMetadata(identifier, instance.getExtendParams());\r\n+    }\r\n+\r\n+    public void publishServiceDefinition(URL url) {\r\n+        String side = url.getParameter(SIDE_KEY);\r\n+        if (PROVIDER_SIDE.equalsIgnoreCase(side)) {\r\n+            //TODO, the params part is duplicate with that stored by exportURL(url), can be further optimized in the future.\r\n+            publishProvider(url);\r\n+        } else {\r\n+            //TODO, only useful for ops showing the url parameters, this is duplicate with subscribeURL(url), can be removed in the future.\r\n+            publishConsumer(url);\r\n+        }\r\n+    }\r\n+\r\n+    private void publishProvider(URL providerUrl) throws RpcException {\r\n+        //first add into the list\r\n+        // remove the individual param\r\n+        providerUrl = providerUrl.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\r\n+                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\r\n+\r\n+        try {\r\n+            String interfaceName = providerUrl.getParameter(INTERFACE_KEY);\r\n+            if (StringUtils.isNotEmpty(interfaceName)) {\r\n+                Class interfaceClass = Class.forName(interfaceName);\r\n+                FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(interfaceClass,\r\n+                        providerUrl.getParameters());\r\n+                for (Map.Entry<String, MetadataReport> entry : getMetadataReports().entrySet()) {\r\n+                    MetadataReport metadataReport = entry.getValue();\r\n+                    metadataReport.storeProviderMetadata(new MetadataIdentifier(providerUrl.getServiceInterface(),\r\n+                            providerUrl.getParameter(VERSION_KEY), providerUrl.getParameter(GROUP_KEY),\r\n+                            PROVIDER_SIDE, providerUrl.getParameter(APPLICATION_KEY)), fullServiceDefinition);\r\n+                }\r\n+                return;\r\n+            }\r\n+            logger.error(\"publishProvider interfaceName is empty . providerUrl: \" + providerUrl.toFullString());\r\n+        } catch (ClassNotFoundException e) {\r\n+            //ignore error\r\n+            logger.error(\"publishProvider getServiceDescriptor error. providerUrl: \" + providerUrl.toFullString(), e);\r\n+        }\r\n+    }\r\n+\r\n+    private void publishConsumer(URL consumerURL) throws RpcException {\r\n+        final URL url = consumerURL.removeParameters(PID_KEY, TIMESTAMP_KEY, Constants.BIND_IP_KEY,\r\n+                Constants.BIND_PORT_KEY, TIMESTAMP_KEY);\r\n+        getMetadataReports().forEach((registryKey, config) -> {\r\n+            config.storeConsumerMetadata(new MetadataIdentifier(url.getServiceInterface(),\r\n+                    url.getParameter(VERSION_KEY), url.getParameter(GROUP_KEY), CONSUMER_SIDE,\r\n+                    url.getParameter(APPLICATION_KEY)), url.getParameters());\r\n+        });\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java", "source2": "org/apache/dubbo/registry/client/migration/DefaultMigrationAddressComparator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,74 +1,74 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-import java.util.List;\n-\n-public class DefaultMigrationAddressComparator implements MigrationAddressComparator {\n-    private static final Logger logger = LoggerFactory.getLogger(DefaultMigrationAddressComparator.class);\n-    private static final String MIGRATION_THRESHOLD = \"dubbo.application.migration.threshold\";\n-    private static final String DEFAULT_THRESHOLD_STRING = \"0.8\";\n-    private static final float DEFAULT_THREAD = 0.8f;\n-\n-    @Override\n-    public <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\n-        if (!serviceDiscoveryInvoker.isAvailable()) {\n-            logger.info(\"No instance address available, will not migrate.\");\n-            return false;\n-        }\n-        if (!invoker.isAvailable()) {\n-            logger.info(\"No interface address available, will migrate.\");\n-            return true;\n-        }\n-\n-        List<Invoker<T>> invokers1 = serviceDiscoveryInvoker.getDirectory().getAllInvokers();\n-        List<Invoker<T>> invokers2 = invoker.getDirectory().getAllInvokers();\n-\n-        int newAddressSize = CollectionUtils.isNotEmpty(invokers1) ? invokers1.size() : 0;\n-        int oldAddressSize = CollectionUtils.isNotEmpty(invokers2) ? invokers2.size() : 0;\n-\n-        String rawThreshold = ConfigurationUtils.getDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING);\n-        float threshold;\n-        try {\n-            threshold = Float.parseFloat(rawThreshold);\n-        } catch (Exception e) {\n-            logger.error(\"Invalid migration threshold \" + rawThreshold);\n-            threshold = DEFAULT_THREAD;\n-        }\n-\n-        logger.info(\"Instance address size \" + newAddressSize + \", interface address size \" + oldAddressSize + \", threshold \" + threshold);\n-\n-        if (newAddressSize != 0 && oldAddressSize == 0) {\n-            return true;\n-        }\n-        if (newAddressSize == 0 && oldAddressSize == 0) {\n-            return false;\n-        }\n-\n-        if (((float)newAddressSize / (float)oldAddressSize) >= threshold) {\n-            return true;\n-        }\n-        return false;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+import java.util.List;\r\n+\r\n+public class DefaultMigrationAddressComparator implements MigrationAddressComparator {\r\n+    private static final Logger logger = LoggerFactory.getLogger(DefaultMigrationAddressComparator.class);\r\n+    private static final String MIGRATION_THRESHOLD = \"dubbo.application.migration.threshold\";\r\n+    private static final String DEFAULT_THRESHOLD_STRING = \"0.8\";\r\n+    private static final float DEFAULT_THREAD = 0.8f;\r\n+\r\n+    @Override\r\n+    public <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\r\n+        if (!serviceDiscoveryInvoker.isAvailable()) {\r\n+            logger.info(\"No instance address available, will not migrate.\");\r\n+            return false;\r\n+        }\r\n+        if (!invoker.isAvailable()) {\r\n+            logger.info(\"No interface address available, will migrate.\");\r\n+            return true;\r\n+        }\r\n+\r\n+        List<Invoker<T>> invokers1 = serviceDiscoveryInvoker.getDirectory().getAllInvokers();\r\n+        List<Invoker<T>> invokers2 = invoker.getDirectory().getAllInvokers();\r\n+\r\n+        int newAddressSize = CollectionUtils.isNotEmpty(invokers1) ? invokers1.size() : 0;\r\n+        int oldAddressSize = CollectionUtils.isNotEmpty(invokers2) ? invokers2.size() : 0;\r\n+\r\n+        String rawThreshold = ConfigurationUtils.getDynamicProperty(MIGRATION_THRESHOLD, DEFAULT_THRESHOLD_STRING);\r\n+        float threshold;\r\n+        try {\r\n+            threshold = Float.parseFloat(rawThreshold);\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Invalid migration threshold \" + rawThreshold);\r\n+            threshold = DEFAULT_THREAD;\r\n+        }\r\n+\r\n+        logger.info(\"Instance address size \" + newAddressSize + \", interface address size \" + oldAddressSize + \", threshold \" + threshold);\r\n+\r\n+        if (newAddressSize != 0 && oldAddressSize == 0) {\r\n+            return true;\r\n+        }\r\n+        if (newAddressSize == 0 && oldAddressSize == 0) {\r\n+            return false;\r\n+        }\r\n+\r\n+        if (((float)newAddressSize / (float)oldAddressSize) >= threshold) {\r\n+            return true;\r\n+        }\r\n+        return false;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/InvokersChangedListener.java", "source2": "org/apache/dubbo/registry/client/migration/InvokersChangedListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,21 +1,21 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-public interface InvokersChangedListener {\n-    void onChange();\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+public interface InvokersChangedListener {\r\n+    void onChange();\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationAddressComparator.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,25 +1,25 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-@SPI\n-public interface MigrationAddressComparator {\n-    <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+@SPI\r\n+public interface MigrationAddressComparator {\r\n+    <T> boolean shouldMigrate(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationInvoker.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationInvoker.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,390 +1,390 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.constants.RegistryConstants;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.integration.DynamicDirectory;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.Directory;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-\n-import java.util.Set;\n-import java.util.concurrent.atomic.AtomicBoolean;\n-\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-\n-public class MigrationInvoker<T> implements MigrationClusterInvoker<T> {\n-    private Logger logger = LoggerFactory.getLogger(MigrationInvoker.class);\n-\n-    private URL url;\n-    private URL consumerUrl;\n-    private Cluster cluster;\n-    private Registry registry;\n-    private Class<T> type;\n-    private RegistryProtocol registryProtocol;\n-\n-    private volatile ClusterInvoker<T> invoker;\n-    private volatile ClusterInvoker<T> serviceDiscoveryInvoker;\n-    private volatile ClusterInvoker<T> currentAvailableInvoker;\n-\n-    private MigrationRule rule;\n-\n-    private boolean migrationMultiRegistry;\n-\n-    public MigrationInvoker(RegistryProtocol registryProtocol,\n-                            Cluster cluster,\n-                            Registry registry,\n-                            Class<T> type,\n-                            URL url,\n-                            URL consumerUrl) {\n-        this(null, null, registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    public MigrationInvoker(ClusterInvoker<T> invoker,\n-                            ClusterInvoker<T> serviceDiscoveryInvoker,\n-                            RegistryProtocol registryProtocol,\n-                            Cluster cluster,\n-                            Registry registry,\n-                            Class<T> type,\n-                            URL url,\n-                            URL consumerUrl) {\n-        this.invoker = invoker;\n-        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\n-        this.registryProtocol = registryProtocol;\n-        this.cluster = cluster;\n-        this.registry = registry;\n-        this.type = type;\n-        this.url = url;\n-        this.consumerUrl = consumerUrl;\n-        this.migrationMultiRegistry = url.getParameter(RegistryConstants.MIGRATION_MULTI_REGISTRY, false);\n-    }\n-\n-    public ClusterInvoker<T> getInvoker() {\n-        return invoker;\n-    }\n-\n-    public void setInvoker(ClusterInvoker<T> invoker) {\n-        this.invoker = invoker;\n-    }\n-\n-    public ClusterInvoker<T> getServiceDiscoveryInvoker() {\n-        return serviceDiscoveryInvoker;\n-    }\n-\n-    public void setServiceDiscoveryInvoker(ClusterInvoker<T> serviceDiscoveryInvoker) {\n-        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return type;\n-    }\n-\n-    @Override\n-    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\n-        if (!forceMigrate) {\n-            refreshServiceDiscoveryInvoker();\n-            refreshInterfaceInvoker();\n-            setListener(invoker, () -> {\n-                this.compareAddresses(serviceDiscoveryInvoker, invoker);\n-            });\n-            setListener(serviceDiscoveryInvoker, () -> {\n-                this.compareAddresses(serviceDiscoveryInvoker, invoker);\n-            });\n-        } else {\n-            refreshServiceDiscoveryInvoker();\n-            setListener(serviceDiscoveryInvoker, () -> {\n-                this.destroyInterfaceInvoker(this.invoker);\n-            });\n-        }\n-    }\n-\n-    @Override\n-    public void reRefer(URL newSubscribeUrl) {\n-        // update url to prepare for migration refresh\n-        this.url = url.addParameter(REFER_KEY, StringUtils.toQueryString(newSubscribeUrl.getParameters()));\n-\n-        // re-subscribe immediately\n-        if (invoker != null && !invoker.isDestroyed()) {\n-            doReSubscribe(invoker, newSubscribeUrl);\n-        }\n-        if (serviceDiscoveryInvoker != null && !serviceDiscoveryInvoker.isDestroyed()) {\n-            doReSubscribe(serviceDiscoveryInvoker, newSubscribeUrl);\n-        }\n-    }\n-\n-    private void doReSubscribe(ClusterInvoker<T> invoker, URL newSubscribeUrl) {\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        URL oldSubscribeUrl = directory.getRegisteredConsumerUrl();\n-        Registry registry = directory.getRegistry();\n-        registry.unregister(directory.getRegisteredConsumerUrl());\n-        directory.unSubscribe(RegistryProtocol.toSubscribeUrl(oldSubscribeUrl));\n-        registry.register(directory.getRegisteredConsumerUrl());\n-\n-        directory.setRegisteredConsumerUrl(newSubscribeUrl);\n-        directory.buildRouterChain(newSubscribeUrl);\n-        directory.subscribe(RegistryProtocol.toSubscribeUrl(newSubscribeUrl));\n-    }\n-\n-    @Override\n-    public synchronized void fallbackToInterfaceInvoker() {\n-        refreshInterfaceInvoker();\n-        setListener(invoker, () -> {\n-            this.destroyServiceDiscoveryInvoker(this.serviceDiscoveryInvoker);\n-        });\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        if (!checkInvokerAvailable(serviceDiscoveryInvoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Using interface addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (invoker.getDirectory().getAllInvokers() == null ? \"is null\" : invoker.getDirectory().getAllInvokers().size()));\n-            }\n-            return invoker.invoke(invocation);\n-        }\n-\n-        if (!checkInvokerAvailable(invoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Using instance addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (serviceDiscoveryInvoker.getDirectory().getAllInvokers() == null ? \" is null \" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\n-            }\n-            return serviceDiscoveryInvoker.invoke(invocation);\n-        }\n-\n-        return currentAvailableInvoker.invoke(invocation);\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return (invoker != null && invoker.isAvailable())\n-                || (serviceDiscoveryInvoker != null && serviceDiscoveryInvoker.isAvailable());\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        if (invoker != null) {\n-            invoker.destroy();\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            serviceDiscoveryInvoker.destroy();\n-        }\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        if (invoker != null) {\n-            return invoker.getUrl();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            return serviceDiscoveryInvoker.getUrl();\n-        }\n-\n-        return consumerUrl;\n-    }\n-\n-    @Override\n-    public URL getRegistryUrl() {\n-        if (invoker != null) {\n-            return invoker.getRegistryUrl();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            serviceDiscoveryInvoker.getRegistryUrl();\n-        }\n-        return url;\n-    }\n-\n-    @Override\n-    public Directory<T> getDirectory() {\n-        if (invoker != null) {\n-            return invoker.getDirectory();\n-        } else if (serviceDiscoveryInvoker != null) {\n-            return serviceDiscoveryInvoker.getDirectory();\n-        }\n-        return null;\n-    }\n-\n-    @Override\n-    public boolean isDestroyed() {\n-        return (invoker == null || invoker.isDestroyed())\n-                && (serviceDiscoveryInvoker == null || serviceDiscoveryInvoker.isDestroyed());\n-    }\n-\n-\n-    @Override\n-    public AtomicBoolean invokersChanged() {\n-        return invokersChanged;\n-    }\n-\n-    private volatile AtomicBoolean invokersChanged = new AtomicBoolean(true);\n-\n-    private synchronized void compareAddresses(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\n-        this.invokersChanged.set(true);\n-        if (logger.isDebugEnabled()) {\n-            logger.info(invoker.getDirectory().getAllInvokers() == null ? \"null\" : invoker.getDirectory().getAllInvokers().size() + \"\");\n-        }\n-\n-        Set<MigrationAddressComparator> detectors = ExtensionLoader.getExtensionLoader(MigrationAddressComparator.class).getSupportedExtensionInstances();\n-        if (detectors != null && detectors.stream().allMatch(migrationDetector -> migrationDetector.shouldMigrate(serviceDiscoveryInvoker, invoker))) {\n-            discardInterfaceInvokerAddress(invoker);\n-        } else {\n-            discardServiceDiscoveryInvokerAddress(serviceDiscoveryInvoker);\n-        }\n-    }\n-\n-    private synchronized void setAddressChanged() {\n-        this.invokersChanged.set(true);\n-    }\n-\n-    public synchronized void destroyServiceDiscoveryInvoker(ClusterInvoker<?> serviceDiscoveryInvoker) {\n-        if (checkInvokerAvailable(this.invoker)) {\n-            this.currentAvailableInvoker = this.invoker;\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Destroying instance address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\n-            }\n-            serviceDiscoveryInvoker.destroy();\n-        }\n-    }\n-\n-    public synchronized void discardServiceDiscoveryInvokerAddress(ClusterInvoker<?> serviceDiscoveryInvoker) {\n-        if (checkInvokerAvailable(this.invoker)) {\n-            this.currentAvailableInvoker = this.invoker;\n-        }\n-        if (serviceDiscoveryInvoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Discarding instance addresses, total size \" + (null == serviceDiscoveryInvoker.getDirectory().getAllInvokers() ? \"null\" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\n-            }\n-            serviceDiscoveryInvoker.getDirectory().discordAddresses();\n-        }\n-    }\n-\n-    public synchronized void refreshServiceDiscoveryInvoker() {\n-        clearListener(serviceDiscoveryInvoker);\n-        if (needRefresh(serviceDiscoveryInvoker)) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Re-subscribing instance addresses, current interface \" + type.getName());\n-            }\n-            serviceDiscoveryInvoker = registryProtocol.getServiceDiscoveryInvoker(cluster, registry, type, url);\n-\n-            if (migrationMultiRegistry) {\n-                setListener(serviceDiscoveryInvoker, () -> {\n-                    this.setAddressChanged();\n-                });\n-            }\n-        }\n-    }\n-\n-    private void clearListener(ClusterInvoker<T> invoker) {\n-        if (migrationMultiRegistry) {\n-            return;\n-        }\n-\n-        if (invoker == null) {\n-            return;\n-        }\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        directory.setInvokersChangedListener(null);\n-    }\n-\n-    private void setListener(ClusterInvoker<T> invoker, InvokersChangedListener listener) {\n-        if (invoker == null) {\n-            return;\n-        }\n-        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\n-        directory.setInvokersChangedListener(listener);\n-    }\n-\n-    public synchronized void refreshInterfaceInvoker() {\n-        clearListener(invoker);\n-        if (needRefresh(invoker)) {\n-            // FIXME invoker.destroy();\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Re-subscribing interface addresses for interface \" + type.getName());\n-            }\n-            invoker = registryProtocol.getInvoker(cluster, registry, type, url);\n-\n-            if (migrationMultiRegistry) {\n-                setListener(serviceDiscoveryInvoker, () -> {\n-                    this.setAddressChanged();\n-                });\n-            }\n-        }\n-    }\n-\n-    public synchronized void destroyInterfaceInvoker(ClusterInvoker<T> invoker) {\n-        if (checkInvokerAvailable(this.serviceDiscoveryInvoker)) {\n-            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\n-        }\n-        if (invoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Destroying interface address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\n-            }\n-            invoker.destroy();\n-        }\n-    }\n-\n-    public synchronized void discardInterfaceInvokerAddress(ClusterInvoker<T> invoker) {\n-        if (this.serviceDiscoveryInvoker != null) {\n-            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\n-        }\n-        if (invoker != null) {\n-            if (logger.isDebugEnabled()) {\n-                logger.debug(\"Discarding interface addresses, total address size \" + (null == invoker.getDirectory().getAllInvokers() ? \"null\" : invoker.getDirectory().getAllInvokers().size()));\n-            }\n-            invoker.getDirectory().discordAddresses();\n-        }\n-    }\n-\n-    private boolean needRefresh(ClusterInvoker<T> invoker) {\n-        return invoker == null || invoker.isDestroyed();\n-    }\n-\n-    public boolean checkInvokerAvailable(ClusterInvoker<T> invoker) {\n-        return invoker != null && !invoker.isDestroyed() && invoker.isAvailable();\n-    }\n-\n-    @Override\n-    public boolean isServiceInvoker() {\n-        return false;\n-    }\n-\n-    @Override\n-    public MigrationRule getMigrationRule() {\n-        return rule;\n-    }\n-\n-    @Override\n-    public void setMigrationRule(MigrationRule rule) {\n-        this.rule = rule;\n-    }\n-\n-    @Override\n-    public boolean isMigrationMultiRegistry() {\n-        return migrationMultiRegistry;\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.constants.RegistryConstants;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.integration.DynamicDirectory;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.Directory;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+\r\n+import java.util.Set;\r\n+import java.util.concurrent.atomic.AtomicBoolean;\r\n+\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+\r\n+public class MigrationInvoker<T> implements MigrationClusterInvoker<T> {\r\n+    private Logger logger = LoggerFactory.getLogger(MigrationInvoker.class);\r\n+\r\n+    private URL url;\r\n+    private URL consumerUrl;\r\n+    private Cluster cluster;\r\n+    private Registry registry;\r\n+    private Class<T> type;\r\n+    private RegistryProtocol registryProtocol;\r\n+\r\n+    private volatile ClusterInvoker<T> invoker;\r\n+    private volatile ClusterInvoker<T> serviceDiscoveryInvoker;\r\n+    private volatile ClusterInvoker<T> currentAvailableInvoker;\r\n+\r\n+    private MigrationRule rule;\r\n+\r\n+    private boolean migrationMultiRegistry;\r\n+\r\n+    public MigrationInvoker(RegistryProtocol registryProtocol,\r\n+                            Cluster cluster,\r\n+                            Registry registry,\r\n+                            Class<T> type,\r\n+                            URL url,\r\n+                            URL consumerUrl) {\r\n+        this(null, null, registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    public MigrationInvoker(ClusterInvoker<T> invoker,\r\n+                            ClusterInvoker<T> serviceDiscoveryInvoker,\r\n+                            RegistryProtocol registryProtocol,\r\n+                            Cluster cluster,\r\n+                            Registry registry,\r\n+                            Class<T> type,\r\n+                            URL url,\r\n+                            URL consumerUrl) {\r\n+        this.invoker = invoker;\r\n+        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\r\n+        this.registryProtocol = registryProtocol;\r\n+        this.cluster = cluster;\r\n+        this.registry = registry;\r\n+        this.type = type;\r\n+        this.url = url;\r\n+        this.consumerUrl = consumerUrl;\r\n+        this.migrationMultiRegistry = url.getParameter(RegistryConstants.MIGRATION_MULTI_REGISTRY, false);\r\n+    }\r\n+\r\n+    public ClusterInvoker<T> getInvoker() {\r\n+        return invoker;\r\n+    }\r\n+\r\n+    public void setInvoker(ClusterInvoker<T> invoker) {\r\n+        this.invoker = invoker;\r\n+    }\r\n+\r\n+    public ClusterInvoker<T> getServiceDiscoveryInvoker() {\r\n+        return serviceDiscoveryInvoker;\r\n+    }\r\n+\r\n+    public void setServiceDiscoveryInvoker(ClusterInvoker<T> serviceDiscoveryInvoker) {\r\n+        this.serviceDiscoveryInvoker = serviceDiscoveryInvoker;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return type;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\r\n+        if (!forceMigrate) {\r\n+            refreshServiceDiscoveryInvoker();\r\n+            refreshInterfaceInvoker();\r\n+            setListener(invoker, () -> {\r\n+                this.compareAddresses(serviceDiscoveryInvoker, invoker);\r\n+            });\r\n+            setListener(serviceDiscoveryInvoker, () -> {\r\n+                this.compareAddresses(serviceDiscoveryInvoker, invoker);\r\n+            });\r\n+        } else {\r\n+            refreshServiceDiscoveryInvoker();\r\n+            setListener(serviceDiscoveryInvoker, () -> {\r\n+                this.destroyInterfaceInvoker(this.invoker);\r\n+            });\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void reRefer(URL newSubscribeUrl) {\r\n+        // update url to prepare for migration refresh\r\n+        this.url = url.addParameter(REFER_KEY, StringUtils.toQueryString(newSubscribeUrl.getParameters()));\r\n+\r\n+        // re-subscribe immediately\r\n+        if (invoker != null && !invoker.isDestroyed()) {\r\n+            doReSubscribe(invoker, newSubscribeUrl);\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null && !serviceDiscoveryInvoker.isDestroyed()) {\r\n+            doReSubscribe(serviceDiscoveryInvoker, newSubscribeUrl);\r\n+        }\r\n+    }\r\n+\r\n+    private void doReSubscribe(ClusterInvoker<T> invoker, URL newSubscribeUrl) {\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        URL oldSubscribeUrl = directory.getRegisteredConsumerUrl();\r\n+        Registry registry = directory.getRegistry();\r\n+        registry.unregister(directory.getRegisteredConsumerUrl());\r\n+        directory.unSubscribe(RegistryProtocol.toSubscribeUrl(oldSubscribeUrl));\r\n+        registry.register(directory.getRegisteredConsumerUrl());\r\n+\r\n+        directory.setRegisteredConsumerUrl(newSubscribeUrl);\r\n+        directory.buildRouterChain(newSubscribeUrl);\r\n+        directory.subscribe(RegistryProtocol.toSubscribeUrl(newSubscribeUrl));\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void fallbackToInterfaceInvoker() {\r\n+        refreshInterfaceInvoker();\r\n+        setListener(invoker, () -> {\r\n+            this.destroyServiceDiscoveryInvoker(this.serviceDiscoveryInvoker);\r\n+        });\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        if (!checkInvokerAvailable(serviceDiscoveryInvoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Using interface addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (invoker.getDirectory().getAllInvokers() == null ? \"is null\" : invoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            return invoker.invoke(invocation);\r\n+        }\r\n+\r\n+        if (!checkInvokerAvailable(invoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Using instance addresses to handle invocation, interface \" + type.getName() + \", total address size \" + (serviceDiscoveryInvoker.getDirectory().getAllInvokers() == null ? \" is null \" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            return serviceDiscoveryInvoker.invoke(invocation);\r\n+        }\r\n+\r\n+        return currentAvailableInvoker.invoke(invocation);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return (invoker != null && invoker.isAvailable())\r\n+                || (serviceDiscoveryInvoker != null && serviceDiscoveryInvoker.isAvailable());\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        if (invoker != null) {\r\n+            invoker.destroy();\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            serviceDiscoveryInvoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        if (invoker != null) {\r\n+            return invoker.getUrl();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            return serviceDiscoveryInvoker.getUrl();\r\n+        }\r\n+\r\n+        return consumerUrl;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getRegistryUrl() {\r\n+        if (invoker != null) {\r\n+            return invoker.getRegistryUrl();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            serviceDiscoveryInvoker.getRegistryUrl();\r\n+        }\r\n+        return url;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Directory<T> getDirectory() {\r\n+        if (invoker != null) {\r\n+            return invoker.getDirectory();\r\n+        } else if (serviceDiscoveryInvoker != null) {\r\n+            return serviceDiscoveryInvoker.getDirectory();\r\n+        }\r\n+        return null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isDestroyed() {\r\n+        return (invoker == null || invoker.isDestroyed())\r\n+                && (serviceDiscoveryInvoker == null || serviceDiscoveryInvoker.isDestroyed());\r\n+    }\r\n+\r\n+\r\n+    @Override\r\n+    public AtomicBoolean invokersChanged() {\r\n+        return invokersChanged;\r\n+    }\r\n+\r\n+    private volatile AtomicBoolean invokersChanged = new AtomicBoolean(true);\r\n+\r\n+    private synchronized void compareAddresses(ClusterInvoker<T> serviceDiscoveryInvoker, ClusterInvoker<T> invoker) {\r\n+        this.invokersChanged.set(true);\r\n+        if (logger.isDebugEnabled()) {\r\n+            logger.info(invoker.getDirectory().getAllInvokers() == null ? \"null\" : invoker.getDirectory().getAllInvokers().size() + \"\");\r\n+        }\r\n+\r\n+        Set<MigrationAddressComparator> detectors = ExtensionLoader.getExtensionLoader(MigrationAddressComparator.class).getSupportedExtensionInstances();\r\n+        if (detectors != null && detectors.stream().allMatch(migrationDetector -> migrationDetector.shouldMigrate(serviceDiscoveryInvoker, invoker))) {\r\n+            discardInterfaceInvokerAddress(invoker);\r\n+        } else {\r\n+            discardServiceDiscoveryInvokerAddress(serviceDiscoveryInvoker);\r\n+        }\r\n+    }\r\n+\r\n+    private synchronized void setAddressChanged() {\r\n+        this.invokersChanged.set(true);\r\n+    }\r\n+\r\n+    public synchronized void destroyServiceDiscoveryInvoker(ClusterInvoker<?> serviceDiscoveryInvoker) {\r\n+        if (checkInvokerAvailable(this.invoker)) {\r\n+            this.currentAvailableInvoker = this.invoker;\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Destroying instance address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\r\n+            }\r\n+            serviceDiscoveryInvoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void discardServiceDiscoveryInvokerAddress(ClusterInvoker<?> serviceDiscoveryInvoker) {\r\n+        if (checkInvokerAvailable(this.invoker)) {\r\n+            this.currentAvailableInvoker = this.invoker;\r\n+        }\r\n+        if (serviceDiscoveryInvoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Discarding instance addresses, total size \" + (null == serviceDiscoveryInvoker.getDirectory().getAllInvokers() ? \"null\" : serviceDiscoveryInvoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            serviceDiscoveryInvoker.getDirectory().discordAddresses();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void refreshServiceDiscoveryInvoker() {\r\n+        clearListener(serviceDiscoveryInvoker);\r\n+        if (needRefresh(serviceDiscoveryInvoker)) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Re-subscribing instance addresses, current interface \" + type.getName());\r\n+            }\r\n+            serviceDiscoveryInvoker = registryProtocol.getServiceDiscoveryInvoker(cluster, registry, type, url);\r\n+\r\n+            if (migrationMultiRegistry) {\r\n+                setListener(serviceDiscoveryInvoker, () -> {\r\n+                    this.setAddressChanged();\r\n+                });\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void clearListener(ClusterInvoker<T> invoker) {\r\n+        if (migrationMultiRegistry) {\r\n+            return;\r\n+        }\r\n+\r\n+        if (invoker == null) {\r\n+            return;\r\n+        }\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        directory.setInvokersChangedListener(null);\r\n+    }\r\n+\r\n+    private void setListener(ClusterInvoker<T> invoker, InvokersChangedListener listener) {\r\n+        if (invoker == null) {\r\n+            return;\r\n+        }\r\n+        DynamicDirectory<T> directory = (DynamicDirectory<T>) invoker.getDirectory();\r\n+        directory.setInvokersChangedListener(listener);\r\n+    }\r\n+\r\n+    public synchronized void refreshInterfaceInvoker() {\r\n+        clearListener(invoker);\r\n+        if (needRefresh(invoker)) {\r\n+            // FIXME invoker.destroy();\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Re-subscribing interface addresses for interface \" + type.getName());\r\n+            }\r\n+            invoker = registryProtocol.getInvoker(cluster, registry, type, url);\r\n+\r\n+            if (migrationMultiRegistry) {\r\n+                setListener(serviceDiscoveryInvoker, () -> {\r\n+                    this.setAddressChanged();\r\n+                });\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void destroyInterfaceInvoker(ClusterInvoker<T> invoker) {\r\n+        if (checkInvokerAvailable(this.serviceDiscoveryInvoker)) {\r\n+            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\r\n+        }\r\n+        if (invoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Destroying interface address invokers, will not listen for address changes until re-subscribed, \" + type.getName());\r\n+            }\r\n+            invoker.destroy();\r\n+        }\r\n+    }\r\n+\r\n+    public synchronized void discardInterfaceInvokerAddress(ClusterInvoker<T> invoker) {\r\n+        if (this.serviceDiscoveryInvoker != null) {\r\n+            this.currentAvailableInvoker = this.serviceDiscoveryInvoker;\r\n+        }\r\n+        if (invoker != null) {\r\n+            if (logger.isDebugEnabled()) {\r\n+                logger.debug(\"Discarding interface addresses, total address size \" + (null == invoker.getDirectory().getAllInvokers() ? \"null\" : invoker.getDirectory().getAllInvokers().size()));\r\n+            }\r\n+            invoker.getDirectory().discordAddresses();\r\n+        }\r\n+    }\r\n+\r\n+    private boolean needRefresh(ClusterInvoker<T> invoker) {\r\n+        return invoker == null || invoker.isDestroyed();\r\n+    }\r\n+\r\n+    public boolean checkInvokerAvailable(ClusterInvoker<T> invoker) {\r\n+        return invoker != null && !invoker.isDestroyed() && invoker.isAvailable();\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isServiceInvoker() {\r\n+        return false;\r\n+    }\r\n+\r\n+    @Override\r\n+    public MigrationRule getMigrationRule() {\r\n+        return rule;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void setMigrationRule(MigrationRule rule) {\r\n+        this.rule = rule;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isMigrationMultiRegistry() {\r\n+        return migrationMultiRegistry;\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationRuleHandler.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,71 +1,71 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationStep;\n-\n-@Activate\n-public class MigrationRuleHandler<T> {\n-    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleHandler.class);\n-\n-    private MigrationInvoker<T> migrationInvoker;\n-\n-    public MigrationRuleHandler(MigrationInvoker<T> invoker) {\n-        this.migrationInvoker = invoker;\n-    }\n-\n-    private MigrationStep currentStep;\n-\n-    public void doMigrate(String rawRule) {\n-        MigrationRule rule = MigrationRule.parse(rawRule);\n-\n-        if (null != currentStep && currentStep.equals(rule.getStep())) {\n-            if (logger.isInfoEnabled()) {\n-                logger.info(\"Migration step is not change. rule.getStep is \" + currentStep.name());\n-            }\n-            return;\n-        } else {\n-            currentStep = rule.getStep();\n-        }\n-\n-        migrationInvoker.setMigrationRule(rule);\n-\n-        if (migrationInvoker.isMigrationMultiRegistry()) {\n-            if (migrationInvoker.isServiceInvoker()) {\n-                migrationInvoker.refreshServiceDiscoveryInvoker();\n-            } else {\n-                migrationInvoker.refreshInterfaceInvoker();\n-            }\n-        } else {\n-            switch (rule.getStep()) {\n-                case APPLICATION_FIRST:\n-                    migrationInvoker.migrateToServiceDiscoveryInvoker(false);\n-                    break;\n-                case FORCE_APPLICATION:\n-                    migrationInvoker.migrateToServiceDiscoveryInvoker(true);\n-                    break;\n-                case FORCE_INTERFACE:\n-                default:\n-                    migrationInvoker.fallbackToInterfaceInvoker();\n-            }\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.extension.Activate;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationStep;\r\n+\r\n+@Activate\r\n+public class MigrationRuleHandler<T> {\r\n+    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleHandler.class);\r\n+\r\n+    private MigrationInvoker<T> migrationInvoker;\r\n+\r\n+    public MigrationRuleHandler(MigrationInvoker<T> invoker) {\r\n+        this.migrationInvoker = invoker;\r\n+    }\r\n+\r\n+    private MigrationStep currentStep;\r\n+\r\n+    public void doMigrate(String rawRule) {\r\n+        MigrationRule rule = MigrationRule.parse(rawRule);\r\n+\r\n+        if (null != currentStep && currentStep.equals(rule.getStep())) {\r\n+            if (logger.isInfoEnabled()) {\r\n+                logger.info(\"Migration step is not change. rule.getStep is \" + currentStep.name());\r\n+            }\r\n+            return;\r\n+        } else {\r\n+            currentStep = rule.getStep();\r\n+        }\r\n+\r\n+        migrationInvoker.setMigrationRule(rule);\r\n+\r\n+        if (migrationInvoker.isMigrationMultiRegistry()) {\r\n+            if (migrationInvoker.isServiceInvoker()) {\r\n+                migrationInvoker.refreshServiceDiscoveryInvoker();\r\n+            } else {\r\n+                migrationInvoker.refreshInterfaceInvoker();\r\n+            }\r\n+        } else {\r\n+            switch (rule.getStep()) {\r\n+                case APPLICATION_FIRST:\r\n+                    migrationInvoker.migrateToServiceDiscoveryInvoker(false);\r\n+                    break;\r\n+                case FORCE_APPLICATION:\r\n+                    migrationInvoker.migrateToServiceDiscoveryInvoker(true);\r\n+                    break;\r\n+                case FORCE_INTERFACE:\r\n+                default:\r\n+                    migrationInvoker.fallbackToInterfaceInvoker();\r\n+            }\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/MigrationRuleListener.java", "source2": "org/apache/dubbo/registry/client/migration/MigrationRuleListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,112 +1,112 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.Activate;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.ConcurrentHashSet;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.registry.integration.RegistryProtocolListener;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-\n-import java.util.Optional;\n-import java.util.Set;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.INIT;\n-\n-@Activate\n-public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {\n-    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);\n-\n-    private Set<MigrationRuleHandler> listeners = new ConcurrentHashSet<>();\n-    private DynamicConfiguration configuration;\n-\n-    private volatile String rawRule;\n-\n-    public MigrationRuleListener() {\n-        Optional<DynamicConfiguration> optional =  ApplicationModel.getEnvironment().getDynamicConfiguration();\n-\n-        if (optional.isPresent()) {\n-            this.configuration = optional.get();\n-\n-            logger.info(\"Listening for migration rules on dataId-\" + MigrationRule.RULE_KEY + \" group-\" + MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\n-            configuration.addListener(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, this);\n-\n-            rawRule = configuration.getConfig(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\n-            if (StringUtils.isEmpty(rawRule)) {\n-                rawRule = INIT;\n-            }\n-\n-        } else {\n-            if (logger.isWarnEnabled()) {\n-                logger.warn(\"config center is not configured!\");\n-            }\n-\n-            rawRule = INIT;\n-        }\n-\n-        process(new ConfigChangedEvent(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, rawRule));\n-    }\n-\n-    @Override\n-    public synchronized void process(ConfigChangedEvent event) {\n-        rawRule = event.getContent();\n-        if (StringUtils.isEmpty(rawRule)) {\n-            logger.warn(\"Received empty migration rule, will ignore.\");\n-            return;\n-        }\n-\n-        logger.info(\"Using the following migration rule to migrate:\");\n-        logger.info(rawRule);\n-\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            listeners.forEach(listener -> listener.doMigrate(rawRule));\n-        }\n-    }\n-\n-    @Override\n-    public synchronized void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter) {\n-\n-    }\n-\n-    @Override\n-    public synchronized  void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url) {\n-        MigrationInvoker<?> migrationInvoker = (MigrationInvoker<?>) invoker;\n-\n-        MigrationRuleHandler<?> migrationListener = new MigrationRuleHandler<>(migrationInvoker);\n-        listeners.add(migrationListener);\n-\n-        migrationListener.doMigrate(rawRule);\n-    }\n-\n-    @Override\n-    public void onDestroy() {\n-        if (null != configuration) {\n-            configuration.removeListener(MigrationRule.RULE_KEY, this);\n-        }\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.Activate;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.ConcurrentHashSet;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocolListener;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationRule;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+\r\n+import java.util.Optional;\r\n+import java.util.Set;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.INIT;\r\n+\r\n+@Activate\r\n+public class MigrationRuleListener implements RegistryProtocolListener, ConfigurationListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(MigrationRuleListener.class);\r\n+\r\n+    private Set<MigrationRuleHandler> listeners = new ConcurrentHashSet<>();\r\n+    private DynamicConfiguration configuration;\r\n+\r\n+    private volatile String rawRule;\r\n+\r\n+    public MigrationRuleListener() {\r\n+        Optional<DynamicConfiguration> optional =  ApplicationModel.getEnvironment().getDynamicConfiguration();\r\n+\r\n+        if (optional.isPresent()) {\r\n+            this.configuration = optional.get();\r\n+\r\n+            logger.info(\"Listening for migration rules on dataId-\" + MigrationRule.RULE_KEY + \" group-\" + MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\r\n+            configuration.addListener(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, this);\r\n+\r\n+            rawRule = configuration.getConfig(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP);\r\n+            if (StringUtils.isEmpty(rawRule)) {\r\n+                rawRule = INIT;\r\n+            }\r\n+\r\n+        } else {\r\n+            if (logger.isWarnEnabled()) {\r\n+                logger.warn(\"config center is not configured!\");\r\n+            }\r\n+\r\n+            rawRule = INIT;\r\n+        }\r\n+\r\n+        process(new ConfigChangedEvent(MigrationRule.RULE_KEY, MigrationRule.DUBBO_SERVICEDISCOVERY_MIGRATION_GROUP, rawRule));\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void process(ConfigChangedEvent event) {\r\n+        rawRule = event.getContent();\r\n+        if (StringUtils.isEmpty(rawRule)) {\r\n+            logger.warn(\"Received empty migration rule, will ignore.\");\r\n+            return;\r\n+        }\r\n+\r\n+        logger.info(\"Using the following migration rule to migrate:\");\r\n+        logger.info(rawRule);\r\n+\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            listeners.forEach(listener -> listener.doMigrate(rawRule));\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter) {\r\n+\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized  void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url) {\r\n+        MigrationInvoker<?> migrationInvoker = (MigrationInvoker<?>) invoker;\r\n+\r\n+        MigrationRuleHandler<?> migrationListener = new MigrationRuleHandler<>(migrationInvoker);\r\n+        listeners.add(migrationListener);\r\n+\r\n+        migrationListener.doMigrate(rawRule);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void onDestroy() {\r\n+        if (null != configuration) {\r\n+            configuration.removeListener(MigrationRule.RULE_KEY, this);\r\n+        }\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java", "source2": "org/apache/dubbo/registry/client/migration/ServiceDiscoveryMigrationInvoker.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,61 +1,61 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.migration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.integration.RegistryProtocol;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Result;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-public class ServiceDiscoveryMigrationInvoker<T> extends MigrationInvoker<T> {\n-    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryMigrationInvoker.class);\n-\n-    public ServiceDiscoveryMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-        super(registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    @Override\n-    public boolean isServiceInvoker() {\n-        return true;\n-    }\n-\n-    @Override\n-    public synchronized void fallbackToInterfaceInvoker() {\n-        logger.error(\"Service discovery registry type does not support discovery of interface level addresses, \" + getRegistryUrl());\n-        migrateToServiceDiscoveryInvoker(true);\n-    }\n-\n-    @Override\n-    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\n-        refreshServiceDiscoveryInvoker();\n-    }\n-\n-    @Override\n-    public Result invoke(Invocation invocation) throws RpcException {\n-        ClusterInvoker<T> invoker = getServiceDiscoveryInvoker();\n-        if (invoker == null) {\n-            throw new IllegalStateException(\"There's no service discovery invoker available for service \" + invocation.getServiceName());\n-        }\n-        return invoker.invoke(invocation);\n-    }\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.migration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.integration.RegistryProtocol;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Result;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+public class ServiceDiscoveryMigrationInvoker<T> extends MigrationInvoker<T> {\r\n+    private static final Logger logger = LoggerFactory.getLogger(ServiceDiscoveryMigrationInvoker.class);\r\n+\r\n+    public ServiceDiscoveryMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+        super(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isServiceInvoker() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void fallbackToInterfaceInvoker() {\r\n+        logger.error(\"Service discovery registry type does not support discovery of interface level addresses, \" + getRegistryUrl());\r\n+        migrateToServiceDiscoveryInvoker(true);\r\n+    }\r\n+\r\n+    @Override\r\n+    public synchronized void migrateToServiceDiscoveryInvoker(boolean forceMigrate) {\r\n+        refreshServiceDiscoveryInvoker();\r\n+    }\r\n+\r\n+    @Override\r\n+    public Result invoke(Invocation invocation) throws RpcException {\r\n+        ClusterInvoker<T> invoker = getServiceDiscoveryInvoker();\r\n+        if (invoker == null) {\r\n+            throw new IllegalStateException(\"There's no service discovery invoker available for service \" + invocation.getServiceName());\r\n+        }\r\n+        return invoker.invoke(invocation);\r\n+    }\r\n }\n"}, {"source1": "org/apache/dubbo/registry/client/package-info.java", "source2": "org/apache/dubbo/registry/client/package-info.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,23 +1,23 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-/**\n- * * The inspiration of service registration and discovery comes from\n- * <a href=\"https://spring.io/projects/spring-cloud-commons\">Spring Cloud Commons</a>.\n- *\n- * @since 2.7.5\n- */\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+/**\r\n+ * * The inspiration of service registration and discovery comes from\r\n+ * <a href=\"https://spring.io/projects/spring-cloud-commons\">Spring Cloud Commons</a>.\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n package org.apache.dubbo.registry.client;\n"}, {"source1": "org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java", "source2": "org/apache/dubbo/registry/client/selector/RandomServiceInstanceSelector.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,47 +1,47 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.selector;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-import java.util.concurrent.ThreadLocalRandom;\n-\n-/**\n- * The {@link ServiceInstanceSelector} implementation based on Random algorithm\n- *\n- * @see ThreadLocalRandom\n- * @see ServiceInstanceSelector\n- * @since 2.7.5\n- */\n-public class RandomServiceInstanceSelector implements ServiceInstanceSelector {\n-\n-    @Override\n-    public ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances) {\n-        int size = serviceInstances.size();\n-        if (size < 1) {\n-            return null;\n-        }\n-        int index = size == 1 ? 0 : selectIndexRandomly(size);\n-        return serviceInstances.get(index);\n-    }\n-\n-    protected int selectIndexRandomly(int size) {\n-        return ThreadLocalRandom.current().nextInt(size);\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.selector;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+import java.util.concurrent.ThreadLocalRandom;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstanceSelector} implementation based on Random algorithm\r\n+ *\r\n+ * @see ThreadLocalRandom\r\n+ * @see ServiceInstanceSelector\r\n+ * @since 2.7.5\r\n+ */\r\n+public class RandomServiceInstanceSelector implements ServiceInstanceSelector {\r\n+\r\n+    @Override\r\n+    public ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances) {\r\n+        int size = serviceInstances.size();\r\n+        if (size < 1) {\r\n+            return null;\r\n+        }\r\n+        int index = size == 1 ? 0 : selectIndexRandomly(size);\r\n+        return serviceInstances.get(index);\r\n+    }\r\n+\r\n+    protected int selectIndexRandomly(int size) {\r\n+        return ThreadLocalRandom.current().nextInt(size);\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java", "source2": "org/apache/dubbo/registry/client/selector/ServiceInstanceSelector.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,43 +1,43 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.client.selector;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.Adaptive;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-\n-import java.util.List;\n-\n-/**\n- * The {@link ServiceInstance} Selector\n- *\n- * @since 2.7.5\n- */\n-@SPI(\"random\")\n-public interface ServiceInstanceSelector {\n-\n-    /**\n-     * Select an instance of {@link ServiceInstance} by the specified {@link ServiceInstance service instances}\n-     *\n-     * @param registryURL      The {@link URL url} of registry\n-     * @param serviceInstances the specified {@link ServiceInstance service instances}\n-     * @return an instance of {@link ServiceInstance} if available, or <code>null</code>\n-     */\n-    @Adaptive(\"service-instance-selector\")\n-    ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.client.selector;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.Adaptive;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.registry.client.ServiceInstance;\r\n+\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * The {@link ServiceInstance} Selector\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+@SPI(\"random\")\r\n+public interface ServiceInstanceSelector {\r\n+\r\n+    /**\r\n+     * Select an instance of {@link ServiceInstance} by the specified {@link ServiceInstance service instances}\r\n+     *\r\n+     * @param registryURL      The {@link URL url} of registry\r\n+     * @param serviceInstances the specified {@link ServiceInstance service instances}\r\n+     * @return an instance of {@link ServiceInstance} if available, or <code>null</code>\r\n+     */\r\n+    @Adaptive(\"service-instance-selector\")\r\n+    ServiceInstance select(URL registryURL, List<ServiceInstance> serviceInstances);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java", "source2": "org/apache/dubbo/registry/integration/AbstractConfiguratorListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,97 +1,97 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\n-import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\n-import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;\n-import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\n-\n-import java.util.Collections;\n-import java.util.List;\n-\n-/**\n- * AbstractConfiguratorListener\n- */\n-public abstract class AbstractConfiguratorListener implements ConfigurationListener {\n-    private static final Logger logger = LoggerFactory.getLogger(AbstractConfiguratorListener.class);\n-\n-    protected List<Configurator> configurators = Collections.emptyList();\n-    protected GovernanceRuleRepository ruleRepository = ExtensionLoader.getExtensionLoader(\n-            GovernanceRuleRepository.class).getDefaultExtension();\n-\n-    protected final void initWith(String key) {\n-        ruleRepository.addListener(key, this);\n-        String rawConfig = ruleRepository.getRule(key, DynamicConfiguration.DEFAULT_GROUP);\n-        if (!StringUtils.isEmpty(rawConfig)) {\n-            genConfiguratorsFromRawRule(rawConfig);\n-        }\n-    }\n-\n-    protected final void stopListen(String key) {\n-        ruleRepository.removeListener(key, this);\n-    }\n-\n-    @Override\n-    public void process(ConfigChangedEvent event) {\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Notification of overriding rule, change type is: \" + event.getChangeType() +\n-                    \", raw config content is:\\n \" + event.getContent());\n-        }\n-\n-        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {\n-            configurators.clear();\n-        } else {\n-            if (!genConfiguratorsFromRawRule(event.getContent())) {\n-                return;\n-            }\n-        }\n-\n-        notifyOverrides();\n-    }\n-\n-    private boolean genConfiguratorsFromRawRule(String rawConfig) {\n-        boolean parseSuccess = true;\n-        try {\n-            // parseConfigurators will recognize app/service config automatically.\n-            configurators = Configurator.toConfigurators(ConfigParser.parseConfigurators(rawConfig))\n-                    .orElse(configurators);\n-        } catch (Exception e) {\n-            logger.error(\"Failed to parse raw dynamic config and it will not take effect, the raw config is: \" +\n-                    rawConfig, e);\n-            parseSuccess = false;\n-        }\n-        return parseSuccess;\n-    }\n-\n-    protected abstract void notifyOverrides();\n-\n-    public List<Configurator> getConfigurators() {\n-        return configurators;\n-    }\n-\n-    public void setConfigurators(List<Configurator> configurators) {\n-        this.configurators = configurators;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangeType;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigChangedEvent;\r\n+import org.apache.dubbo.common.config.configcenter.ConfigurationListener;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.configurator.parser.ConfigParser;\r\n+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+\r\n+/**\r\n+ * AbstractConfiguratorListener\r\n+ */\r\n+public abstract class AbstractConfiguratorListener implements ConfigurationListener {\r\n+    private static final Logger logger = LoggerFactory.getLogger(AbstractConfiguratorListener.class);\r\n+\r\n+    protected List<Configurator> configurators = Collections.emptyList();\r\n+    protected GovernanceRuleRepository ruleRepository = ExtensionLoader.getExtensionLoader(\r\n+            GovernanceRuleRepository.class).getDefaultExtension();\r\n+\r\n+    protected final void initWith(String key) {\r\n+        ruleRepository.addListener(key, this);\r\n+        String rawConfig = ruleRepository.getRule(key, DynamicConfiguration.DEFAULT_GROUP);\r\n+        if (!StringUtils.isEmpty(rawConfig)) {\r\n+            genConfiguratorsFromRawRule(rawConfig);\r\n+        }\r\n+    }\r\n+\r\n+    protected final void stopListen(String key) {\r\n+        ruleRepository.removeListener(key, this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void process(ConfigChangedEvent event) {\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Notification of overriding rule, change type is: \" + event.getChangeType() +\r\n+                    \", raw config content is:\\n \" + event.getContent());\r\n+        }\r\n+\r\n+        if (event.getChangeType().equals(ConfigChangeType.DELETED)) {\r\n+            configurators.clear();\r\n+        } else {\r\n+            if (!genConfiguratorsFromRawRule(event.getContent())) {\r\n+                return;\r\n+            }\r\n+        }\r\n+\r\n+        notifyOverrides();\r\n+    }\r\n+\r\n+    private boolean genConfiguratorsFromRawRule(String rawConfig) {\r\n+        boolean parseSuccess = true;\r\n+        try {\r\n+            // parseConfigurators will recognize app/service config automatically.\r\n+            configurators = Configurator.toConfigurators(ConfigParser.parseConfigurators(rawConfig))\r\n+                    .orElse(configurators);\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Failed to parse raw dynamic config and it will not take effect, the raw config is: \" +\r\n+                    rawConfig, e);\r\n+            parseSuccess = false;\r\n+        }\r\n+        return parseSuccess;\r\n+    }\r\n+\r\n+    protected abstract void notifyOverrides();\r\n+\r\n+    public List<Configurator> getConfigurators() {\r\n+        return configurators;\r\n+    }\r\n+\r\n+    public void setConfigurators(List<Configurator> configurators) {\r\n+        this.configurators = configurators;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/DynamicDirectory.java", "source2": "org/apache/dubbo/registry/integration/DynamicDirectory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,285 +1,285 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.common.Version;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.NetUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.registry.client.migration.InvokersChangedListener;\n-import org.apache.dubbo.rpc.Invocation;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.RouterChain;\n-import org.apache.dubbo.rpc.cluster.RouterFactory;\n-import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;\n-\n-import java.util.Collections;\n-import java.util.List;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\n-import static org.apache.dubbo.registry.integration.RegistryProtocol.DEFAULT_REGISTER_CONSUMER_KEYS;\n-import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\n-\n-\n-/**\n- * RegistryDirectory\n- */\n-public abstract class DynamicDirectory<T> extends AbstractDirectory<T> implements NotifyListener {\n-\n-    private static final Logger logger = LoggerFactory.getLogger(DynamicDirectory.class);\n-\n-    protected static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\n-\n-    protected static final RouterFactory ROUTER_FACTORY = ExtensionLoader.getExtensionLoader(RouterFactory.class)\n-            .getAdaptiveExtension();\n-\n-    protected final String serviceKey; // Initialization at construction time, assertion not null\n-    protected final Class<T> serviceType; // Initialization at construction time, assertion not null\n-    protected final URL directoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\n-    protected final boolean multiGroup;\n-    protected Protocol protocol; // Initialization at the time of injection, the assertion is not null\n-    protected Registry registry; // Initialization at the time of injection, the assertion is not null\n-    protected volatile boolean forbidden = false;\n-    protected boolean shouldRegister;\n-    protected boolean shouldSimplified;\n-\n-    protected volatile URL overrideDirectoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\n-\n-    protected volatile URL registeredConsumerUrl;\n-\n-    /**\n-     * override rules\n-     * Priority: override>-D>consumer>provider\n-     * Rule one: for a certain provider <ip:port,timeout=100>\n-     * Rule two: for all providers <* ,timeout=5000>\n-     */\n-    protected volatile List<Configurator> configurators; // The initial value is null and the midway may be assigned to null, please use the local variable reference\n-\n-    protected volatile List<Invoker<T>> invokers;\n-    // Set<invokerUrls> cache invokeUrls to invokers mapping.\n-\n-    protected ServiceInstancesChangedListener serviceListener;\n-\n-    public DynamicDirectory(Class<T> serviceType, URL url) {\n-        super(url, true);\n-        if (serviceType == null) {\n-            throw new IllegalArgumentException(\"service type is null.\");\n-        }\n-\n-        shouldRegister = !ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true);\n-        shouldSimplified = url.getParameter(SIMPLIFIED_KEY, false);\n-        if (url.getServiceKey() == null || url.getServiceKey().length() == 0) {\n-            throw new IllegalArgumentException(\"registry serviceKey is null.\");\n-        }\n-        this.serviceType = serviceType;\n-        this.serviceKey = super.getConsumerUrl().getServiceKey();\n-\n-        this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);\n-        String group = directoryUrl.getParameter(GROUP_KEY, \"\");\n-        this.multiGroup = group != null && (ANY_VALUE.equals(group) || group.contains(\",\"));\n-    }\n-\n-    @Override\n-    public void addServiceListener(ServiceInstancesChangedListener instanceListener) {\n-        this.serviceListener = instanceListener;\n-    }\n-\n-    private URL turnRegistryUrlToConsumerUrl(URL url) {\n-        return URLBuilder.from(url)\n-                .setHost(queryMap.get(REGISTER_IP_KEY) == null ? url.getHost() : queryMap.get(REGISTER_IP_KEY))\n-                .setPort(0)\n-                .setProtocol(queryMap.get(PROTOCOL_KEY) == null ? DUBBO : queryMap.get(PROTOCOL_KEY))\n-                .setPath(queryMap.get(INTERFACE_KEY))\n-                .clearParameters()\n-                .addParameters(queryMap)\n-                .removeParameter(MONITOR_KEY)\n-                .build();\n-    }\n-\n-    public void setProtocol(Protocol protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    public void setRegistry(Registry registry) {\n-        this.registry = registry;\n-    }\n-\n-    public Registry getRegistry() {\n-        return registry;\n-    }\n-\n-    public boolean isShouldRegister() {\n-        return shouldRegister;\n-    }\n-\n-    public void subscribe(URL url) {\n-        setConsumerUrl(url);\n-        registry.subscribe(url, this);\n-    }\n-\n-    public void unSubscribe(URL url) {\n-        setConsumerUrl(null);\n-        registry.unsubscribe(url, this);\n-    }\n-\n-    @Override\n-    public List<Invoker<T>> doList(Invocation invocation) {\n-        if (forbidden) {\n-            // 1. No service provider 2. Service providers are disabled\n-            throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, \"No provider available from registry \" +\n-                    getUrl().getAddress() + \" for service \" + getConsumerUrl().getServiceKey() + \" on consumer \" +\n-                    NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion() +\n-                    \", please check status of providers(disabled, not registered or in blacklist).\");\n-        }\n-\n-        if (multiGroup) {\n-            return this.invokers == null ? Collections.emptyList() : this.invokers;\n-        }\n-\n-        List<Invoker<T>> invokers = null;\n-        try {\n-            // Get invokers from cache, only runtime routers will be executed.\n-            invokers = routerChain.route(getConsumerUrl(), invocation);\n-        } catch (Throwable t) {\n-            logger.error(\"Failed to execute router: \" + getUrl() + \", cause: \" + t.getMessage(), t);\n-        }\n-\n-        return invokers == null ? Collections.emptyList() : invokers;\n-    }\n-\n-    @Override\n-    public Class<T> getInterface() {\n-        return serviceType;\n-    }\n-\n-    @Override\n-    public List<Invoker<T>> getAllInvokers() {\n-        return invokers;\n-    }\n-\n-    @Override\n-    public URL getConsumerUrl() {\n-        return this.overrideDirectoryUrl;\n-    }\n-\n-    public URL getRegisteredConsumerUrl() {\n-        return registeredConsumerUrl;\n-    }\n-\n-    public void setRegisteredConsumerUrl(URL url) {\n-        if (!shouldSimplified) {\n-            this.registeredConsumerUrl = url.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY,\n-                    String.valueOf(false));\n-        } else {\n-            this.registeredConsumerUrl = URL.valueOf(url, DEFAULT_REGISTER_CONSUMER_KEYS, null).addParameters(\n-                    CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY, String.valueOf(false));\n-        }\n-    }\n-\n-    public void buildRouterChain(URL url) {\n-        this.setRouterChain(RouterChain.buildChain(url));\n-    }\n-\n-    public List<Invoker<T>> getInvokers() {\n-        return invokers;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        if (isDestroyed()) {\n-            return;\n-        }\n-\n-        // unregister.\n-        try {\n-            if (getRegisteredConsumerUrl() != null && registry != null && registry.isAvailable()) {\n-                registry.unregister(getRegisteredConsumerUrl());\n-            }\n-        } catch (Throwable t) {\n-            logger.warn(\"unexpected error when unregister service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\n-        }\n-        // unsubscribe.\n-        try {\n-            if (getConsumerUrl() != null && registry != null && registry.isAvailable()) {\n-                registry.unsubscribe(getConsumerUrl(), this);\n-            }\n-        } catch (Throwable t) {\n-            logger.warn(\"unexpected error when unsubscribe service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\n-        }\n-        super.destroy(); // must be executed after unsubscribing\n-        try {\n-            destroyAllInvokers();\n-        } catch (Throwable t) {\n-            logger.warn(\"Failed to destroy service \" + serviceKey, t);\n-        }\n-\n-        invokersChangedListener = null;\n-    }\n-\n-    @Override\n-    public void discordAddresses() {\n-        try {\n-            destroyAllInvokers();\n-        } catch (Throwable t) {\n-            logger.warn(\"Failed to destroy service \" + serviceKey, t);\n-        }\n-    }\n-\n-    private volatile InvokersChangedListener invokersChangedListener;\n-    private volatile boolean addressChanged;\n-\n-    public void setInvokersChangedListener(InvokersChangedListener listener) {\n-        this.invokersChangedListener = listener;\n-        if (addressChanged) {\n-            if (invokersChangedListener != null) {\n-                invokersChangedListener.onChange();\n-                this.addressChanged = false;\n-            }\n-        }\n-    }\n-\n-    protected void invokersChanged() {\n-        if (invokersChangedListener != null) {\n-            invokersChangedListener.onChange();\n-            this.addressChanged = false;\n-        } else {\n-            this.addressChanged = true;\n-        }\n-    }\n-\n-    protected abstract void destroyAllInvokers();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.common.Version;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.NetUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.registry.client.migration.InvokersChangedListener;\r\n+import org.apache.dubbo.rpc.Invocation;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.RouterChain;\r\n+import org.apache.dubbo.rpc.cluster.RouterFactory;\r\n+import org.apache.dubbo.rpc.cluster.directory.AbstractDirectory;\r\n+\r\n+import java.util.Collections;\r\n+import java.util.List;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ANY_VALUE;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PROTOCOL_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONSUMERS_CATEGORY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\r\n+import static org.apache.dubbo.registry.integration.RegistryProtocol.DEFAULT_REGISTER_CONSUMER_KEYS;\r\n+import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\r\n+\r\n+\r\n+/**\r\n+ * RegistryDirectory\r\n+ */\r\n+public abstract class DynamicDirectory<T> extends AbstractDirectory<T> implements NotifyListener {\r\n+\r\n+    private static final Logger logger = LoggerFactory.getLogger(DynamicDirectory.class);\r\n+\r\n+    protected static final Cluster CLUSTER = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();\r\n+\r\n+    protected static final RouterFactory ROUTER_FACTORY = ExtensionLoader.getExtensionLoader(RouterFactory.class)\r\n+            .getAdaptiveExtension();\r\n+\r\n+    protected final String serviceKey; // Initialization at construction time, assertion not null\r\n+    protected final Class<T> serviceType; // Initialization at construction time, assertion not null\r\n+    protected final URL directoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\r\n+    protected final boolean multiGroup;\r\n+    protected Protocol protocol; // Initialization at the time of injection, the assertion is not null\r\n+    protected Registry registry; // Initialization at the time of injection, the assertion is not null\r\n+    protected volatile boolean forbidden = false;\r\n+    protected boolean shouldRegister;\r\n+    protected boolean shouldSimplified;\r\n+\r\n+    protected volatile URL overrideDirectoryUrl; // Initialization at construction time, assertion not null, and always assign non null value\r\n+\r\n+    protected volatile URL registeredConsumerUrl;\r\n+\r\n+    /**\r\n+     * override rules\r\n+     * Priority: override>-D>consumer>provider\r\n+     * Rule one: for a certain provider <ip:port,timeout=100>\r\n+     * Rule two: for all providers <* ,timeout=5000>\r\n+     */\r\n+    protected volatile List<Configurator> configurators; // The initial value is null and the midway may be assigned to null, please use the local variable reference\r\n+\r\n+    protected volatile List<Invoker<T>> invokers;\r\n+    // Set<invokerUrls> cache invokeUrls to invokers mapping.\r\n+\r\n+    protected ServiceInstancesChangedListener serviceListener;\r\n+\r\n+    public DynamicDirectory(Class<T> serviceType, URL url) {\r\n+        super(url, true);\r\n+        if (serviceType == null) {\r\n+            throw new IllegalArgumentException(\"service type is null.\");\r\n+        }\r\n+\r\n+        shouldRegister = !ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true);\r\n+        shouldSimplified = url.getParameter(SIMPLIFIED_KEY, false);\r\n+        if (url.getServiceKey() == null || url.getServiceKey().length() == 0) {\r\n+            throw new IllegalArgumentException(\"registry serviceKey is null.\");\r\n+        }\r\n+        this.serviceType = serviceType;\r\n+        this.serviceKey = super.getConsumerUrl().getServiceKey();\r\n+\r\n+        this.overrideDirectoryUrl = this.directoryUrl = turnRegistryUrlToConsumerUrl(url);\r\n+        String group = directoryUrl.getParameter(GROUP_KEY, \"\");\r\n+        this.multiGroup = group != null && (ANY_VALUE.equals(group) || group.contains(\",\"));\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceListener(ServiceInstancesChangedListener instanceListener) {\r\n+        this.serviceListener = instanceListener;\r\n+    }\r\n+\r\n+    private URL turnRegistryUrlToConsumerUrl(URL url) {\r\n+        return URLBuilder.from(url)\r\n+                .setHost(queryMap.get(REGISTER_IP_KEY) == null ? url.getHost() : queryMap.get(REGISTER_IP_KEY))\r\n+                .setPort(0)\r\n+                .setProtocol(queryMap.get(PROTOCOL_KEY) == null ? DUBBO : queryMap.get(PROTOCOL_KEY))\r\n+                .setPath(queryMap.get(INTERFACE_KEY))\r\n+                .clearParameters()\r\n+                .addParameters(queryMap)\r\n+                .removeParameter(MONITOR_KEY)\r\n+                .build();\r\n+    }\r\n+\r\n+    public void setProtocol(Protocol protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    public void setRegistry(Registry registry) {\r\n+        this.registry = registry;\r\n+    }\r\n+\r\n+    public Registry getRegistry() {\r\n+        return registry;\r\n+    }\r\n+\r\n+    public boolean isShouldRegister() {\r\n+        return shouldRegister;\r\n+    }\r\n+\r\n+    public void subscribe(URL url) {\r\n+        setConsumerUrl(url);\r\n+        registry.subscribe(url, this);\r\n+    }\r\n+\r\n+    public void unSubscribe(URL url) {\r\n+        setConsumerUrl(null);\r\n+        registry.unsubscribe(url, this);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<Invoker<T>> doList(Invocation invocation) {\r\n+        if (forbidden) {\r\n+            // 1. No service provider 2. Service providers are disabled\r\n+            throw new RpcException(RpcException.FORBIDDEN_EXCEPTION, \"No provider available from registry \" +\r\n+                    getUrl().getAddress() + \" for service \" + getConsumerUrl().getServiceKey() + \" on consumer \" +\r\n+                    NetUtils.getLocalHost() + \" use dubbo version \" + Version.getVersion() +\r\n+                    \", please check status of providers(disabled, not registered or in blacklist).\");\r\n+        }\r\n+\r\n+        if (multiGroup) {\r\n+            return this.invokers == null ? Collections.emptyList() : this.invokers;\r\n+        }\r\n+\r\n+        List<Invoker<T>> invokers = null;\r\n+        try {\r\n+            // Get invokers from cache, only runtime routers will be executed.\r\n+            invokers = routerChain.route(getConsumerUrl(), invocation);\r\n+        } catch (Throwable t) {\r\n+            logger.error(\"Failed to execute router: \" + getUrl() + \", cause: \" + t.getMessage(), t);\r\n+        }\r\n+\r\n+        return invokers == null ? Collections.emptyList() : invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Class<T> getInterface() {\r\n+        return serviceType;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<Invoker<T>> getAllInvokers() {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getConsumerUrl() {\r\n+        return this.overrideDirectoryUrl;\r\n+    }\r\n+\r\n+    public URL getRegisteredConsumerUrl() {\r\n+        return registeredConsumerUrl;\r\n+    }\r\n+\r\n+    public void setRegisteredConsumerUrl(URL url) {\r\n+        if (!shouldSimplified) {\r\n+            this.registeredConsumerUrl = url.addParameters(CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY,\r\n+                    String.valueOf(false));\r\n+        } else {\r\n+            this.registeredConsumerUrl = URL.valueOf(url, DEFAULT_REGISTER_CONSUMER_KEYS, null).addParameters(\r\n+                    CATEGORY_KEY, CONSUMERS_CATEGORY, CHECK_KEY, String.valueOf(false));\r\n+        }\r\n+    }\r\n+\r\n+    public void buildRouterChain(URL url) {\r\n+        this.setRouterChain(RouterChain.buildChain(url));\r\n+    }\r\n+\r\n+    public List<Invoker<T>> getInvokers() {\r\n+        return invokers;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        if (isDestroyed()) {\r\n+            return;\r\n+        }\r\n+\r\n+        // unregister.\r\n+        try {\r\n+            if (getRegisteredConsumerUrl() != null && registry != null && registry.isAvailable()) {\r\n+                registry.unregister(getRegisteredConsumerUrl());\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"unexpected error when unregister service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\r\n+        }\r\n+        // unsubscribe.\r\n+        try {\r\n+            if (getConsumerUrl() != null && registry != null && registry.isAvailable()) {\r\n+                registry.unsubscribe(getConsumerUrl(), this);\r\n+            }\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"unexpected error when unsubscribe service \" + serviceKey + \"from registry\" + registry.getUrl(), t);\r\n+        }\r\n+        super.destroy(); // must be executed after unsubscribing\r\n+        try {\r\n+            destroyAllInvokers();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Failed to destroy service \" + serviceKey, t);\r\n+        }\r\n+\r\n+        invokersChangedListener = null;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void discordAddresses() {\r\n+        try {\r\n+            destroyAllInvokers();\r\n+        } catch (Throwable t) {\r\n+            logger.warn(\"Failed to destroy service \" + serviceKey, t);\r\n+        }\r\n+    }\r\n+\r\n+    private volatile InvokersChangedListener invokersChangedListener;\r\n+    private volatile boolean addressChanged;\r\n+\r\n+    public void setInvokersChangedListener(InvokersChangedListener listener) {\r\n+        this.invokersChangedListener = listener;\r\n+        if (addressChanged) {\r\n+            if (invokersChangedListener != null) {\r\n+                invokersChangedListener.onChange();\r\n+                this.addressChanged = false;\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    protected void invokersChanged() {\r\n+        if (invokersChangedListener != null) {\r\n+            invokersChangedListener.onChange();\r\n+            this.addressChanged = false;\r\n+        } else {\r\n+            this.addressChanged = true;\r\n+        }\r\n+    }\r\n+\r\n+    protected abstract void destroyAllInvokers();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java", "source2": "org/apache/dubbo/registry/integration/InterfaceCompatibleRegistryProtocol.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,73 +1,73 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.URLBuilder;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\n-import org.apache.dubbo.registry.client.migration.MigrationInvoker;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\n-\n-/**\n- * RegistryProtocol\n- */\n-public class InterfaceCompatibleRegistryProtocol extends RegistryProtocol {\n-\n-    @Override\n-    protected URL getRegistryUrl(Invoker<?> originInvoker) {\n-        URL registryUrl = originInvoker.getUrl();\n-        if (REGISTRY_PROTOCOL.equals(registryUrl.getProtocol())) {\n-            String protocol = registryUrl.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\n-            registryUrl = registryUrl.setProtocol(protocol).removeParameter(REGISTRY_KEY);\n-        }\n-        return registryUrl;\n-    }\n-\n-    @Override\n-    protected URL getRegistryUrl(URL url) {\n-        return URLBuilder.from(url)\n-                .setProtocol(url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY))\n-                .removeParameter(REGISTRY_KEY)\n-                .build();\n-    }\n-\n-    @Override\n-    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    @Override\n-    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        registry = registryFactory.getRegistry(super.getRegistryUrl(url));\n-        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-//        ClusterInvoker<T> invoker = getInvoker(cluster, registry, type, url);\n-        return new MigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.URLBuilder;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\r\n+import org.apache.dubbo.registry.client.migration.MigrationInvoker;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY;\r\n+\r\n+/**\r\n+ * RegistryProtocol\r\n+ */\r\n+public class InterfaceCompatibleRegistryProtocol extends RegistryProtocol {\r\n+\r\n+    @Override\r\n+    protected URL getRegistryUrl(Invoker<?> originInvoker) {\r\n+        URL registryUrl = originInvoker.getUrl();\r\n+        if (REGISTRY_PROTOCOL.equals(registryUrl.getProtocol())) {\r\n+            String protocol = registryUrl.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY);\r\n+            registryUrl = registryUrl.setProtocol(protocol).removeParameter(REGISTRY_KEY);\r\n+        }\r\n+        return registryUrl;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected URL getRegistryUrl(URL url) {\r\n+        return URLBuilder.from(url)\r\n+                .setProtocol(url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY))\r\n+                .removeParameter(REGISTRY_KEY)\r\n+                .build();\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        registry = registryFactory.getRegistry(super.getRegistryUrl(url));\r\n+        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+//        ClusterInvoker<T> invoker = getInvoker(cluster, registry, type, url);\r\n+        return new MigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/InvokersChangedListener.java", "source2": "org/apache/dubbo/registry/integration/InvokersChangedListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,21 +1,21 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-public interface InvokersChangedListener {\n-    void onChange();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+public interface InvokersChangedListener {\r\n+    void onChange();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/RegistryProtocol.java", "source2": "org/apache/dubbo/registry/integration/RegistryProtocol.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,843 +1,843 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.config.ConfigurationUtils;\n-import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\n-import org.apache.dubbo.common.extension.ExtensionLoader;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.timer.HashedWheelTimer;\n-import org.apache.dubbo.common.utils.CollectionUtils;\n-import org.apache.dubbo.common.utils.NamedThreadFactory;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.common.utils.UrlUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.RegistryFactory;\n-import org.apache.dubbo.registry.RegistryService;\n-import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\n-import org.apache.dubbo.registry.client.migration.ServiceDiscoveryMigrationInvoker;\n-import org.apache.dubbo.registry.retry.ReExportTask;\n-import org.apache.dubbo.registry.support.SkipFailbackWrapperException;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.Invoker;\n-import org.apache.dubbo.rpc.Protocol;\n-import org.apache.dubbo.rpc.ProtocolServer;\n-import org.apache.dubbo.rpc.ProxyFactory;\n-import org.apache.dubbo.rpc.RpcException;\n-import org.apache.dubbo.rpc.cluster.Cluster;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-import org.apache.dubbo.rpc.cluster.Configurator;\n-import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\n-import org.apache.dubbo.rpc.cluster.support.MergeableCluster;\n-import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\n-import org.apache.dubbo.rpc.model.ApplicationModel;\n-import org.apache.dubbo.rpc.model.ProviderModel;\n-import org.apache.dubbo.rpc.protocol.InvokerWrapper;\n-\n-import java.util.ArrayList;\n-import java.util.HashMap;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.ConcurrentMap;\n-import java.util.concurrent.ExecutorService;\n-import java.util.concurrent.TimeUnit;\n-\n-import static java.util.concurrent.Executors.newSingleThreadExecutor;\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.HIDDEN_KEY_PREFIX;\n-import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ON_CONNECT_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.ON_DISCONNECT_KEY;\n-import static org.apache.dubbo.common.constants.FilterConstants.VALIDATION_KEY;\n-import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\n-import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.OVERRIDE_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\n-import static org.apache.dubbo.common.utils.UrlUtils.classifyUrls;\n-import static org.apache.dubbo.registry.Constants.CONFIGURATORS_SUFFIX;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\n-import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\n-import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\n-import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\n-import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\n-import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\n-import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\n-import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\n-import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\n-import static org.apache.dubbo.rpc.Constants.INTERFACES;\n-import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\n-import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.WARMUP_KEY;\n-import static org.apache.dubbo.rpc.cluster.Constants.WEIGHT_KEY;\n-\n-/**\n- * TODO, replace RegistryProtocol completely in the future.\n- */\n-public class RegistryProtocol implements Protocol {\n-    public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {\n-            APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,\n-            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY,\n-            WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\n-    };\n-\n-    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = {\n-            APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\n-    };\n-\n-    private final static Logger logger = LoggerFactory.getLogger(InterfaceCompatibleRegistryProtocol.class);\n-    private final Map<URL, NotifyListener> overrideListeners = new ConcurrentHashMap<>();\n-    private final Map<String, ServiceConfigurationListener> serviceConfigurationListeners = new ConcurrentHashMap<>();\n-    private final ProviderConfigurationListener providerConfigurationListener = new ProviderConfigurationListener();\n-    // To solve the problem of RMI repeated exposure port conflicts, the services that have been exposed are no longer exposed.\n-    // providerurl <--> exporter\n-    private final ConcurrentMap<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();\n-    protected Protocol protocol;\n-    protected RegistryFactory registryFactory;\n-    protected ProxyFactory proxyFactory;\n-\n-    private ConcurrentMap<URL, ReExportTask> reExportFailedTasks = new ConcurrentHashMap<>();\n-    private HashedWheelTimer retryTimer = new HashedWheelTimer(new NamedThreadFactory(\"DubboReexportTimer\", true), DEFAULT_REGISTRY_RETRY_PERIOD, TimeUnit.MILLISECONDS, 128);\n-\n-    // get the parameters which shouldn't been displayed in url string(Starting with .)\n-    private static String[] getHiddenKeys(URL url) {\n-        Map<String, String> params = url.getParameters();\n-        if (CollectionUtils.isNotEmptyMap(params)) {\n-            return params.keySet().stream()\n-                    .filter(k -> k.startsWith(HIDDEN_KEY_PREFIX))\n-                    .toArray(String[]::new);\n-        } else {\n-            return new String[0];\n-        }\n-    }\n-\n-    public void setProtocol(Protocol protocol) {\n-        this.protocol = protocol;\n-    }\n-\n-    public void setRegistryFactory(RegistryFactory registryFactory) {\n-        this.registryFactory = registryFactory;\n-    }\n-\n-    public void setProxyFactory(ProxyFactory proxyFactory) {\n-        this.proxyFactory = proxyFactory;\n-    }\n-\n-    @Override\n-    public int getDefaultPort() {\n-        return 9090;\n-    }\n-\n-    public Map<URL, NotifyListener> getOverrideListeners() {\n-        return overrideListeners;\n-    }\n-\n-    private void registerStatedUrl(URL registryUrl, URL registeredProviderUrl, boolean registered) {\n-        ProviderModel model = ApplicationModel.getProviderModel(registeredProviderUrl.getServiceKey());\n-        model.addStatedUrl(new ProviderModel.RegisterStatedURL(\n-                registeredProviderUrl,\n-                registryUrl,\n-                registered));\n-    }\n-\n-    @Override\n-    public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        // url to export locally\n-        URL providerUrl = getProviderUrl(originInvoker);\n-\n-        // Subscribe the override data\n-        // FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call\n-        //  the same service. Because the subscribed is cached key with the name of the service, it causes the\n-        //  subscription information to cover.\n-        final URL overrideSubscribeUrl = getSubscribedOverrideUrl(providerUrl);\n-        final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);\n-        overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);\n-\n-        providerUrl = overrideUrlWithConfig(providerUrl, overrideSubscribeListener);\n-        // export invoker\n-        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);\n-\n-        // url to registry\n-        final Registry registry = getRegistry(originInvoker);\n-        final URL registeredProviderUrl = getUrlToRegistry(providerUrl, registryUrl);\n-\n-        // decide if we need to delay publish\n-        boolean register = providerUrl.getParameter(REGISTER_KEY, true);\n-        if (register) {\n-            registry.register(registeredProviderUrl);\n-        }\n-\n-        // register stated url on provider model\n-        registerStatedUrl(registryUrl, registeredProviderUrl, register);\n-\n-\n-        exporter.setRegisterUrl(registeredProviderUrl);\n-        exporter.setSubscribeUrl(overrideSubscribeUrl);\n-\n-        // Deprecated! Subscribe to override rules in 2.6.x or before.\n-        registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);\n-\n-        notifyExport(exporter);\n-        //Ensure that a new exporter instance is returned every time export\n-        return new DestroyableExporter<>(exporter);\n-    }\n-\n-    private <T> void notifyExport(ExporterChangeableWrapper<T> exporter) {\n-        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getActivateExtension(exporter.getOriginInvoker().getUrl(), \"registry.protocol.listener\");\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            for (RegistryProtocolListener listener : listeners) {\n-                listener.onExport(this, exporter);\n-            }\n-        }\n-    }\n-\n-    private URL overrideUrlWithConfig(URL providerUrl, OverrideListener listener) {\n-        providerUrl = providerConfigurationListener.overrideUrl(providerUrl);\n-        ServiceConfigurationListener serviceConfigurationListener = new ServiceConfigurationListener(providerUrl, listener);\n-        serviceConfigurationListeners.put(providerUrl.getServiceKey(), serviceConfigurationListener);\n-        return serviceConfigurationListener.overrideUrl(providerUrl);\n-    }\n-\n-    @SuppressWarnings(\"unchecked\")\n-    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {\n-        String key = getCacheKey(originInvoker);\n-\n-        return (ExporterChangeableWrapper<T>) bounds.computeIfAbsent(key, s -> {\n-            Invoker<?> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);\n-            return new ExporterChangeableWrapper<>((Exporter<T>) protocol.export(invokerDelegate), originInvoker);\n-        });\n-    }\n-\n-    public <T> void reExport(Exporter<T> exporter, URL newInvokerUrl) {\n-        if (exporter instanceof ExporterChangeableWrapper) {\n-            ExporterChangeableWrapper<T> exporterWrapper = (ExporterChangeableWrapper<T>) exporter;\n-            Invoker<T> originInvoker = exporterWrapper.getOriginInvoker();\n-            reExport(originInvoker, newInvokerUrl);\n-        }\n-    }\n-\n-    /**\n-     * Reexport the invoker of the modified url\n-     *\n-     * @param originInvoker\n-     * @param newInvokerUrl\n-     * @param <T>\n-     */\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> void reExport(final Invoker<T> originInvoker, URL newInvokerUrl) {\n-        String key = getCacheKey(originInvoker);\n-        ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);\n-        URL registeredUrl = exporter.getRegisterUrl();\n-\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        URL newProviderUrl = getUrlToRegistry(newInvokerUrl, registryUrl);\n-\n-        // update local exporter\n-        Invoker<T> invokerDelegate = new InvokerDelegate<T>(originInvoker, newInvokerUrl);\n-        exporter.setExporter(protocol.export(invokerDelegate));\n-\n-        // update registry\n-        if (!newProviderUrl.equals(registeredUrl)) {\n-            try {\n-                doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl);\n-            } catch (Exception e) {\n-                ReExportTask oldTask = reExportFailedTasks.get(registeredUrl);\n-                if (oldTask != null) {\n-                    return;\n-                }\n-                ReExportTask task = new ReExportTask(\n-                        () -> doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl),\n-                        registeredUrl,\n-                        null\n-                );\n-                oldTask = reExportFailedTasks.putIfAbsent(registeredUrl, task);\n-                if (oldTask == null) {\n-                    // never has a retry task. then start a new task for retry.\n-                    retryTimer.newTimeout(task, registryUrl.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD), TimeUnit.MILLISECONDS);\n-                }\n-            }\n-        }\n-    }\n-\n-    private <T> void doReExport(final Invoker<T> originInvoker, ExporterChangeableWrapper<T> exporter,\n-                                URL registryUrl, URL oldProviderUrl, URL newProviderUrl) {\n-        if (getProviderUrl(originInvoker).getParameter(REGISTER_KEY, true)) {\n-            Registry registry = null;\n-            try {\n-                registry = getRegistry(originInvoker);\n-            } catch (Exception e) {\n-                throw new SkipFailbackWrapperException(e);\n-            }\n-\n-            logger.info(\"Try to unregister old url: \" + oldProviderUrl);\n-            registry.reExportUnregister(oldProviderUrl);\n-\n-            logger.info(\"Try to register new url: \" + newProviderUrl);\n-            registry.reExportRegister(newProviderUrl);\n-        }\n-        try {\n-            ProviderModel.RegisterStatedURL statedUrl = getStatedUrl(registryUrl, newProviderUrl);\n-            statedUrl.setProviderUrl(newProviderUrl);\n-            exporter.setRegisterUrl(newProviderUrl);\n-        } catch (Exception e) {\n-            throw new SkipFailbackWrapperException(e);\n-        }\n-    }\n-\n-    private ProviderModel.RegisterStatedURL getStatedUrl(URL registryUrl, URL providerUrl) {\n-        ProviderModel providerModel = ApplicationModel.getServiceRepository()\n-                .lookupExportedService(providerUrl.getServiceKey());\n-\n-        List<ProviderModel.RegisterStatedURL> statedUrls = providerModel.getStatedUrl();\n-        return statedUrls.stream()\n-                .filter(u -> u.getRegistryUrl().equals(registryUrl)\n-                        && u.getProviderUrl().getProtocol().equals(providerUrl.getProtocol()))\n-                .findFirst().orElseThrow(() -> new IllegalStateException(\"There should have at least one registered url.\"));\n-    }\n-\n-    /**\n-     * Get an instance of registry based on the address of invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    protected Registry getRegistry(final Invoker<?> originInvoker) {\n-        URL registryUrl = getRegistryUrl(originInvoker);\n-        return registryFactory.getRegistry(registryUrl);\n-    }\n-\n-    protected URL getRegistryUrl(Invoker<?> originInvoker) {\n-        return originInvoker.getUrl();\n-    }\n-\n-    protected URL getRegistryUrl(URL url) {\n-        if (SERVICE_REGISTRY_PROTOCOL.equals(url.getProtocol())) {\n-            return url;\n-        }\n-        return url.addParameter(REGISTRY_KEY, url.getProtocol()).setProtocol(SERVICE_REGISTRY_PROTOCOL);\n-    }\n-\n-    /**\n-     * Return the url that is registered to the registry and filter the url parameter once\n-     *\n-     * @param providerUrl\n-     * @return url to registry.\n-     */\n-    private URL getUrlToRegistry(final URL providerUrl, final URL registryUrl) {\n-\n-        URL registeredProviderUrl = removeUselessParameters(providerUrl);\n-\n-        //The address you see at the registry\n-        if (!registryUrl.getParameter(SIMPLIFIED_KEY, false)) {\n-            return registeredProviderUrl.removeParameters(getHiddenKeys(registeredProviderUrl)).removeParameters(\n-                    MONITOR_KEY, BIND_IP_KEY, BIND_PORT_KEY, QOS_ENABLE, QOS_HOST, QOS_PORT, ACCEPT_FOREIGN_IP, VALIDATION_KEY,\n-                    INTERFACES);\n-        } else {\n-            String extraKeys = registryUrl.getParameter(EXTRA_KEYS_KEY, \"\");\n-            // if path is not the same as interface name then we should keep INTERFACE_KEY,\n-            // otherwise, the registry structure of zookeeper would be '/dubbo/path/providers',\n-            // but what we expect is '/dubbo/interface/providers'\n-            if (!registeredProviderUrl.getPath().equals(registeredProviderUrl.getParameter(INTERFACE_KEY))) {\n-                if (StringUtils.isNotEmpty(extraKeys)) {\n-                    extraKeys += \",\";\n-                }\n-                extraKeys += INTERFACE_KEY;\n-            }\n-            String[] paramsToRegistry = getParamsToRegistry(DEFAULT_REGISTER_PROVIDER_KEYS\n-                    , COMMA_SPLIT_PATTERN.split(extraKeys));\n-            return URL.valueOf(registeredProviderUrl, paramsToRegistry, registeredProviderUrl.getParameter(METHODS_KEY, (String[]) null));\n-        }\n-\n-    }\n-\n-    /**\n-     * Remove information that does not require registration\n-     * @param providerUrl\n-     * @return\n-     */\n-    private URL removeUselessParameters(URL providerUrl) {\n-        return providerUrl.removeParameters(ON_CONNECT_KEY, ON_DISCONNECT_KEY);\n-    }\n-\n-    private URL getSubscribedOverrideUrl(URL registeredProviderUrl) {\n-        return registeredProviderUrl.setProtocol(PROVIDER_PROTOCOL)\n-                .addParameters(CATEGORY_KEY, CONFIGURATORS_CATEGORY, CHECK_KEY, String.valueOf(false));\n-    }\n-\n-    /**\n-     * Get the address of the providerUrl through the url of the invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    private URL getProviderUrl(final Invoker<?> originInvoker) {\n-        String export = originInvoker.getUrl().getParameterAndDecoded(EXPORT_KEY);\n-        if (export == null || export.length() == 0) {\n-            throw new IllegalArgumentException(\"The registry export url is null! registry: \" + originInvoker.getUrl());\n-        }\n-        return URL.valueOf(export);\n-    }\n-\n-    /**\n-     * Get the key cached in bounds by invoker\n-     *\n-     * @param originInvoker\n-     * @return\n-     */\n-    private String getCacheKey(final Invoker<?> originInvoker) {\n-        URL providerUrl = getProviderUrl(originInvoker);\n-        String key = providerUrl.removeParameters(\"dynamic\", \"enabled\").toFullString();\n-        return key;\n-    }\n-\n-    @Override\n-    @SuppressWarnings(\"unchecked\")\n-    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {\n-        url = getRegistryUrl(url);\n-        Registry registry = registryFactory.getRegistry(url);\n-        if (RegistryService.class.equals(type)) {\n-            return proxyFactory.getInvoker((T) registry, type, url);\n-        }\n-\n-        // group=\"a,b\" or group=\"*\"\n-        Map<String, String> qs = StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY));\n-        String group = qs.get(GROUP_KEY);\n-        if (group != null && group.length() > 0) {\n-            if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || \"*\".equals(group)) {\n-                return doRefer(Cluster.getCluster(MergeableCluster.NAME), registry, type, url, qs);\n-            }\n-        }\n-\n-        Cluster cluster = Cluster.getCluster(qs.get(CLUSTER_KEY));\n-        return doRefer(cluster, registry, type, url, qs);\n-    }\n-\n-    protected <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url, Map<String, String> parameters) {\n-        URL consumerUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\n-        ClusterInvoker<T> migrationInvoker = getMigrationInvoker(this, cluster, registry, type, url, consumerUrl);\n-        return interceptInvoker(migrationInvoker, url, consumerUrl);\n-    }\n-\n-    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\n-        return new ServiceDiscoveryMigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\n-    }\n-\n-    protected <T> Invoker<T> interceptInvoker(ClusterInvoker<T> invoker, URL url, URL consumerUrl) {\n-        List<RegistryProtocolListener> listeners = findRegistryProtocolListeners(url);\n-        if (CollectionUtils.isEmpty(listeners)) {\n-            return invoker;\n-        }\n-\n-        for (RegistryProtocolListener listener : listeners) {\n-            listener.onRefer(this, invoker, consumerUrl);\n-        }\n-        return invoker;\n-    }\n-\n-    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\n-        // FIXME, this method is currently not used, create the right registry before enable.\n-        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\n-        return doCreateInvoker(directory, cluster, registry, type);\n-    }\n-\n-    protected <T> ClusterInvoker<T> doCreateInvoker(DynamicDirectory<T> directory, Cluster cluster, Registry registry, Class<T> type) {\n-        directory.setRegistry(registry);\n-        directory.setProtocol(protocol);\n-        // all attributes of REFER_KEY\n-        Map<String, String> parameters = new HashMap<String, String>(directory.getConsumerUrl().getParameters());\n-        URL urlToRegistry = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\n-        if (directory.isShouldRegister()) {\n-            directory.setRegisteredConsumerUrl(urlToRegistry);\n-            registry.register(directory.getRegisteredConsumerUrl());\n-        }\n-        directory.buildRouterChain(urlToRegistry);\n-        directory.subscribe(toSubscribeUrl(urlToRegistry));\n-\n-        return (ClusterInvoker<T>) cluster.join(directory);\n-    }\n-\n-    public <T> void reRefer(ClusterInvoker<?> invoker, URL newSubscribeUrl) {\n-        if (!(invoker instanceof MigrationClusterInvoker)) {\n-            logger.error(\"Only invoker type of MigrationClusterInvoker supports reRefer, current invoker is \" + invoker.getClass());\n-            return;\n-        }\n-\n-        MigrationClusterInvoker<?> migrationClusterInvoker = (MigrationClusterInvoker<?>)invoker;\n-        migrationClusterInvoker.reRefer(newSubscribeUrl);\n-    }\n-\n-    public static URL toSubscribeUrl(URL url) {\n-        return url.addParameter(CATEGORY_KEY, PROVIDERS_CATEGORY + \",\" + CONFIGURATORS_CATEGORY + \",\" + ROUTERS_CATEGORY);\n-    }\n-\n-    protected List<RegistryProtocolListener> findRegistryProtocolListeners(URL url) {\n-        return ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getActivateExtension(url, \"registry.protocol.listener\");\n-    }\n-\n-    // available to test\n-    public String[] getParamsToRegistry(String[] defaultKeys, String[] additionalParameterKeys) {\n-        int additionalLen = additionalParameterKeys.length;\n-        String[] registryParams = new String[defaultKeys.length + additionalLen];\n-        System.arraycopy(defaultKeys, 0, registryParams, 0, defaultKeys.length);\n-        System.arraycopy(additionalParameterKeys, 0, registryParams, defaultKeys.length, additionalLen);\n-        return registryParams;\n-    }\n-\n-    @Override\n-    public void destroy() {\n-        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\n-                .getLoadedExtensionInstances();\n-        if (CollectionUtils.isNotEmpty(listeners)) {\n-            for (RegistryProtocolListener listener : listeners) {\n-                listener.onDestroy();\n-            }\n-        }\n-\n-        List<Exporter<?>> exporters = new ArrayList<Exporter<?>>(bounds.values());\n-        for (Exporter<?> exporter : exporters) {\n-            exporter.unexport();\n-        }\n-        bounds.clear();\n-\n-        ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\n-                .removeListener(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX, providerConfigurationListener);\n-    }\n-\n-    @Override\n-    public List<ProtocolServer> getServers() {\n-        return protocol.getServers();\n-    }\n-\n-    // merge the urls of configurators\n-    private static URL getConfiguredInvokerUrl(List<Configurator> configurators, URL url) {\n-        if (configurators != null && configurators.size() > 0) {\n-            for (Configurator configurator : configurators) {\n-                url = configurator.configure(url);\n-            }\n-        }\n-        return url;\n-    }\n-\n-    public static class InvokerDelegate<T> extends InvokerWrapper<T> {\n-        private final Invoker<T> invoker;\n-\n-        /**\n-         * @param invoker\n-         * @param url     invoker.getUrl return this value\n-         */\n-        public InvokerDelegate(Invoker<T> invoker, URL url) {\n-            super(invoker, url);\n-            this.invoker = invoker;\n-        }\n-\n-        public Invoker<T> getInvoker() {\n-            if (invoker instanceof InvokerDelegate) {\n-                return ((InvokerDelegate<T>) invoker).getInvoker();\n-            } else {\n-                return invoker;\n-            }\n-        }\n-    }\n-\n-    private static class DestroyableExporter<T> implements Exporter<T> {\n-\n-        private Exporter<T> exporter;\n-\n-        public DestroyableExporter(Exporter<T> exporter) {\n-            this.exporter = exporter;\n-        }\n-\n-        @Override\n-        public Invoker<T> getInvoker() {\n-            return exporter.getInvoker();\n-        }\n-\n-        @Override\n-        public void unexport() {\n-            exporter.unexport();\n-        }\n-    }\n-\n-    /**\n-     * Reexport: the exporter destroy problem in protocol\n-     * 1.Ensure that the exporter returned by registryprotocol can be normal destroyed\n-     * 2.No need to re-register to the registry after notify\n-     * 3.The invoker passed by the export method , would better to be the invoker of exporter\n-     */\n-    private class OverrideListener implements NotifyListener {\n-        private final URL subscribeUrl;\n-        private final Invoker originInvoker;\n-\n-\n-        private List<Configurator> configurators;\n-\n-        public OverrideListener(URL subscribeUrl, Invoker originalInvoker) {\n-            this.subscribeUrl = subscribeUrl;\n-            this.originInvoker = originalInvoker;\n-        }\n-\n-        /**\n-         * @param urls The list of registered information, is always not empty, The meaning is the same as the\n-         *             return value of {@link org.apache.dubbo.registry.RegistryService#lookup(URL)}.\n-         */\n-        @Override\n-        public synchronized void notify(List<URL> urls) {\n-            logger.debug(\"original override urls: \" + urls);\n-\n-            List<URL> matchedUrls = getMatchedUrls(urls, subscribeUrl.addParameter(CATEGORY_KEY,\n-                    CONFIGURATORS_CATEGORY));\n-            logger.debug(\"subscribe url: \" + subscribeUrl + \", override urls: \" + matchedUrls);\n-\n-            // No matching results\n-            if (matchedUrls.isEmpty()) {\n-                return;\n-            }\n-\n-            this.configurators = Configurator.toConfigurators(classifyUrls(matchedUrls, UrlUtils::isConfigurator))\n-                    .orElse(configurators);\n-\n-            doOverrideIfNecessary();\n-        }\n-\n-        public synchronized void doOverrideIfNecessary() {\n-            final Invoker<?> invoker;\n-            if (originInvoker instanceof InvokerDelegate) {\n-                invoker = ((InvokerDelegate<?>) originInvoker).getInvoker();\n-            } else {\n-                invoker = originInvoker;\n-            }\n-            //The origin invoker\n-            URL originUrl = RegistryProtocol.this.getProviderUrl(invoker);\n-            String key = getCacheKey(originInvoker);\n-            ExporterChangeableWrapper<?> exporter = bounds.get(key);\n-            if (exporter == null) {\n-                logger.warn(new IllegalStateException(\"error state, exporter should not be null\"));\n-                return;\n-            }\n-            //The current, may have been merged many times\n-            URL currentUrl = exporter.getInvoker().getUrl();\n-            //Merged with this configuration\n-            URL newUrl = getConfiguredInvokerUrl(configurators, currentUrl);\n-            newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);\n-            newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())\n-                    .getConfigurators(), newUrl);\n-            if (!currentUrl.equals(newUrl)) {\n-                RegistryProtocol.this.reExport(originInvoker, newUrl);\n-                logger.info(\"exported provider url changed, origin url: \" + originUrl +\n-                        \", old export url: \" + currentUrl + \", new export url: \" + newUrl);\n-            }\n-        }\n-\n-        private List<URL> getMatchedUrls(List<URL> configuratorUrls, URL currentSubscribe) {\n-            List<URL> result = new ArrayList<URL>();\n-            for (URL url : configuratorUrls) {\n-                URL overrideUrl = url;\n-                // Compatible with the old version\n-                if (url.getParameter(CATEGORY_KEY) == null && OVERRIDE_PROTOCOL.equals(url.getProtocol())) {\n-                    overrideUrl = url.addParameter(CATEGORY_KEY, CONFIGURATORS_CATEGORY);\n-                }\n-\n-                // Check whether url is to be applied to the current service\n-                if (UrlUtils.isMatch(currentSubscribe, overrideUrl)) {\n-                    result.add(url);\n-                }\n-            }\n-            return result;\n-        }\n-    }\n-\n-    private class ServiceConfigurationListener extends AbstractConfiguratorListener {\n-        private URL providerUrl;\n-        private OverrideListener notifyListener;\n-\n-        public ServiceConfigurationListener(URL providerUrl, OverrideListener notifyListener) {\n-            this.providerUrl = providerUrl;\n-            this.notifyListener = notifyListener;\n-            this.initWith(DynamicConfiguration.getRuleKey(providerUrl) + CONFIGURATORS_SUFFIX);\n-        }\n-\n-        private <T> URL overrideUrl(URL providerUrl) {\n-            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\n-        }\n-\n-        @Override\n-        protected void notifyOverrides() {\n-            notifyListener.doOverrideIfNecessary();\n-        }\n-    }\n-\n-    private class ProviderConfigurationListener extends AbstractConfiguratorListener {\n-\n-        public ProviderConfigurationListener() {\n-            this.initWith(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX);\n-        }\n-\n-        /**\n-         * Get existing configuration rule and override provider url before exporting.\n-         *\n-         * @param providerUrl\n-         * @param <T>\n-         * @return\n-         */\n-        private <T> URL overrideUrl(URL providerUrl) {\n-            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\n-        }\n-\n-        @Override\n-        protected void notifyOverrides() {\n-            overrideListeners.values().forEach(listener -> ((OverrideListener) listener).doOverrideIfNecessary());\n-        }\n-    }\n-\n-    /**\n-     * exporter proxy, establish the corresponding relationship between the returned exporter and the exporter\n-     * exported by the protocol, and can modify the relationship at the time of override.\n-     *\n-     * @param <T>\n-     */\n-    private class ExporterChangeableWrapper<T> implements Exporter<T> {\n-\n-        private final ExecutorService executor = newSingleThreadExecutor(new NamedThreadFactory(\"Exporter-Unexport\", true));\n-\n-        private final Invoker<T> originInvoker;\n-        private Exporter<T> exporter;\n-        private URL subscribeUrl;\n-        private URL registerUrl;\n-\n-        public ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker) {\n-            this.exporter = exporter;\n-            this.originInvoker = originInvoker;\n-        }\n-\n-        public Invoker<T> getOriginInvoker() {\n-            return originInvoker;\n-        }\n-\n-        @Override\n-        public Invoker<T> getInvoker() {\n-            return exporter.getInvoker();\n-        }\n-\n-        public void setExporter(Exporter<T> exporter) {\n-            this.exporter = exporter;\n-        }\n-\n-        @Override\n-        public void unexport() {\n-            String key = getCacheKey(this.originInvoker);\n-            bounds.remove(key);\n-\n-            Registry registry = RegistryProtocol.this.getRegistry(originInvoker);\n-            try {\n-                registry.unregister(registerUrl);\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), t);\n-            }\n-            try {\n-                NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);\n-                registry.unsubscribe(subscribeUrl, listener);\n-                ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\n-                        .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,\n-                                serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));\n-            } catch (Throwable t) {\n-                logger.warn(t.getMessage(), t);\n-            }\n-\n-            executor.submit(() -> {\n-                try {\n-                    int timeout = ConfigurationUtils.getServerShutdownTimeout();\n-                    if (timeout > 0) {\n-                        logger.info(\"Waiting \" + timeout + \"ms for registry to notify all consumers before unexport. \" +\n-                                \"Usually, this is called when you use dubbo API\");\n-                        Thread.sleep(timeout);\n-                    }\n-                    exporter.unexport();\n-                } catch (Throwable t) {\n-                    logger.warn(t.getMessage(), t);\n-                }\n-            });\n-        }\n-\n-        public void setSubscribeUrl(URL subscribeUrl) {\n-            this.subscribeUrl = subscribeUrl;\n-        }\n-\n-        public void setRegisterUrl(URL registerUrl) {\n-            this.registerUrl = registerUrl;\n-        }\n-\n-        public URL getRegisterUrl() {\n-            return registerUrl;\n-        }\n-    }\n-\n-    // for unit test\n-    private static RegistryProtocol INSTANCE;\n-\n-    // for unit test\n-    public RegistryProtocol() {\n-        INSTANCE = this;\n-    }\n-\n-    // for unit test\n-    public static RegistryProtocol getRegistryProtocol() {\n-        if (INSTANCE == null) {\n-            ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(REGISTRY_PROTOCOL); // load\n-        }\n-        return INSTANCE;\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.config.ConfigurationUtils;\r\n+import org.apache.dubbo.common.config.configcenter.DynamicConfiguration;\r\n+import org.apache.dubbo.common.extension.ExtensionLoader;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.timer.HashedWheelTimer;\r\n+import org.apache.dubbo.common.utils.CollectionUtils;\r\n+import org.apache.dubbo.common.utils.NamedThreadFactory;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.common.utils.UrlUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.RegistryFactory;\r\n+import org.apache.dubbo.registry.RegistryService;\r\n+import org.apache.dubbo.registry.client.ServiceDiscoveryRegistryDirectory;\r\n+import org.apache.dubbo.registry.client.migration.ServiceDiscoveryMigrationInvoker;\r\n+import org.apache.dubbo.registry.retry.ReExportTask;\r\n+import org.apache.dubbo.registry.support.SkipFailbackWrapperException;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.Invoker;\r\n+import org.apache.dubbo.rpc.Protocol;\r\n+import org.apache.dubbo.rpc.ProtocolServer;\r\n+import org.apache.dubbo.rpc.ProxyFactory;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+import org.apache.dubbo.rpc.cluster.Cluster;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+import org.apache.dubbo.rpc.cluster.Configurator;\r\n+import org.apache.dubbo.rpc.cluster.governance.GovernanceRuleRepository;\r\n+import org.apache.dubbo.rpc.cluster.support.MergeableCluster;\r\n+import org.apache.dubbo.rpc.cluster.support.migration.MigrationClusterInvoker;\r\n+import org.apache.dubbo.rpc.model.ApplicationModel;\r\n+import org.apache.dubbo.rpc.model.ProviderModel;\r\n+import org.apache.dubbo.rpc.protocol.InvokerWrapper;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.HashMap;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.ConcurrentMap;\r\n+import java.util.concurrent.ExecutorService;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static java.util.concurrent.Executors.newSingleThreadExecutor;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.CLUSTER_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.COMMA_SPLIT_PATTERN;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO_VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.EXTRA_KEYS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.HIDDEN_KEY_PREFIX;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.INTERFACE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.LOADBALANCE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.METHODS_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.MONITOR_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.PATH_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.RELEASE_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.TIMESTAMP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ON_CONNECT_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.ON_DISCONNECT_KEY;\r\n+import static org.apache.dubbo.common.constants.FilterConstants.VALIDATION_KEY;\r\n+import static org.apache.dubbo.common.constants.QosConstants.ACCEPT_FOREIGN_IP;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_ENABLE;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_HOST;\r\n+import static org.apache.dubbo.common.constants.QosConstants.QOS_PORT;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CATEGORY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.CONFIGURATORS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.OVERRIDE_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.PROVIDERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_KEY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.ROUTERS_CATEGORY;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SERVICE_REGISTRY_PROTOCOL;\r\n+import static org.apache.dubbo.common.utils.UrlUtils.classifyUrls;\r\n+import static org.apache.dubbo.registry.Constants.CONFIGURATORS_SUFFIX;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\r\n+import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_IP_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SIMPLIFIED_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_IP_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.BIND_PORT_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CHECK_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CODEC_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.CONNECTIONS_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.EXCHANGER_KEY;\r\n+import static org.apache.dubbo.remoting.Constants.SERIALIZATION_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.DEPRECATED_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.INTERFACES;\r\n+import static org.apache.dubbo.rpc.Constants.MOCK_KEY;\r\n+import static org.apache.dubbo.rpc.Constants.TOKEN_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.EXPORT_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.REFER_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.WARMUP_KEY;\r\n+import static org.apache.dubbo.rpc.cluster.Constants.WEIGHT_KEY;\r\n+\r\n+/**\r\n+ * TODO, replace RegistryProtocol completely in the future.\r\n+ */\r\n+public class RegistryProtocol implements Protocol {\r\n+    public static final String[] DEFAULT_REGISTER_PROVIDER_KEYS = {\r\n+            APPLICATION_KEY, CODEC_KEY, EXCHANGER_KEY, SERIALIZATION_KEY, CLUSTER_KEY, CONNECTIONS_KEY, DEPRECATED_KEY,\r\n+            GROUP_KEY, LOADBALANCE_KEY, MOCK_KEY, PATH_KEY, TIMEOUT_KEY, TOKEN_KEY, VERSION_KEY, WARMUP_KEY,\r\n+            WEIGHT_KEY, TIMESTAMP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\r\n+    };\r\n+\r\n+    public static final String[] DEFAULT_REGISTER_CONSUMER_KEYS = {\r\n+            APPLICATION_KEY, VERSION_KEY, GROUP_KEY, DUBBO_VERSION_KEY, RELEASE_KEY\r\n+    };\r\n+\r\n+    private final static Logger logger = LoggerFactory.getLogger(InterfaceCompatibleRegistryProtocol.class);\r\n+    private final Map<URL, NotifyListener> overrideListeners = new ConcurrentHashMap<>();\r\n+    private final Map<String, ServiceConfigurationListener> serviceConfigurationListeners = new ConcurrentHashMap<>();\r\n+    private final ProviderConfigurationListener providerConfigurationListener = new ProviderConfigurationListener();\r\n+    // To solve the problem of RMI repeated exposure port conflicts, the services that have been exposed are no longer exposed.\r\n+    // providerurl <--> exporter\r\n+    private final ConcurrentMap<String, ExporterChangeableWrapper<?>> bounds = new ConcurrentHashMap<>();\r\n+    protected Protocol protocol;\r\n+    protected RegistryFactory registryFactory;\r\n+    protected ProxyFactory proxyFactory;\r\n+\r\n+    private ConcurrentMap<URL, ReExportTask> reExportFailedTasks = new ConcurrentHashMap<>();\r\n+    private HashedWheelTimer retryTimer = new HashedWheelTimer(new NamedThreadFactory(\"DubboReexportTimer\", true), DEFAULT_REGISTRY_RETRY_PERIOD, TimeUnit.MILLISECONDS, 128);\r\n+\r\n+    // get the parameters which shouldn't been displayed in url string(Starting with .)\r\n+    private static String[] getHiddenKeys(URL url) {\r\n+        Map<String, String> params = url.getParameters();\r\n+        if (CollectionUtils.isNotEmptyMap(params)) {\r\n+            return params.keySet().stream()\r\n+                    .filter(k -> k.startsWith(HIDDEN_KEY_PREFIX))\r\n+                    .toArray(String[]::new);\r\n+        } else {\r\n+            return new String[0];\r\n+        }\r\n+    }\r\n+\r\n+    public void setProtocol(Protocol protocol) {\r\n+        this.protocol = protocol;\r\n+    }\r\n+\r\n+    public void setRegistryFactory(RegistryFactory registryFactory) {\r\n+        this.registryFactory = registryFactory;\r\n+    }\r\n+\r\n+    public void setProxyFactory(ProxyFactory proxyFactory) {\r\n+        this.proxyFactory = proxyFactory;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getDefaultPort() {\r\n+        return 9090;\r\n+    }\r\n+\r\n+    public Map<URL, NotifyListener> getOverrideListeners() {\r\n+        return overrideListeners;\r\n+    }\r\n+\r\n+    private void registerStatedUrl(URL registryUrl, URL registeredProviderUrl, boolean registered) {\r\n+        ProviderModel model = ApplicationModel.getProviderModel(registeredProviderUrl.getServiceKey());\r\n+        model.addStatedUrl(new ProviderModel.RegisterStatedURL(\r\n+                registeredProviderUrl,\r\n+                registryUrl,\r\n+                registered));\r\n+    }\r\n+\r\n+    @Override\r\n+    public <T> Exporter<T> export(final Invoker<T> originInvoker) throws RpcException {\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        // url to export locally\r\n+        URL providerUrl = getProviderUrl(originInvoker);\r\n+\r\n+        // Subscribe the override data\r\n+        // FIXME When the provider subscribes, it will affect the scene : a certain JVM exposes the service and call\r\n+        //  the same service. Because the subscribed is cached key with the name of the service, it causes the\r\n+        //  subscription information to cover.\r\n+        final URL overrideSubscribeUrl = getSubscribedOverrideUrl(providerUrl);\r\n+        final OverrideListener overrideSubscribeListener = new OverrideListener(overrideSubscribeUrl, originInvoker);\r\n+        overrideListeners.put(overrideSubscribeUrl, overrideSubscribeListener);\r\n+\r\n+        providerUrl = overrideUrlWithConfig(providerUrl, overrideSubscribeListener);\r\n+        // export invoker\r\n+        final ExporterChangeableWrapper<T> exporter = doLocalExport(originInvoker, providerUrl);\r\n+\r\n+        // url to registry\r\n+        final Registry registry = getRegistry(originInvoker);\r\n+        final URL registeredProviderUrl = getUrlToRegistry(providerUrl, registryUrl);\r\n+\r\n+        // decide if we need to delay publish\r\n+        boolean register = providerUrl.getParameter(REGISTER_KEY, true);\r\n+        if (register) {\r\n+            registry.register(registeredProviderUrl);\r\n+        }\r\n+\r\n+        // register stated url on provider model\r\n+        registerStatedUrl(registryUrl, registeredProviderUrl, register);\r\n+\r\n+\r\n+        exporter.setRegisterUrl(registeredProviderUrl);\r\n+        exporter.setSubscribeUrl(overrideSubscribeUrl);\r\n+\r\n+        // Deprecated! Subscribe to override rules in 2.6.x or before.\r\n+        registry.subscribe(overrideSubscribeUrl, overrideSubscribeListener);\r\n+\r\n+        notifyExport(exporter);\r\n+        //Ensure that a new exporter instance is returned every time export\r\n+        return new DestroyableExporter<>(exporter);\r\n+    }\r\n+\r\n+    private <T> void notifyExport(ExporterChangeableWrapper<T> exporter) {\r\n+        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getActivateExtension(exporter.getOriginInvoker().getUrl(), \"registry.protocol.listener\");\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            for (RegistryProtocolListener listener : listeners) {\r\n+                listener.onExport(this, exporter);\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private URL overrideUrlWithConfig(URL providerUrl, OverrideListener listener) {\r\n+        providerUrl = providerConfigurationListener.overrideUrl(providerUrl);\r\n+        ServiceConfigurationListener serviceConfigurationListener = new ServiceConfigurationListener(providerUrl, listener);\r\n+        serviceConfigurationListeners.put(providerUrl.getServiceKey(), serviceConfigurationListener);\r\n+        return serviceConfigurationListener.overrideUrl(providerUrl);\r\n+    }\r\n+\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    private <T> ExporterChangeableWrapper<T> doLocalExport(final Invoker<T> originInvoker, URL providerUrl) {\r\n+        String key = getCacheKey(originInvoker);\r\n+\r\n+        return (ExporterChangeableWrapper<T>) bounds.computeIfAbsent(key, s -> {\r\n+            Invoker<?> invokerDelegate = new InvokerDelegate<>(originInvoker, providerUrl);\r\n+            return new ExporterChangeableWrapper<>((Exporter<T>) protocol.export(invokerDelegate), originInvoker);\r\n+        });\r\n+    }\r\n+\r\n+    public <T> void reExport(Exporter<T> exporter, URL newInvokerUrl) {\r\n+        if (exporter instanceof ExporterChangeableWrapper) {\r\n+            ExporterChangeableWrapper<T> exporterWrapper = (ExporterChangeableWrapper<T>) exporter;\r\n+            Invoker<T> originInvoker = exporterWrapper.getOriginInvoker();\r\n+            reExport(originInvoker, newInvokerUrl);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Reexport the invoker of the modified url\r\n+     *\r\n+     * @param originInvoker\r\n+     * @param newInvokerUrl\r\n+     * @param <T>\r\n+     */\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> void reExport(final Invoker<T> originInvoker, URL newInvokerUrl) {\r\n+        String key = getCacheKey(originInvoker);\r\n+        ExporterChangeableWrapper<T> exporter = (ExporterChangeableWrapper<T>) bounds.get(key);\r\n+        URL registeredUrl = exporter.getRegisterUrl();\r\n+\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        URL newProviderUrl = getUrlToRegistry(newInvokerUrl, registryUrl);\r\n+\r\n+        // update local exporter\r\n+        Invoker<T> invokerDelegate = new InvokerDelegate<T>(originInvoker, newInvokerUrl);\r\n+        exporter.setExporter(protocol.export(invokerDelegate));\r\n+\r\n+        // update registry\r\n+        if (!newProviderUrl.equals(registeredUrl)) {\r\n+            try {\r\n+                doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl);\r\n+            } catch (Exception e) {\r\n+                ReExportTask oldTask = reExportFailedTasks.get(registeredUrl);\r\n+                if (oldTask != null) {\r\n+                    return;\r\n+                }\r\n+                ReExportTask task = new ReExportTask(\r\n+                        () -> doReExport(originInvoker, exporter, registryUrl, registeredUrl, newProviderUrl),\r\n+                        registeredUrl,\r\n+                        null\r\n+                );\r\n+                oldTask = reExportFailedTasks.putIfAbsent(registeredUrl, task);\r\n+                if (oldTask == null) {\r\n+                    // never has a retry task. then start a new task for retry.\r\n+                    retryTimer.newTimeout(task, registryUrl.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD), TimeUnit.MILLISECONDS);\r\n+                }\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private <T> void doReExport(final Invoker<T> originInvoker, ExporterChangeableWrapper<T> exporter,\r\n+                                URL registryUrl, URL oldProviderUrl, URL newProviderUrl) {\r\n+        if (getProviderUrl(originInvoker).getParameter(REGISTER_KEY, true)) {\r\n+            Registry registry = null;\r\n+            try {\r\n+                registry = getRegistry(originInvoker);\r\n+            } catch (Exception e) {\r\n+                throw new SkipFailbackWrapperException(e);\r\n+            }\r\n+\r\n+            logger.info(\"Try to unregister old url: \" + oldProviderUrl);\r\n+            registry.reExportUnregister(oldProviderUrl);\r\n+\r\n+            logger.info(\"Try to register new url: \" + newProviderUrl);\r\n+            registry.reExportRegister(newProviderUrl);\r\n+        }\r\n+        try {\r\n+            ProviderModel.RegisterStatedURL statedUrl = getStatedUrl(registryUrl, newProviderUrl);\r\n+            statedUrl.setProviderUrl(newProviderUrl);\r\n+            exporter.setRegisterUrl(newProviderUrl);\r\n+        } catch (Exception e) {\r\n+            throw new SkipFailbackWrapperException(e);\r\n+        }\r\n+    }\r\n+\r\n+    private ProviderModel.RegisterStatedURL getStatedUrl(URL registryUrl, URL providerUrl) {\r\n+        ProviderModel providerModel = ApplicationModel.getServiceRepository()\r\n+                .lookupExportedService(providerUrl.getServiceKey());\r\n+\r\n+        List<ProviderModel.RegisterStatedURL> statedUrls = providerModel.getStatedUrl();\r\n+        return statedUrls.stream()\r\n+                .filter(u -> u.getRegistryUrl().equals(registryUrl)\r\n+                        && u.getProviderUrl().getProtocol().equals(providerUrl.getProtocol()))\r\n+                .findFirst().orElseThrow(() -> new IllegalStateException(\"There should have at least one registered url.\"));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get an instance of registry based on the address of invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    protected Registry getRegistry(final Invoker<?> originInvoker) {\r\n+        URL registryUrl = getRegistryUrl(originInvoker);\r\n+        return registryFactory.getRegistry(registryUrl);\r\n+    }\r\n+\r\n+    protected URL getRegistryUrl(Invoker<?> originInvoker) {\r\n+        return originInvoker.getUrl();\r\n+    }\r\n+\r\n+    protected URL getRegistryUrl(URL url) {\r\n+        if (SERVICE_REGISTRY_PROTOCOL.equals(url.getProtocol())) {\r\n+            return url;\r\n+        }\r\n+        return url.addParameter(REGISTRY_KEY, url.getProtocol()).setProtocol(SERVICE_REGISTRY_PROTOCOL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Return the url that is registered to the registry and filter the url parameter once\r\n+     *\r\n+     * @param providerUrl\r\n+     * @return url to registry.\r\n+     */\r\n+    private URL getUrlToRegistry(final URL providerUrl, final URL registryUrl) {\r\n+\r\n+        URL registeredProviderUrl = removeUselessParameters(providerUrl);\r\n+\r\n+        //The address you see at the registry\r\n+        if (!registryUrl.getParameter(SIMPLIFIED_KEY, false)) {\r\n+            return registeredProviderUrl.removeParameters(getHiddenKeys(registeredProviderUrl)).removeParameters(\r\n+                    MONITOR_KEY, BIND_IP_KEY, BIND_PORT_KEY, QOS_ENABLE, QOS_HOST, QOS_PORT, ACCEPT_FOREIGN_IP, VALIDATION_KEY,\r\n+                    INTERFACES);\r\n+        } else {\r\n+            String extraKeys = registryUrl.getParameter(EXTRA_KEYS_KEY, \"\");\r\n+            // if path is not the same as interface name then we should keep INTERFACE_KEY,\r\n+            // otherwise, the registry structure of zookeeper would be '/dubbo/path/providers',\r\n+            // but what we expect is '/dubbo/interface/providers'\r\n+            if (!registeredProviderUrl.getPath().equals(registeredProviderUrl.getParameter(INTERFACE_KEY))) {\r\n+                if (StringUtils.isNotEmpty(extraKeys)) {\r\n+                    extraKeys += \",\";\r\n+                }\r\n+                extraKeys += INTERFACE_KEY;\r\n+            }\r\n+            String[] paramsToRegistry = getParamsToRegistry(DEFAULT_REGISTER_PROVIDER_KEYS\r\n+                    , COMMA_SPLIT_PATTERN.split(extraKeys));\r\n+            return URL.valueOf(registeredProviderUrl, paramsToRegistry, registeredProviderUrl.getParameter(METHODS_KEY, (String[]) null));\r\n+        }\r\n+\r\n+    }\r\n+\r\n+    /**\r\n+     * Remove information that does not require registration\r\n+     * @param providerUrl\r\n+     * @return\r\n+     */\r\n+    private URL removeUselessParameters(URL providerUrl) {\r\n+        return providerUrl.removeParameters(ON_CONNECT_KEY, ON_DISCONNECT_KEY);\r\n+    }\r\n+\r\n+    private URL getSubscribedOverrideUrl(URL registeredProviderUrl) {\r\n+        return registeredProviderUrl.setProtocol(PROVIDER_PROTOCOL)\r\n+                .addParameters(CATEGORY_KEY, CONFIGURATORS_CATEGORY, CHECK_KEY, String.valueOf(false));\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the address of the providerUrl through the url of the invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    private URL getProviderUrl(final Invoker<?> originInvoker) {\r\n+        String export = originInvoker.getUrl().getParameterAndDecoded(EXPORT_KEY);\r\n+        if (export == null || export.length() == 0) {\r\n+            throw new IllegalArgumentException(\"The registry export url is null! registry: \" + originInvoker.getUrl());\r\n+        }\r\n+        return URL.valueOf(export);\r\n+    }\r\n+\r\n+    /**\r\n+     * Get the key cached in bounds by invoker\r\n+     *\r\n+     * @param originInvoker\r\n+     * @return\r\n+     */\r\n+    private String getCacheKey(final Invoker<?> originInvoker) {\r\n+        URL providerUrl = getProviderUrl(originInvoker);\r\n+        String key = providerUrl.removeParameters(\"dynamic\", \"enabled\").toFullString();\r\n+        return key;\r\n+    }\r\n+\r\n+    @Override\r\n+    @SuppressWarnings(\"unchecked\")\r\n+    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {\r\n+        url = getRegistryUrl(url);\r\n+        Registry registry = registryFactory.getRegistry(url);\r\n+        if (RegistryService.class.equals(type)) {\r\n+            return proxyFactory.getInvoker((T) registry, type, url);\r\n+        }\r\n+\r\n+        // group=\"a,b\" or group=\"*\"\r\n+        Map<String, String> qs = StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY));\r\n+        String group = qs.get(GROUP_KEY);\r\n+        if (group != null && group.length() > 0) {\r\n+            if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || \"*\".equals(group)) {\r\n+                return doRefer(Cluster.getCluster(MergeableCluster.NAME), registry, type, url, qs);\r\n+            }\r\n+        }\r\n+\r\n+        Cluster cluster = Cluster.getCluster(qs.get(CLUSTER_KEY));\r\n+        return doRefer(cluster, registry, type, url, qs);\r\n+    }\r\n+\r\n+    protected <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url, Map<String, String> parameters) {\r\n+        URL consumerUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\r\n+        ClusterInvoker<T> migrationInvoker = getMigrationInvoker(this, cluster, registry, type, url, consumerUrl);\r\n+        return interceptInvoker(migrationInvoker, url, consumerUrl);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> getMigrationInvoker(RegistryProtocol registryProtocol, Cluster cluster, Registry registry, Class<T> type, URL url, URL consumerUrl) {\r\n+        return new ServiceDiscoveryMigrationInvoker<T>(registryProtocol, cluster, registry, type, url, consumerUrl);\r\n+    }\r\n+\r\n+    protected <T> Invoker<T> interceptInvoker(ClusterInvoker<T> invoker, URL url, URL consumerUrl) {\r\n+        List<RegistryProtocolListener> listeners = findRegistryProtocolListeners(url);\r\n+        if (CollectionUtils.isEmpty(listeners)) {\r\n+            return invoker;\r\n+        }\r\n+\r\n+        for (RegistryProtocolListener listener : listeners) {\r\n+            listener.onRefer(this, invoker, consumerUrl);\r\n+        }\r\n+        return invoker;\r\n+    }\r\n+\r\n+    public <T> ClusterInvoker<T> getServiceDiscoveryInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        DynamicDirectory<T> directory = new ServiceDiscoveryRegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    public <T> ClusterInvoker<T> getInvoker(Cluster cluster, Registry registry, Class<T> type, URL url) {\r\n+        // FIXME, this method is currently not used, create the right registry before enable.\r\n+        DynamicDirectory<T> directory = new RegistryDirectory<>(type, url);\r\n+        return doCreateInvoker(directory, cluster, registry, type);\r\n+    }\r\n+\r\n+    protected <T> ClusterInvoker<T> doCreateInvoker(DynamicDirectory<T> directory, Cluster cluster, Registry registry, Class<T> type) {\r\n+        directory.setRegistry(registry);\r\n+        directory.setProtocol(protocol);\r\n+        // all attributes of REFER_KEY\r\n+        Map<String, String> parameters = new HashMap<String, String>(directory.getConsumerUrl().getParameters());\r\n+        URL urlToRegistry = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);\r\n+        if (directory.isShouldRegister()) {\r\n+            directory.setRegisteredConsumerUrl(urlToRegistry);\r\n+            registry.register(directory.getRegisteredConsumerUrl());\r\n+        }\r\n+        directory.buildRouterChain(urlToRegistry);\r\n+        directory.subscribe(toSubscribeUrl(urlToRegistry));\r\n+\r\n+        return (ClusterInvoker<T>) cluster.join(directory);\r\n+    }\r\n+\r\n+    public <T> void reRefer(ClusterInvoker<?> invoker, URL newSubscribeUrl) {\r\n+        if (!(invoker instanceof MigrationClusterInvoker)) {\r\n+            logger.error(\"Only invoker type of MigrationClusterInvoker supports reRefer, current invoker is \" + invoker.getClass());\r\n+            return;\r\n+        }\r\n+\r\n+        MigrationClusterInvoker<?> migrationClusterInvoker = (MigrationClusterInvoker<?>)invoker;\r\n+        migrationClusterInvoker.reRefer(newSubscribeUrl);\r\n+    }\r\n+\r\n+    public static URL toSubscribeUrl(URL url) {\r\n+        return url.addParameter(CATEGORY_KEY, PROVIDERS_CATEGORY + \",\" + CONFIGURATORS_CATEGORY + \",\" + ROUTERS_CATEGORY);\r\n+    }\r\n+\r\n+    protected List<RegistryProtocolListener> findRegistryProtocolListeners(URL url) {\r\n+        return ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getActivateExtension(url, \"registry.protocol.listener\");\r\n+    }\r\n+\r\n+    // available to test\r\n+    public String[] getParamsToRegistry(String[] defaultKeys, String[] additionalParameterKeys) {\r\n+        int additionalLen = additionalParameterKeys.length;\r\n+        String[] registryParams = new String[defaultKeys.length + additionalLen];\r\n+        System.arraycopy(defaultKeys, 0, registryParams, 0, defaultKeys.length);\r\n+        System.arraycopy(additionalParameterKeys, 0, registryParams, defaultKeys.length, additionalLen);\r\n+        return registryParams;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() {\r\n+        List<RegistryProtocolListener> listeners = ExtensionLoader.getExtensionLoader(RegistryProtocolListener.class)\r\n+                .getLoadedExtensionInstances();\r\n+        if (CollectionUtils.isNotEmpty(listeners)) {\r\n+            for (RegistryProtocolListener listener : listeners) {\r\n+                listener.onDestroy();\r\n+            }\r\n+        }\r\n+\r\n+        List<Exporter<?>> exporters = new ArrayList<Exporter<?>>(bounds.values());\r\n+        for (Exporter<?> exporter : exporters) {\r\n+            exporter.unexport();\r\n+        }\r\n+        bounds.clear();\r\n+\r\n+        ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\r\n+                .removeListener(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX, providerConfigurationListener);\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ProtocolServer> getServers() {\r\n+        return protocol.getServers();\r\n+    }\r\n+\r\n+    // merge the urls of configurators\r\n+    private static URL getConfiguredInvokerUrl(List<Configurator> configurators, URL url) {\r\n+        if (configurators != null && configurators.size() > 0) {\r\n+            for (Configurator configurator : configurators) {\r\n+                url = configurator.configure(url);\r\n+            }\r\n+        }\r\n+        return url;\r\n+    }\r\n+\r\n+    public static class InvokerDelegate<T> extends InvokerWrapper<T> {\r\n+        private final Invoker<T> invoker;\r\n+\r\n+        /**\r\n+         * @param invoker\r\n+         * @param url     invoker.getUrl return this value\r\n+         */\r\n+        public InvokerDelegate(Invoker<T> invoker, URL url) {\r\n+            super(invoker, url);\r\n+            this.invoker = invoker;\r\n+        }\r\n+\r\n+        public Invoker<T> getInvoker() {\r\n+            if (invoker instanceof InvokerDelegate) {\r\n+                return ((InvokerDelegate<T>) invoker).getInvoker();\r\n+            } else {\r\n+                return invoker;\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private static class DestroyableExporter<T> implements Exporter<T> {\r\n+\r\n+        private Exporter<T> exporter;\r\n+\r\n+        public DestroyableExporter(Exporter<T> exporter) {\r\n+            this.exporter = exporter;\r\n+        }\r\n+\r\n+        @Override\r\n+        public Invoker<T> getInvoker() {\r\n+            return exporter.getInvoker();\r\n+        }\r\n+\r\n+        @Override\r\n+        public void unexport() {\r\n+            exporter.unexport();\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Reexport: the exporter destroy problem in protocol\r\n+     * 1.Ensure that the exporter returned by registryprotocol can be normal destroyed\r\n+     * 2.No need to re-register to the registry after notify\r\n+     * 3.The invoker passed by the export method , would better to be the invoker of exporter\r\n+     */\r\n+    private class OverrideListener implements NotifyListener {\r\n+        private final URL subscribeUrl;\r\n+        private final Invoker originInvoker;\r\n+\r\n+\r\n+        private List<Configurator> configurators;\r\n+\r\n+        public OverrideListener(URL subscribeUrl, Invoker originalInvoker) {\r\n+            this.subscribeUrl = subscribeUrl;\r\n+            this.originInvoker = originalInvoker;\r\n+        }\r\n+\r\n+        /**\r\n+         * @param urls The list of registered information, is always not empty, The meaning is the same as the\r\n+         *             return value of {@link org.apache.dubbo.registry.RegistryService#lookup(URL)}.\r\n+         */\r\n+        @Override\r\n+        public synchronized void notify(List<URL> urls) {\r\n+            logger.debug(\"original override urls: \" + urls);\r\n+\r\n+            List<URL> matchedUrls = getMatchedUrls(urls, subscribeUrl.addParameter(CATEGORY_KEY,\r\n+                    CONFIGURATORS_CATEGORY));\r\n+            logger.debug(\"subscribe url: \" + subscribeUrl + \", override urls: \" + matchedUrls);\r\n+\r\n+            // No matching results\r\n+            if (matchedUrls.isEmpty()) {\r\n+                return;\r\n+            }\r\n+\r\n+            this.configurators = Configurator.toConfigurators(classifyUrls(matchedUrls, UrlUtils::isConfigurator))\r\n+                    .orElse(configurators);\r\n+\r\n+            doOverrideIfNecessary();\r\n+        }\r\n+\r\n+        public synchronized void doOverrideIfNecessary() {\r\n+            final Invoker<?> invoker;\r\n+            if (originInvoker instanceof InvokerDelegate) {\r\n+                invoker = ((InvokerDelegate<?>) originInvoker).getInvoker();\r\n+            } else {\r\n+                invoker = originInvoker;\r\n+            }\r\n+            //The origin invoker\r\n+            URL originUrl = RegistryProtocol.this.getProviderUrl(invoker);\r\n+            String key = getCacheKey(originInvoker);\r\n+            ExporterChangeableWrapper<?> exporter = bounds.get(key);\r\n+            if (exporter == null) {\r\n+                logger.warn(new IllegalStateException(\"error state, exporter should not be null\"));\r\n+                return;\r\n+            }\r\n+            //The current, may have been merged many times\r\n+            URL currentUrl = exporter.getInvoker().getUrl();\r\n+            //Merged with this configuration\r\n+            URL newUrl = getConfiguredInvokerUrl(configurators, currentUrl);\r\n+            newUrl = getConfiguredInvokerUrl(providerConfigurationListener.getConfigurators(), newUrl);\r\n+            newUrl = getConfiguredInvokerUrl(serviceConfigurationListeners.get(originUrl.getServiceKey())\r\n+                    .getConfigurators(), newUrl);\r\n+            if (!currentUrl.equals(newUrl)) {\r\n+                RegistryProtocol.this.reExport(originInvoker, newUrl);\r\n+                logger.info(\"exported provider url changed, origin url: \" + originUrl +\r\n+                        \", old export url: \" + currentUrl + \", new export url: \" + newUrl);\r\n+            }\r\n+        }\r\n+\r\n+        private List<URL> getMatchedUrls(List<URL> configuratorUrls, URL currentSubscribe) {\r\n+            List<URL> result = new ArrayList<URL>();\r\n+            for (URL url : configuratorUrls) {\r\n+                URL overrideUrl = url;\r\n+                // Compatible with the old version\r\n+                if (url.getParameter(CATEGORY_KEY) == null && OVERRIDE_PROTOCOL.equals(url.getProtocol())) {\r\n+                    overrideUrl = url.addParameter(CATEGORY_KEY, CONFIGURATORS_CATEGORY);\r\n+                }\r\n+\r\n+                // Check whether url is to be applied to the current service\r\n+                if (UrlUtils.isMatch(currentSubscribe, overrideUrl)) {\r\n+                    result.add(url);\r\n+                }\r\n+            }\r\n+            return result;\r\n+        }\r\n+    }\r\n+\r\n+    private class ServiceConfigurationListener extends AbstractConfiguratorListener {\r\n+        private URL providerUrl;\r\n+        private OverrideListener notifyListener;\r\n+\r\n+        public ServiceConfigurationListener(URL providerUrl, OverrideListener notifyListener) {\r\n+            this.providerUrl = providerUrl;\r\n+            this.notifyListener = notifyListener;\r\n+            this.initWith(DynamicConfiguration.getRuleKey(providerUrl) + CONFIGURATORS_SUFFIX);\r\n+        }\r\n+\r\n+        private <T> URL overrideUrl(URL providerUrl) {\r\n+            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\r\n+        }\r\n+\r\n+        @Override\r\n+        protected void notifyOverrides() {\r\n+            notifyListener.doOverrideIfNecessary();\r\n+        }\r\n+    }\r\n+\r\n+    private class ProviderConfigurationListener extends AbstractConfiguratorListener {\r\n+\r\n+        public ProviderConfigurationListener() {\r\n+            this.initWith(ApplicationModel.getApplication() + CONFIGURATORS_SUFFIX);\r\n+        }\r\n+\r\n+        /**\r\n+         * Get existing configuration rule and override provider url before exporting.\r\n+         *\r\n+         * @param providerUrl\r\n+         * @param <T>\r\n+         * @return\r\n+         */\r\n+        private <T> URL overrideUrl(URL providerUrl) {\r\n+            return RegistryProtocol.getConfiguredInvokerUrl(configurators, providerUrl);\r\n+        }\r\n+\r\n+        @Override\r\n+        protected void notifyOverrides() {\r\n+            overrideListeners.values().forEach(listener -> ((OverrideListener) listener).doOverrideIfNecessary());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * exporter proxy, establish the corresponding relationship between the returned exporter and the exporter\r\n+     * exported by the protocol, and can modify the relationship at the time of override.\r\n+     *\r\n+     * @param <T>\r\n+     */\r\n+    private class ExporterChangeableWrapper<T> implements Exporter<T> {\r\n+\r\n+        private final ExecutorService executor = newSingleThreadExecutor(new NamedThreadFactory(\"Exporter-Unexport\", true));\r\n+\r\n+        private final Invoker<T> originInvoker;\r\n+        private Exporter<T> exporter;\r\n+        private URL subscribeUrl;\r\n+        private URL registerUrl;\r\n+\r\n+        public ExporterChangeableWrapper(Exporter<T> exporter, Invoker<T> originInvoker) {\r\n+            this.exporter = exporter;\r\n+            this.originInvoker = originInvoker;\r\n+        }\r\n+\r\n+        public Invoker<T> getOriginInvoker() {\r\n+            return originInvoker;\r\n+        }\r\n+\r\n+        @Override\r\n+        public Invoker<T> getInvoker() {\r\n+            return exporter.getInvoker();\r\n+        }\r\n+\r\n+        public void setExporter(Exporter<T> exporter) {\r\n+            this.exporter = exporter;\r\n+        }\r\n+\r\n+        @Override\r\n+        public void unexport() {\r\n+            String key = getCacheKey(this.originInvoker);\r\n+            bounds.remove(key);\r\n+\r\n+            Registry registry = RegistryProtocol.this.getRegistry(originInvoker);\r\n+            try {\r\n+                registry.unregister(registerUrl);\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+            try {\r\n+                NotifyListener listener = RegistryProtocol.this.overrideListeners.remove(subscribeUrl);\r\n+                registry.unsubscribe(subscribeUrl, listener);\r\n+                ExtensionLoader.getExtensionLoader(GovernanceRuleRepository.class).getDefaultExtension()\r\n+                        .removeListener(subscribeUrl.getServiceKey() + CONFIGURATORS_SUFFIX,\r\n+                                serviceConfigurationListeners.get(subscribeUrl.getServiceKey()));\r\n+            } catch (Throwable t) {\r\n+                logger.warn(t.getMessage(), t);\r\n+            }\r\n+\r\n+            executor.submit(() -> {\r\n+                try {\r\n+                    int timeout = ConfigurationUtils.getServerShutdownTimeout();\r\n+                    if (timeout > 0) {\r\n+                        logger.info(\"Waiting \" + timeout + \"ms for registry to notify all consumers before unexport. \" +\r\n+                                \"Usually, this is called when you use dubbo API\");\r\n+                        Thread.sleep(timeout);\r\n+                    }\r\n+                    exporter.unexport();\r\n+                } catch (Throwable t) {\r\n+                    logger.warn(t.getMessage(), t);\r\n+                }\r\n+            });\r\n+        }\r\n+\r\n+        public void setSubscribeUrl(URL subscribeUrl) {\r\n+            this.subscribeUrl = subscribeUrl;\r\n+        }\r\n+\r\n+        public void setRegisterUrl(URL registerUrl) {\r\n+            this.registerUrl = registerUrl;\r\n+        }\r\n+\r\n+        public URL getRegisterUrl() {\r\n+            return registerUrl;\r\n+        }\r\n+    }\r\n+\r\n+    // for unit test\r\n+    private static RegistryProtocol INSTANCE;\r\n+\r\n+    // for unit test\r\n+    public RegistryProtocol() {\r\n+        INSTANCE = this;\r\n+    }\r\n+\r\n+    // for unit test\r\n+    public static RegistryProtocol getRegistryProtocol() {\r\n+        if (INSTANCE == null) {\r\n+            ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(REGISTRY_PROTOCOL); // load\r\n+        }\r\n+        return INSTANCE;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/integration/RegistryProtocolListener.java", "source2": "org/apache/dubbo/registry/integration/RegistryProtocolListener.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,53 +1,53 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.integration;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.extension.SPI;\n-import org.apache.dubbo.rpc.Exporter;\n-import org.apache.dubbo.rpc.cluster.ClusterInvoker;\n-\n-/**\n- * RegistryProtocol listener is introduced to provide a chance to user to customize or change export and refer behavior\n- * of RegistryProtocol. For example: re-export or re-refer on the fly when certain condition meets.\n- */\n-@SPI\n-public interface RegistryProtocolListener {\n-    /**\n-     * Notify RegistryProtocol's listeners when a service is registered\n-     *\n-     * @param registryProtocol RegistryProtocol instance\n-     * @param exporter         exporter\n-     * @see RegistryProtocol#export(org.apache.dubbo.rpc.Invoker)\n-     */\n-    void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter);\n-\n-    /**\n-     * Notify RegistryProtocol's listeners when a service is subscribed\n-     *\n-     * @param registryProtocol RegistryProtocol instance\n-     * @param invoker          invoker\n-     * @param url\n-     * @see RegistryProtocol#refer(Class, URL)\n-     */\n-    void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url);\n-\n-    /**\n-     * Notify RegistryProtocol's listeners when the protocol is destroyed\n-     */\n-    void onDestroy();\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.integration;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.extension.SPI;\r\n+import org.apache.dubbo.rpc.Exporter;\r\n+import org.apache.dubbo.rpc.cluster.ClusterInvoker;\r\n+\r\n+/**\r\n+ * RegistryProtocol listener is introduced to provide a chance to user to customize or change export and refer behavior\r\n+ * of RegistryProtocol. For example: re-export or re-refer on the fly when certain condition meets.\r\n+ */\r\n+@SPI\r\n+public interface RegistryProtocolListener {\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when a service is registered\r\n+     *\r\n+     * @param registryProtocol RegistryProtocol instance\r\n+     * @param exporter         exporter\r\n+     * @see RegistryProtocol#export(org.apache.dubbo.rpc.Invoker)\r\n+     */\r\n+    void onExport(RegistryProtocol registryProtocol, Exporter<?> exporter);\r\n+\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when a service is subscribed\r\n+     *\r\n+     * @param registryProtocol RegistryProtocol instance\r\n+     * @param invoker          invoker\r\n+     * @param url\r\n+     * @see RegistryProtocol#refer(Class, URL)\r\n+     */\r\n+    void onRefer(RegistryProtocol registryProtocol, ClusterInvoker<?> invoker, URL url);\r\n+\r\n+    /**\r\n+     * Notify RegistryProtocol's listeners when the protocol is destroyed\r\n+     */\r\n+    void onDestroy();\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/retry/AbstractRetryTask.java", "source2": "org/apache/dubbo/registry/retry/AbstractRetryTask.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,133 +1,133 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-\n-package org.apache.dubbo.registry.retry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.timer.Timeout;\n-import org.apache.dubbo.common.timer.Timer;\n-import org.apache.dubbo.common.timer.TimerTask;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\n-import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_TIMES;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\n-import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_TIMES_KEY;\n-\n-/**\n- * AbstractRetryTask\n- */\n-public abstract class AbstractRetryTask implements TimerTask {\n-\n-    protected final Logger logger = LoggerFactory.getLogger(getClass());\n-\n-    /**\n-     * url for retry task\n-     */\n-    protected final URL url;\n-\n-    /**\n-     * registry for this task\n-     */\n-    protected final FailbackRegistry registry;\n-\n-    /**\n-     * retry period\n-     */\n-    final long retryPeriod;\n-\n-    /**\n-     * define the most retry times\n-     */\n-    private final int retryTimes;\n-\n-    /**\n-     * task name for this task\n-     */\n-    private final String taskName;\n-\n-    /**\n-     * times of retry.\n-     * retry task is execute in single thread so that the times is not need volatile.\n-     */\n-    private int times = 1;\n-\n-    private volatile boolean cancel;\n-\n-    AbstractRetryTask(URL url, FailbackRegistry registry, String taskName) {\n-        if (url == null || StringUtils.isBlank(taskName)) {\n-            throw new IllegalArgumentException();\n-        }\n-        this.url = url;\n-        this.registry = registry;\n-        this.taskName = taskName;\n-        cancel = false;\n-        this.retryPeriod = url.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD);\n-        this.retryTimes = url.getParameter(REGISTRY_RETRY_TIMES_KEY, DEFAULT_REGISTRY_RETRY_TIMES);\n-    }\n-\n-    public void cancel() {\n-        cancel = true;\n-    }\n-\n-    public boolean isCancel() {\n-        return cancel;\n-    }\n-\n-    protected void reput(Timeout timeout, long tick) {\n-        if (timeout == null) {\n-            throw new IllegalArgumentException();\n-        }\n-\n-        Timer timer = timeout.timer();\n-        if (timer.isStop() || timeout.isCancelled() || isCancel()) {\n-            return;\n-        }\n-        times++;\n-        timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS);\n-    }\n-\n-    @Override\n-    public void run(Timeout timeout) throws Exception {\n-        if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {\n-            // other thread cancel this timeout or stop the timer.\n-            return;\n-        }\n-        if (times > retryTimes) {\n-            // reach the most times of retry.\n-            logger.warn(\"Final failed to execute task \" + taskName + \", url: \" + url + \", retry \" + retryTimes + \" times.\");\n-            return;\n-        }\n-        if (logger.isInfoEnabled()) {\n-            logger.info(taskName + \" : \" + url);\n-        }\n-        try {\n-            doRetry(url, registry, timeout);\n-        } catch (Throwable t) { // Ignore all the exceptions and wait for the next retry\n-            logger.warn(\"Failed to execute task \" + taskName + \", url: \" + url + \", waiting for again, cause:\" + t.getMessage(), t);\n-            // reput this task when catch exception.\n-            reput(timeout, retryPeriod);\n-        }\n-    }\n-\n-    protected abstract void doRetry(URL url, FailbackRegistry registry, Timeout timeout);\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+\r\n+package org.apache.dubbo.registry.retry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.timer.Timeout;\r\n+import org.apache.dubbo.common.timer.Timer;\r\n+import org.apache.dubbo.common.timer.TimerTask;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_PERIOD;\r\n+import static org.apache.dubbo.registry.Constants.DEFAULT_REGISTRY_RETRY_TIMES;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_PERIOD_KEY;\r\n+import static org.apache.dubbo.registry.Constants.REGISTRY_RETRY_TIMES_KEY;\r\n+\r\n+/**\r\n+ * AbstractRetryTask\r\n+ */\r\n+public abstract class AbstractRetryTask implements TimerTask {\r\n+\r\n+    protected final Logger logger = LoggerFactory.getLogger(getClass());\r\n+\r\n+    /**\r\n+     * url for retry task\r\n+     */\r\n+    protected final URL url;\r\n+\r\n+    /**\r\n+     * registry for this task\r\n+     */\r\n+    protected final FailbackRegistry registry;\r\n+\r\n+    /**\r\n+     * retry period\r\n+     */\r\n+    final long retryPeriod;\r\n+\r\n+    /**\r\n+     * define the most retry times\r\n+     */\r\n+    private final int retryTimes;\r\n+\r\n+    /**\r\n+     * task name for this task\r\n+     */\r\n+    private final String taskName;\r\n+\r\n+    /**\r\n+     * times of retry.\r\n+     * retry task is execute in single thread so that the times is not need volatile.\r\n+     */\r\n+    private int times = 1;\r\n+\r\n+    private volatile boolean cancel;\r\n+\r\n+    AbstractRetryTask(URL url, FailbackRegistry registry, String taskName) {\r\n+        if (url == null || StringUtils.isBlank(taskName)) {\r\n+            throw new IllegalArgumentException();\r\n+        }\r\n+        this.url = url;\r\n+        this.registry = registry;\r\n+        this.taskName = taskName;\r\n+        cancel = false;\r\n+        this.retryPeriod = url.getParameter(REGISTRY_RETRY_PERIOD_KEY, DEFAULT_REGISTRY_RETRY_PERIOD);\r\n+        this.retryTimes = url.getParameter(REGISTRY_RETRY_TIMES_KEY, DEFAULT_REGISTRY_RETRY_TIMES);\r\n+    }\r\n+\r\n+    public void cancel() {\r\n+        cancel = true;\r\n+    }\r\n+\r\n+    public boolean isCancel() {\r\n+        return cancel;\r\n+    }\r\n+\r\n+    protected void reput(Timeout timeout, long tick) {\r\n+        if (timeout == null) {\r\n+            throw new IllegalArgumentException();\r\n+        }\r\n+\r\n+        Timer timer = timeout.timer();\r\n+        if (timer.isStop() || timeout.isCancelled() || isCancel()) {\r\n+            return;\r\n+        }\r\n+        times++;\r\n+        timer.newTimeout(timeout.task(), tick, TimeUnit.MILLISECONDS);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void run(Timeout timeout) throws Exception {\r\n+        if (timeout.isCancelled() || timeout.timer().isStop() || isCancel()) {\r\n+            // other thread cancel this timeout or stop the timer.\r\n+            return;\r\n+        }\r\n+        if (times > retryTimes) {\r\n+            // reach the most times of retry.\r\n+            logger.warn(\"Final failed to execute task \" + taskName + \", url: \" + url + \", retry \" + retryTimes + \" times.\");\r\n+            return;\r\n+        }\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(taskName + \" : \" + url);\r\n+        }\r\n+        try {\r\n+            doRetry(url, registry, timeout);\r\n+        } catch (Throwable t) { // Ignore all the exceptions and wait for the next retry\r\n+            logger.warn(\"Failed to execute task \" + taskName + \", url: \" + url + \", waiting for again, cause:\" + t.getMessage(), t);\r\n+            // reput this task when catch exception.\r\n+            reput(timeout, retryPeriod);\r\n+        }\r\n+    }\r\n+\r\n+    protected abstract void doRetry(URL url, FailbackRegistry registry, Timeout timeout);\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/retry/ReExportTask.java", "source2": "org/apache/dubbo/registry/retry/ReExportTask.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,41 +1,41 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.retry;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.timer.Timeout;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-/**\n- *\n- */\n-public class ReExportTask extends AbstractRetryTask {\n-\n-    private static final String NAME = \"retry re-export\";\n-\n-    private Runnable runnable;\n-\n-    public ReExportTask(Runnable runnable, URL oldUrl, FailbackRegistry registry) {\n-        super(oldUrl, registry, NAME);\n-        this.runnable = runnable;\n-    }\n-\n-    @Override\n-    protected void doRetry(URL oldUrl, FailbackRegistry registry, Timeout timeout) {\n-        runnable.run();\n-    }\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.retry;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.timer.Timeout;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+/**\r\n+ *\r\n+ */\r\n+public class ReExportTask extends AbstractRetryTask {\r\n+\r\n+    private static final String NAME = \"retry re-export\";\r\n+\r\n+    private Runnable runnable;\r\n+\r\n+    public ReExportTask(Runnable runnable, URL oldUrl, FailbackRegistry registry) {\r\n+        super(oldUrl, registry, NAME);\r\n+        this.runnable = runnable;\r\n+    }\r\n+\r\n+    @Override\r\n+    protected void doRetry(URL oldUrl, FailbackRegistry registry, Timeout timeout) {\r\n+        runnable.run();\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory\n+service-discovery-registry=org.apache.dubbo.registry.client.ServiceDiscoveryRegistryFactory\r\n wrapper=org.apache.dubbo.registry.RegistryFactoryWrapper\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceInstanceCustomizer", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,6 +1,6 @@\n-metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer\n-exported-revision=org.apache.dubbo.registry.client.metadata.ExportedServicesRevisionMetadataCustomizer\n-subscribed-revision=org.apache.dubbo.registry.client.metadata.SubscribedServicesRevisionMetadataCustomizer\n-protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer\n-instance-port=org.apache.dubbo.config.metadata.ServiceInstancePortCustomizer\n-instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer\n+metadata-url=org.apache.dubbo.registry.client.metadata.MetadataServiceURLParamsMetadataCustomizer\r\n+exported-revision=org.apache.dubbo.registry.client.metadata.ExportedServicesRevisionMetadataCustomizer\r\n+subscribed-revision=org.apache.dubbo.registry.client.metadata.SubscribedServicesRevisionMetadataCustomizer\r\n+protocol-ports=org.apache.dubbo.registry.client.metadata.ProtocolPortsMetadataCustomizer\r\n+instance-port=org.apache.dubbo.config.metadata.ServiceInstancePortCustomizer\r\n+instance-metadata=org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataCustomizer\r\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder", "source2": "META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-standard=org.apache.dubbo.registry.client.metadata.StandardMetadataServiceURLBuilder\n+standard=org.apache.dubbo.registry.client.metadata.StandardMetadataServiceURLBuilder\r\n spring-cloud=org.apache.dubbo.registry.client.metadata.SpringCloudMetadataServiceURLBuilder\n"}, {"source1": "META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol", "source2": "META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,2 +1,2 @@\n-registry=org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol\n+registry=org.apache.dubbo.registry.integration.InterfaceCompatibleRegistryProtocol\r\n service-discovery-registry=org.apache.dubbo.registry.integration.RegistryProtocol\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-api/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -50,20 +50,20 @@\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-container-api</artifactId>\n       <version>${project.parent.version}</version>\n       <exclusions>\n         <exclusion>\n-          <artifactId>jetty-server</artifactId>\n           <groupId>org.eclipse.jetty</groupId>\n+          <artifactId>jetty-server</artifactId>\n         </exclusion>\n         <exclusion>\n-          <artifactId>jetty-servlet</artifactId>\n           <groupId>org.eclipse.jetty</groupId>\n+          <artifactId>jetty-servlet</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-metadata-api</artifactId>\n       <version>${project.parent.version}</version>\n"}]}]}
