{"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: 16119 bytes, number of entries: 21\n+Zip file size: 16155 bytes, number of entries: 21\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/eureka/\n@@ -10,14 +10,14 @@\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-eureka/\n -rw-r--r--  2.0 unx    14351 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      178 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx     9897 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/ConfigurableEurekaInstanceConfig.java\n--rw-r--r--  2.0 unx    11128 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java\n--rw-r--r--  2.0 unx      943 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/package-info.java\n+-rw-r--r--  2.0 unx    10266 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/ConfigurableEurekaInstanceConfig.java\n+-rw-r--r--  2.0 unx    11409 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java\n+-rw-r--r--  2.0 unx      965 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/eureka/package-info.java\n -rw-r--r--  2.0 unx       62 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n--rw-r--r--  2.0 unx     3013 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml\n+-rw-r--r--  2.0 unx     2934 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml\n -rw-r--r--  2.0 unx       76 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.properties\n-21 files, 51070 bytes uncompressed, 13113 bytes compressed:  74.3%\n+21 files, 51663 bytes uncompressed, 13149 bytes compressed:  74.5%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -281,796 +281,796 @@\n 1DFE Extract Zip Spec      14 (20) '2.0'\n 1DFF Extract OS            00 (0) 'MS-DOS'\n 1E00 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 1E02 Compression Method    0008 (8) 'Deflated'\n 1E04 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-1E08 CRC                   CF5D6816 (3479005206)\n-1E0C Compressed Size       000006D9 (1753)\n-1E10 Uncompressed Size     000026A9 (9897)\n+1E08 CRC                   74817B02 (1954642690)\n+1E0C Compressed Size       000006E9 (1769)\n+1E10 Uncompressed Size     0000281A (10266)\n 1E14 Filename Length       0046 (70)\n 1E16 Extra Length          0000 (0)\n 1E18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x1E18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 1E5E PAYLOAD\n \n-2537 LOCAL HEADER #17      04034B50 (67324752)\n-253B Extract Zip Spec      14 (20) '2.0'\n-253C Extract OS            00 (0) 'MS-DOS'\n-253D General Purpose Flag  0800 (2048)\n+2547 LOCAL HEADER #17      04034B50 (67324752)\n+254B Extract Zip Spec      14 (20) '2.0'\n+254C Extract OS            00 (0) 'MS-DOS'\n+254D General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-253F Compression Method    0008 (8) 'Deflated'\n-2541 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2545 CRC                   4F723C34 (1332886580)\n-2549 Compressed Size       00000AD8 (2776)\n-254D Uncompressed Size     00002B78 (11128)\n-2551 Filename Length       003C (60)\n-2553 Extra Length          0000 (0)\n-2555 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+254F Compression Method    0008 (8) 'Deflated'\n+2551 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2555 CRC                   8BDBBEA7 (2346434215)\n+2559 Compressed Size       00000AE8 (2792)\n+255D Uncompressed Size     00002C91 (11409)\n+2561 Filename Length       003C (60)\n+2563 Extra Length          0000 (0)\n+2565 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2555: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2565: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2591 PAYLOAD\n+25A1 PAYLOAD\n \n-3069 LOCAL HEADER #18      04034B50 (67324752)\n-306D Extract Zip Spec      14 (20) '2.0'\n-306E Extract OS            00 (0) 'MS-DOS'\n-306F General Purpose Flag  0800 (2048)\n+3089 LOCAL HEADER #18      04034B50 (67324752)\n+308D Extract Zip Spec      14 (20) '2.0'\n+308E Extract OS            00 (0) 'MS-DOS'\n+308F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3071 Compression Method    0008 (8) 'Deflated'\n-3073 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3077 CRC                   71DE9B6F (1910414191)\n-307B Compressed Size       0000020C (524)\n-307F Uncompressed Size     000003AF (943)\n-3083 Filename Length       0032 (50)\n-3085 Extra Length          0000 (0)\n-3087 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3091 Compression Method    0008 (8) 'Deflated'\n+3093 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3097 CRC                   B1C6B8A4 (2982590628)\n+309B Compressed Size       00000214 (532)\n+309F Uncompressed Size     000003C5 (965)\n+30A3 Filename Length       0032 (50)\n+30A5 Extra Length          0000 (0)\n+30A7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3087: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x30A7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-30B9 PAYLOAD\n+30D9 PAYLOAD\n \n-32C5 LOCAL HEADER #19      04034B50 (67324752)\n-32C9 Extract Zip Spec      14 (20) '2.0'\n-32CA Extract OS            00 (0) 'MS-DOS'\n-32CB General Purpose Flag  0800 (2048)\n+32ED LOCAL HEADER #19      04034B50 (67324752)\n+32F1 Extract Zip Spec      14 (20) '2.0'\n+32F2 Extract OS            00 (0) 'MS-DOS'\n+32F3 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-32CD Compression Method    0008 (8) 'Deflated'\n-32CF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-32D3 CRC                   5B4B50C0 (1531662528)\n-32D7 Compressed Size       00000039 (57)\n-32DB Uncompressed Size     0000003E (62)\n-32DF Filename Length       0049 (73)\n-32E1 Extra Length          0000 (0)\n-32E3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+32F5 Compression Method    0008 (8) 'Deflated'\n+32F7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+32FB CRC                   5B4B50C0 (1531662528)\n+32FF Compressed Size       00000039 (57)\n+3303 Uncompressed Size     0000003E (62)\n+3307 Filename Length       0049 (73)\n+3309 Extra Length          0000 (0)\n+330B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x32E3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x330B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-332C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3354 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3365 LOCAL HEADER #20      04034B50 (67324752)\n-3369 Extract Zip Spec      14 (20) '2.0'\n-336A Extract OS            00 (0) 'MS-DOS'\n-336B General Purpose Flag  0800 (2048)\n+338D LOCAL HEADER #20      04034B50 (67324752)\n+3391 Extract Zip Spec      14 (20) '2.0'\n+3392 Extract OS            00 (0) 'MS-DOS'\n+3393 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-336D Compression Method    0008 (8) 'Deflated'\n-336F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3373 CRC                   06F60447 (116786247)\n-3377 Compressed Size       000003F9 (1017)\n-337B Uncompressed Size     00000BC5 (3013)\n-337F Filename Length       003D (61)\n-3381 Extra Length          0000 (0)\n-3383 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3395 Compression Method    0008 (8) 'Deflated'\n+3397 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+339B CRC                   26CC786B (650934379)\n+339F Compressed Size       000003F5 (1013)\n+33A3 Uncompressed Size     00000B76 (2934)\n+33A7 Filename Length       003D (61)\n+33A9 Extra Length          0000 (0)\n+33AB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3383: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x33AB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-33C0 PAYLOAD\n+33E8 PAYLOAD\n \n-37B9 LOCAL HEADER #21      04034B50 (67324752)\n-37BD Extract Zip Spec      14 (20) '2.0'\n-37BE Extract OS            00 (0) 'MS-DOS'\n-37BF General Purpose Flag  0800 (2048)\n+37DD LOCAL HEADER #21      04034B50 (67324752)\n+37E1 Extract Zip Spec      14 (20) '2.0'\n+37E2 Extract OS            00 (0) 'MS-DOS'\n+37E3 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-37C1 Compression Method    0008 (8) 'Deflated'\n-37C3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-37C7 CRC                   39E2F889 (971176073)\n-37CB Compressed Size       0000004A (74)\n-37CF Uncompressed Size     0000004C (76)\n-37D3 Filename Length       0044 (68)\n-37D5 Extra Length          0000 (0)\n-37D7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+37E5 Compression Method    0008 (8) 'Deflated'\n+37E7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+37EB CRC                   39E2F889 (971176073)\n+37EF Compressed Size       0000004A (74)\n+37F3 Uncompressed Size     0000004C (76)\n+37F7 Filename Length       0044 (68)\n+37F9 Extra Length          0000 (0)\n+37FB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x37D7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x37FB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-381B PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+383F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3865 CENTRAL HEADER #1     02014B50 (33639248)\n-3869 Created Zip Spec      14 (20) '2.0'\n-386A Created OS            03 (3) 'Unix'\n-386B Extract Zip Spec      14 (20) '2.0'\n-386C Extract OS            00 (0) 'MS-DOS'\n-386D General Purpose Flag  0800 (2048)\n+3889 CENTRAL HEADER #1     02014B50 (33639248)\n+388D Created Zip Spec      14 (20) '2.0'\n+388E Created OS            03 (3) 'Unix'\n+388F Extract Zip Spec      14 (20) '2.0'\n+3890 Extract OS            00 (0) 'MS-DOS'\n+3891 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-386F Compression Method    0008 (8) 'Deflated'\n-3871 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3875 CRC                   A689EB18 (2794056472)\n-3879 Compressed Size       00000042 (66)\n-387D Uncompressed Size     00000040 (64)\n-3881 Filename Length       0014 (20)\n-3883 Extra Length          0000 (0)\n-3885 Comment Length        0000 (0)\n-3887 Disk Start            0000 (0)\n-3889 Int File Attributes   0000 (0)\n+3893 Compression Method    0008 (8) 'Deflated'\n+3895 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3899 CRC                   A689EB18 (2794056472)\n+389D Compressed Size       00000042 (66)\n+38A1 Uncompressed Size     00000040 (64)\n+38A5 Filename Length       0014 (20)\n+38A7 Extra Length          0000 (0)\n+38A9 Comment Length        0000 (0)\n+38AB Disk Start            0000 (0)\n+38AD Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-388B Ext File Attributes   81A40000 (2175008768)\n+38AF 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-388F Local Header Offset   00000000 (0)\n-3893 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+38B3 Local Header Offset   00000000 (0)\n+38B7 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3893: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x38B7: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-38A7 CENTRAL HEADER #2     02014B50 (33639248)\n-38AB Created Zip Spec      14 (20) '2.0'\n-38AC Created OS            03 (3) 'Unix'\n-38AD Extract Zip Spec      0A (10) '1.0'\n-38AE Extract OS            00 (0) 'MS-DOS'\n-38AF General Purpose Flag  0800 (2048)\n+38CB CENTRAL HEADER #2     02014B50 (33639248)\n+38CF Created Zip Spec      14 (20) '2.0'\n+38D0 Created OS            03 (3) 'Unix'\n+38D1 Extract Zip Spec      0A (10) '1.0'\n+38D2 Extract OS            00 (0) 'MS-DOS'\n+38D3 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-38B1 Compression Method    0000 (0) 'Stored'\n-38B3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-38B7 CRC                   00000000 (0)\n-38BB Compressed Size       00000000 (0)\n-38BF Uncompressed Size     00000000 (0)\n-38C3 Filename Length       0009 (9)\n-38C5 Extra Length          0000 (0)\n-38C7 Comment Length        0000 (0)\n-38C9 Disk Start            0000 (0)\n-38CB Int File Attributes   0000 (0)\n+38D5 Compression Method    0000 (0) 'Stored'\n+38D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+38DB CRC                   00000000 (0)\n+38DF Compressed Size       00000000 (0)\n+38E3 Uncompressed Size     00000000 (0)\n+38E7 Filename Length       0009 (9)\n+38E9 Extra Length          0000 (0)\n+38EB Comment Length        0000 (0)\n+38ED Disk Start            0000 (0)\n+38EF Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-38CD Ext File Attributes   41ED0010 (1106051088)\n+38F1 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-38D1 Local Header Offset   00000074 (116)\n-38D5 Filename              'XXXXXXXXX'\n+38F5 Local Header Offset   00000074 (116)\n+38F9 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x38D5: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x38F9: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x38D5: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x38F9: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x38AD: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x38D1: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-38DE CENTRAL HEADER #3     02014B50 (33639248)\n-38E2 Created Zip Spec      14 (20) '2.0'\n-38E3 Created OS            03 (3) 'Unix'\n-38E4 Extract Zip Spec      0A (10) '1.0'\n-38E5 Extract OS            00 (0) 'MS-DOS'\n-38E6 General Purpose Flag  0800 (2048)\n+3902 CENTRAL HEADER #3     02014B50 (33639248)\n+3906 Created Zip Spec      14 (20) '2.0'\n+3907 Created OS            03 (3) 'Unix'\n+3908 Extract Zip Spec      0A (10) '1.0'\n+3909 Extract OS            00 (0) 'MS-DOS'\n+390A General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-38E8 Compression Method    0000 (0) 'Stored'\n-38EA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-38EE CRC                   00000000 (0)\n-38F2 Compressed Size       00000000 (0)\n-38F6 Uncompressed Size     00000000 (0)\n-38FA Filename Length       0004 (4)\n-38FC Extra Length          0000 (0)\n-38FE Comment Length        0000 (0)\n-3900 Disk Start            0000 (0)\n-3902 Int File Attributes   0000 (0)\n+390C Compression Method    0000 (0) 'Stored'\n+390E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3912 CRC                   00000000 (0)\n+3916 Compressed Size       00000000 (0)\n+391A Uncompressed Size     00000000 (0)\n+391E Filename Length       0004 (4)\n+3920 Extra Length          0000 (0)\n+3922 Comment Length        0000 (0)\n+3924 Disk Start            0000 (0)\n+3926 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3904 Ext File Attributes   41ED0010 (1106051088)\n+3928 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-3908 Local Header Offset   0000009B (155)\n-390C Filename              'XXXX'\n+392C Local Header Offset   0000009B (155)\n+3930 Filename              'XXXX'\n #\n-# WARNING: Offset 0x390C: Filename 'XXXX'\n+# WARNING: Offset 0x3930: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x390C: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x3930: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x38E4: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x3908: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-3910 CENTRAL HEADER #4     02014B50 (33639248)\n-3914 Created Zip Spec      14 (20) '2.0'\n-3915 Created OS            03 (3) 'Unix'\n-3916 Extract Zip Spec      0A (10) '1.0'\n-3917 Extract OS            00 (0) 'MS-DOS'\n-3918 General Purpose Flag  0800 (2048)\n+3934 CENTRAL HEADER #4     02014B50 (33639248)\n+3938 Created Zip Spec      14 (20) '2.0'\n+3939 Created OS            03 (3) 'Unix'\n+393A Extract Zip Spec      0A (10) '1.0'\n+393B Extract OS            00 (0) 'MS-DOS'\n+393C General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-391A Compression Method    0000 (0) 'Stored'\n-391C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3920 CRC                   00000000 (0)\n-3924 Compressed Size       00000000 (0)\n-3928 Uncompressed Size     00000000 (0)\n-392C Filename Length       000B (11)\n-392E Extra Length          0000 (0)\n-3930 Comment Length        0000 (0)\n-3932 Disk Start            0000 (0)\n-3934 Int File Attributes   0000 (0)\n+393E Compression Method    0000 (0) 'Stored'\n+3940 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3944 CRC                   00000000 (0)\n+3948 Compressed Size       00000000 (0)\n+394C Uncompressed Size     00000000 (0)\n+3950 Filename Length       000B (11)\n+3952 Extra Length          0000 (0)\n+3954 Comment Length        0000 (0)\n+3956 Disk Start            0000 (0)\n+3958 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3936 Ext File Attributes   41ED0010 (1106051088)\n+395A 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-393A Local Header Offset   000000BD (189)\n-393E Filename              'XXXXXXXXXXX'\n+395E Local Header Offset   000000BD (189)\n+3962 Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x393E: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x3962: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x393E: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3962: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3916: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x393A: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-3949 CENTRAL HEADER #5     02014B50 (33639248)\n-394D Created Zip Spec      14 (20) '2.0'\n-394E Created OS            03 (3) 'Unix'\n-394F Extract Zip Spec      0A (10) '1.0'\n-3950 Extract OS            00 (0) 'MS-DOS'\n-3951 General Purpose Flag  0800 (2048)\n+396D CENTRAL HEADER #5     02014B50 (33639248)\n+3971 Created Zip Spec      14 (20) '2.0'\n+3972 Created OS            03 (3) 'Unix'\n+3973 Extract Zip Spec      0A (10) '1.0'\n+3974 Extract OS            00 (0) 'MS-DOS'\n+3975 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3953 Compression Method    0000 (0) 'Stored'\n-3955 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3959 CRC                   00000000 (0)\n-395D Compressed Size       00000000 (0)\n-3961 Uncompressed Size     00000000 (0)\n-3965 Filename Length       0011 (17)\n-3967 Extra Length          0000 (0)\n-3969 Comment Length        0000 (0)\n-396B Disk Start            0000 (0)\n-396D Int File Attributes   0000 (0)\n+3977 Compression Method    0000 (0) 'Stored'\n+3979 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+397D CRC                   00000000 (0)\n+3981 Compressed Size       00000000 (0)\n+3985 Uncompressed Size     00000000 (0)\n+3989 Filename Length       0011 (17)\n+398B Extra Length          0000 (0)\n+398D Comment Length        0000 (0)\n+398F Disk Start            0000 (0)\n+3991 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-396F Ext File Attributes   41ED0010 (1106051088)\n+3993 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-3973 Local Header Offset   000000E6 (230)\n-3977 Filename              'XXXXXXXXXXXXXXXXX'\n+3997 Local Header Offset   000000E6 (230)\n+399B Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3977: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x399B: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3977: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x399B: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x394F: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3973: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-3988 CENTRAL HEADER #6     02014B50 (33639248)\n-398C Created Zip Spec      14 (20) '2.0'\n-398D Created OS            03 (3) 'Unix'\n-398E Extract Zip Spec      0A (10) '1.0'\n-398F Extract OS            00 (0) 'MS-DOS'\n-3990 General Purpose Flag  0800 (2048)\n+39AC CENTRAL HEADER #6     02014B50 (33639248)\n+39B0 Created Zip Spec      14 (20) '2.0'\n+39B1 Created OS            03 (3) 'Unix'\n+39B2 Extract Zip Spec      0A (10) '1.0'\n+39B3 Extract OS            00 (0) 'MS-DOS'\n+39B4 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3992 Compression Method    0000 (0) 'Stored'\n-3994 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3998 CRC                   00000000 (0)\n-399C Compressed Size       00000000 (0)\n-39A0 Uncompressed Size     00000000 (0)\n-39A4 Filename Length       001A (26)\n-39A6 Extra Length          0000 (0)\n-39A8 Comment Length        0000 (0)\n-39AA Disk Start            0000 (0)\n-39AC Int File Attributes   0000 (0)\n+39B6 Compression Method    0000 (0) 'Stored'\n+39B8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+39BC CRC                   00000000 (0)\n+39C0 Compressed Size       00000000 (0)\n+39C4 Uncompressed Size     00000000 (0)\n+39C8 Filename Length       001A (26)\n+39CA Extra Length          0000 (0)\n+39CC Comment Length        0000 (0)\n+39CE Disk Start            0000 (0)\n+39D0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-39AE Ext File Attributes   41ED0010 (1106051088)\n+39D2 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-39B2 Local Header Offset   00000115 (277)\n-39B6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+39D6 Local Header Offset   00000115 (277)\n+39DA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x39B6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39DA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x39B6: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x39DA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x398E: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39B2: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-39D0 CENTRAL HEADER #7     02014B50 (33639248)\n-39D4 Created Zip Spec      14 (20) '2.0'\n-39D5 Created OS            03 (3) 'Unix'\n-39D6 Extract Zip Spec      0A (10) '1.0'\n-39D7 Extract OS            00 (0) 'MS-DOS'\n-39D8 General Purpose Flag  0800 (2048)\n+39F4 CENTRAL HEADER #7     02014B50 (33639248)\n+39F8 Created Zip Spec      14 (20) '2.0'\n+39F9 Created OS            03 (3) 'Unix'\n+39FA Extract Zip Spec      0A (10) '1.0'\n+39FB Extract OS            00 (0) 'MS-DOS'\n+39FC General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-39DA Compression Method    0000 (0) 'Stored'\n-39DC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-39E0 CRC                   00000000 (0)\n-39E4 Compressed Size       00000000 (0)\n-39E8 Uncompressed Size     00000000 (0)\n-39EC Filename Length       0021 (33)\n-39EE Extra Length          0000 (0)\n-39F0 Comment Length        0000 (0)\n-39F2 Disk Start            0000 (0)\n-39F4 Int File Attributes   0000 (0)\n+39FE Compression Method    0000 (0) 'Stored'\n+3A00 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A04 CRC                   00000000 (0)\n+3A08 Compressed Size       00000000 (0)\n+3A0C Uncompressed Size     00000000 (0)\n+3A10 Filename Length       0021 (33)\n+3A12 Extra Length          0000 (0)\n+3A14 Comment Length        0000 (0)\n+3A16 Disk Start            0000 (0)\n+3A18 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-39F6 Ext File Attributes   41ED0010 (1106051088)\n+3A1A 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-39FA Local Header Offset   0000014D (333)\n-39FE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3A1E Local Header Offset   0000014D (333)\n+3A22 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x39FE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A22: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x39FE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3A22: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x39D6: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x39FA: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3A1F CENTRAL HEADER #8     02014B50 (33639248)\n-3A23 Created Zip Spec      14 (20) '2.0'\n-3A24 Created OS            03 (3) 'Unix'\n-3A25 Extract Zip Spec      0A (10) '1.0'\n-3A26 Extract OS            00 (0) 'MS-DOS'\n-3A27 General Purpose Flag  0800 (2048)\n+3A43 CENTRAL HEADER #8     02014B50 (33639248)\n+3A47 Created Zip Spec      14 (20) '2.0'\n+3A48 Created OS            03 (3) 'Unix'\n+3A49 Extract Zip Spec      0A (10) '1.0'\n+3A4A Extract OS            00 (0) 'MS-DOS'\n+3A4B General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3A29 Compression Method    0000 (0) 'Stored'\n-3A2B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A2F CRC                   00000000 (0)\n-3A33 Compressed Size       00000000 (0)\n-3A37 Uncompressed Size     00000000 (0)\n-3A3B Filename Length       000F (15)\n-3A3D Extra Length          0000 (0)\n-3A3F Comment Length        0000 (0)\n-3A41 Disk Start            0000 (0)\n-3A43 Int File Attributes   0000 (0)\n+3A4D Compression Method    0000 (0) 'Stored'\n+3A4F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A53 CRC                   00000000 (0)\n+3A57 Compressed Size       00000000 (0)\n+3A5B Uncompressed Size     00000000 (0)\n+3A5F Filename Length       000F (15)\n+3A61 Extra Length          0000 (0)\n+3A63 Comment Length        0000 (0)\n+3A65 Disk Start            0000 (0)\n+3A67 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3A45 Ext File Attributes   41ED0010 (1106051088)\n+3A69 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-3A49 Local Header Offset   0000018C (396)\n-3A4D Filename              'XXXXXXXXXXXXXXX'\n+3A6D Local Header Offset   0000018C (396)\n+3A71 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A4D: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A71: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3A4D: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3A71: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3A25: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A49: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-3A5C CENTRAL HEADER #9     02014B50 (33639248)\n-3A60 Created Zip Spec      14 (20) '2.0'\n-3A61 Created OS            03 (3) 'Unix'\n-3A62 Extract Zip Spec      0A (10) '1.0'\n-3A63 Extract OS            00 (0) 'MS-DOS'\n-3A64 General Purpose Flag  0800 (2048)\n+3A80 CENTRAL HEADER #9     02014B50 (33639248)\n+3A84 Created Zip Spec      14 (20) '2.0'\n+3A85 Created OS            03 (3) 'Unix'\n+3A86 Extract Zip Spec      0A (10) '1.0'\n+3A87 Extract OS            00 (0) 'MS-DOS'\n+3A88 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3A66 Compression Method    0000 (0) 'Stored'\n-3A68 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A6C CRC                   00000000 (0)\n-3A70 Compressed Size       00000000 (0)\n-3A74 Uncompressed Size     00000000 (0)\n-3A78 Filename Length       0018 (24)\n-3A7A Extra Length          0000 (0)\n-3A7C Comment Length        0000 (0)\n-3A7E Disk Start            0000 (0)\n-3A80 Int File Attributes   0000 (0)\n+3A8A Compression Method    0000 (0) 'Stored'\n+3A8C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A90 CRC                   00000000 (0)\n+3A94 Compressed Size       00000000 (0)\n+3A98 Uncompressed Size     00000000 (0)\n+3A9C Filename Length       0018 (24)\n+3A9E Extra Length          0000 (0)\n+3AA0 Comment Length        0000 (0)\n+3AA2 Disk Start            0000 (0)\n+3AA4 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3A82 Ext File Attributes   41ED0010 (1106051088)\n+3AA6 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-3A86 Local Header Offset   000001B9 (441)\n-3A8A Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+3AAA Local Header Offset   000001B9 (441)\n+3AAE Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A8A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AAE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3A8A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3AAE: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3A62: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A86: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3AA2 CENTRAL HEADER #10    02014B50 (33639248)\n-3AA6 Created Zip Spec      14 (20) '2.0'\n-3AA7 Created OS            03 (3) 'Unix'\n-3AA8 Extract Zip Spec      0A (10) '1.0'\n-3AA9 Extract OS            00 (0) 'MS-DOS'\n-3AAA General Purpose Flag  0800 (2048)\n+3AC6 CENTRAL HEADER #10    02014B50 (33639248)\n+3ACA Created Zip Spec      14 (20) '2.0'\n+3ACB Created OS            03 (3) 'Unix'\n+3ACC Extract Zip Spec      0A (10) '1.0'\n+3ACD Extract OS            00 (0) 'MS-DOS'\n+3ACE General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3AAC Compression Method    0000 (0) 'Stored'\n-3AAE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3AB2 CRC                   00000000 (0)\n-3AB6 Compressed Size       00000000 (0)\n-3ABA Uncompressed Size     00000000 (0)\n-3ABE Filename Length       000F (15)\n-3AC0 Extra Length          0000 (0)\n-3AC2 Comment Length        0000 (0)\n-3AC4 Disk Start            0000 (0)\n-3AC6 Int File Attributes   0000 (0)\n+3AD0 Compression Method    0000 (0) 'Stored'\n+3AD2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3AD6 CRC                   00000000 (0)\n+3ADA Compressed Size       00000000 (0)\n+3ADE Uncompressed Size     00000000 (0)\n+3AE2 Filename Length       000F (15)\n+3AE4 Extra Length          0000 (0)\n+3AE6 Comment Length        0000 (0)\n+3AE8 Disk Start            0000 (0)\n+3AEA Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3AC8 Ext File Attributes   41ED0010 (1106051088)\n+3AEC 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-3ACC Local Header Offset   000001EF (495)\n-3AD0 Filename              'XXXXXXXXXXXXXXX'\n+3AF0 Local Header Offset   000001EF (495)\n+3AF4 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3AD0: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AF4: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3AD0: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3AF4: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3AA8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3ACC: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-3ADF CENTRAL HEADER #11    02014B50 (33639248)\n-3AE3 Created Zip Spec      14 (20) '2.0'\n-3AE4 Created OS            03 (3) 'Unix'\n-3AE5 Extract Zip Spec      0A (10) '1.0'\n-3AE6 Extract OS            00 (0) 'MS-DOS'\n-3AE7 General Purpose Flag  0800 (2048)\n+3B03 CENTRAL HEADER #11    02014B50 (33639248)\n+3B07 Created Zip Spec      14 (20) '2.0'\n+3B08 Created OS            03 (3) 'Unix'\n+3B09 Extract Zip Spec      0A (10) '1.0'\n+3B0A Extract OS            00 (0) 'MS-DOS'\n+3B0B General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3AE9 Compression Method    0000 (0) 'Stored'\n-3AEB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3AEF CRC                   00000000 (0)\n-3AF3 Compressed Size       00000000 (0)\n-3AF7 Uncompressed Size     00000000 (0)\n-3AFB Filename Length       0020 (32)\n-3AFD Extra Length          0000 (0)\n-3AFF Comment Length        0000 (0)\n-3B01 Disk Start            0000 (0)\n-3B03 Int File Attributes   0000 (0)\n+3B0D Compression Method    0000 (0) 'Stored'\n+3B0F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B13 CRC                   00000000 (0)\n+3B17 Compressed Size       00000000 (0)\n+3B1B Uncompressed Size     00000000 (0)\n+3B1F Filename Length       0020 (32)\n+3B21 Extra Length          0000 (0)\n+3B23 Comment Length        0000 (0)\n+3B25 Disk Start            0000 (0)\n+3B27 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3B05 Ext File Attributes   41ED0010 (1106051088)\n+3B29 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-3B09 Local Header Offset   0000021C (540)\n-3B0D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3B2D Local Header Offset   0000021C (540)\n+3B31 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B0D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B31: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3B0D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3B31: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3AE5: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B09: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3B2D CENTRAL HEADER #12    02014B50 (33639248)\n-3B31 Created Zip Spec      14 (20) '2.0'\n-3B32 Created OS            03 (3) 'Unix'\n-3B33 Extract Zip Spec      0A (10) '1.0'\n-3B34 Extract OS            00 (0) 'MS-DOS'\n-3B35 General Purpose Flag  0800 (2048)\n+3B51 CENTRAL HEADER #12    02014B50 (33639248)\n+3B55 Created Zip Spec      14 (20) '2.0'\n+3B56 Created OS            03 (3) 'Unix'\n+3B57 Extract Zip Spec      0A (10) '1.0'\n+3B58 Extract OS            00 (0) 'MS-DOS'\n+3B59 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n-3B37 Compression Method    0000 (0) 'Stored'\n-3B39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B3D CRC                   00000000 (0)\n-3B41 Compressed Size       00000000 (0)\n-3B45 Uncompressed Size     00000000 (0)\n-3B49 Filename Length       0036 (54)\n-3B4B Extra Length          0000 (0)\n-3B4D Comment Length        0000 (0)\n-3B4F Disk Start            0000 (0)\n-3B51 Int File Attributes   0000 (0)\n+3B5B Compression Method    0000 (0) 'Stored'\n+3B5D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B61 CRC                   00000000 (0)\n+3B65 Compressed Size       00000000 (0)\n+3B69 Uncompressed Size     00000000 (0)\n+3B6D Filename Length       0036 (54)\n+3B6F Extra Length          0000 (0)\n+3B71 Comment Length        0000 (0)\n+3B73 Disk Start            0000 (0)\n+3B75 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3B53 Ext File Attributes   41ED0010 (1106051088)\n+3B77 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-3B57 Local Header Offset   0000025A (602)\n-3B5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3B7B Local Header Offset   0000025A (602)\n+3B7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x3B5B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x3B7F: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x3B33: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B57: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-3B91 CENTRAL HEADER #13    02014B50 (33639248)\n-3B95 Created Zip Spec      14 (20) '2.0'\n-3B96 Created OS            03 (3) 'Unix'\n-3B97 Extract Zip Spec      14 (20) '2.0'\n-3B98 Extract OS            00 (0) 'MS-DOS'\n-3B99 General Purpose Flag  0800 (2048)\n+3BB5 CENTRAL HEADER #13    02014B50 (33639248)\n+3BB9 Created Zip Spec      14 (20) '2.0'\n+3BBA Created OS            03 (3) 'Unix'\n+3BBB Extract Zip Spec      14 (20) '2.0'\n+3BBC Extract OS            00 (0) 'MS-DOS'\n+3BBD General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3B9B Compression Method    0008 (8) 'Deflated'\n-3B9D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BA1 CRC                   1C9ADC07 (479910919)\n-3BA5 Compressed Size       00000ACF (2767)\n-3BA9 Uncompressed Size     0000380F (14351)\n-3BAD Filename Length       0015 (21)\n-3BAF Extra Length          0000 (0)\n-3BB1 Comment Length        0000 (0)\n-3BB3 Disk Start            0000 (0)\n-3BB5 Int File Attributes   0000 (0)\n+3BBF Compression Method    0008 (8) 'Deflated'\n+3BC1 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3BC5 CRC                   1C9ADC07 (479910919)\n+3BC9 Compressed Size       00000ACF (2767)\n+3BCD Uncompressed Size     0000380F (14351)\n+3BD1 Filename Length       0015 (21)\n+3BD3 Extra Length          0000 (0)\n+3BD5 Comment Length        0000 (0)\n+3BD7 Disk Start            0000 (0)\n+3BD9 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3BB7 Ext File Attributes   81A40000 (2175008768)\n+3BDB 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-3BBB Local Header Offset   000002AE (686)\n-3BBF Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+3BDF Local Header Offset   000002AE (686)\n+3BE3 Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BBF: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3BE3: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3BD4 CENTRAL HEADER #14    02014B50 (33639248)\n-3BD8 Created Zip Spec      14 (20) '2.0'\n-3BD9 Created OS            03 (3) 'Unix'\n-3BDA Extract Zip Spec      14 (20) '2.0'\n-3BDB Extract OS            00 (0) 'MS-DOS'\n-3BDC General Purpose Flag  0800 (2048)\n+3BF8 CENTRAL HEADER #14    02014B50 (33639248)\n+3BFC Created Zip Spec      14 (20) '2.0'\n+3BFD Created OS            03 (3) 'Unix'\n+3BFE Extract Zip Spec      14 (20) '2.0'\n+3BFF Extract OS            00 (0) 'MS-DOS'\n+3C00 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3BDE Compression Method    0008 (8) 'Deflated'\n-3BE0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BE4 CRC                   86E2B4B4 (2263004340)\n-3BE8 Compressed Size       00000F6D (3949)\n-3BEC Uncompressed Size     00002C5E (11358)\n-3BF0 Filename Length       0010 (16)\n-3BF2 Extra Length          0000 (0)\n-3BF4 Comment Length        0000 (0)\n-3BF6 Disk Start            0000 (0)\n-3BF8 Int File Attributes   0000 (0)\n+3C02 Compression Method    0008 (8) 'Deflated'\n+3C04 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C08 CRC                   86E2B4B4 (2263004340)\n+3C0C Compressed Size       00000F6D (3949)\n+3C10 Uncompressed Size     00002C5E (11358)\n+3C14 Filename Length       0010 (16)\n+3C16 Extra Length          0000 (0)\n+3C18 Comment Length        0000 (0)\n+3C1A Disk Start            0000 (0)\n+3C1C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3BFA Ext File Attributes   81A40000 (2175008768)\n+3C1E 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-3BFE Local Header Offset   00000DB0 (3504)\n-3C02 Filename              'XXXXXXXXXXXXXXXX'\n+3C22 Local Header Offset   00000DB0 (3504)\n+3C26 Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C02: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C26: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3C12 CENTRAL HEADER #15    02014B50 (33639248)\n-3C16 Created Zip Spec      14 (20) '2.0'\n-3C17 Created OS            03 (3) 'Unix'\n-3C18 Extract Zip Spec      14 (20) '2.0'\n-3C19 Extract OS            00 (0) 'MS-DOS'\n-3C1A General Purpose Flag  0800 (2048)\n+3C36 CENTRAL HEADER #15    02014B50 (33639248)\n+3C3A Created Zip Spec      14 (20) '2.0'\n+3C3B Created OS            03 (3) 'Unix'\n+3C3C Extract Zip Spec      14 (20) '2.0'\n+3C3D Extract OS            00 (0) 'MS-DOS'\n+3C3E General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3C1C Compression Method    0008 (8) 'Deflated'\n-3C1E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C22 CRC                   998AD9DC (2576013788)\n-3C26 Compressed Size       00000082 (130)\n-3C2A Uncompressed Size     000000B2 (178)\n-3C2E Filename Length       000F (15)\n-3C30 Extra Length          0000 (0)\n-3C32 Comment Length        0000 (0)\n-3C34 Disk Start            0000 (0)\n-3C36 Int File Attributes   0000 (0)\n+3C40 Compression Method    0008 (8) 'Deflated'\n+3C42 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C46 CRC                   998AD9DC (2576013788)\n+3C4A Compressed Size       00000082 (130)\n+3C4E Uncompressed Size     000000B2 (178)\n+3C52 Filename Length       000F (15)\n+3C54 Extra Length          0000 (0)\n+3C56 Comment Length        0000 (0)\n+3C58 Disk Start            0000 (0)\n+3C5A Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3C38 Ext File Attributes   81A40000 (2175008768)\n+3C5C 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-3C3C Local Header Offset   00001D4B (7499)\n-3C40 Filename              'XXXXXXXXXXXXXXX'\n+3C60 Local Header Offset   00001D4B (7499)\n+3C64 Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C40: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C64: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3C4F CENTRAL HEADER #16    02014B50 (33639248)\n-3C53 Created Zip Spec      14 (20) '2.0'\n-3C54 Created OS            03 (3) 'Unix'\n-3C55 Extract Zip Spec      14 (20) '2.0'\n-3C56 Extract OS            00 (0) 'MS-DOS'\n-3C57 General Purpose Flag  0800 (2048)\n+3C73 CENTRAL HEADER #16    02014B50 (33639248)\n+3C77 Created Zip Spec      14 (20) '2.0'\n+3C78 Created OS            03 (3) 'Unix'\n+3C79 Extract Zip Spec      14 (20) '2.0'\n+3C7A Extract OS            00 (0) 'MS-DOS'\n+3C7B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3C59 Compression Method    0008 (8) 'Deflated'\n-3C5B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3C5F CRC                   CF5D6816 (3479005206)\n-3C63 Compressed Size       000006D9 (1753)\n-3C67 Uncompressed Size     000026A9 (9897)\n-3C6B Filename Length       0046 (70)\n-3C6D Extra Length          0000 (0)\n-3C6F Comment Length        0000 (0)\n-3C71 Disk Start            0000 (0)\n-3C73 Int File Attributes   0000 (0)\n+3C7D Compression Method    0008 (8) 'Deflated'\n+3C7F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C83 CRC                   74817B02 (1954642690)\n+3C87 Compressed Size       000006E9 (1769)\n+3C8B Uncompressed Size     0000281A (10266)\n+3C8F Filename Length       0046 (70)\n+3C91 Extra Length          0000 (0)\n+3C93 Comment Length        0000 (0)\n+3C95 Disk Start            0000 (0)\n+3C97 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3C75 Ext File Attributes   81A40000 (2175008768)\n+3C99 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-3C79 Local Header Offset   00001DFA (7674)\n-3C7D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C9D Local Header Offset   00001DFA (7674)\n+3CA1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3C7D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3CA1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3CC3 CENTRAL HEADER #17    02014B50 (33639248)\n-3CC7 Created Zip Spec      14 (20) '2.0'\n-3CC8 Created OS            03 (3) 'Unix'\n-3CC9 Extract Zip Spec      14 (20) '2.0'\n-3CCA Extract OS            00 (0) 'MS-DOS'\n-3CCB General Purpose Flag  0800 (2048)\n+3CE7 CENTRAL HEADER #17    02014B50 (33639248)\n+3CEB Created Zip Spec      14 (20) '2.0'\n+3CEC Created OS            03 (3) 'Unix'\n+3CED Extract Zip Spec      14 (20) '2.0'\n+3CEE Extract OS            00 (0) 'MS-DOS'\n+3CEF General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3CCD Compression Method    0008 (8) 'Deflated'\n-3CCF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3CD3 CRC                   4F723C34 (1332886580)\n-3CD7 Compressed Size       00000AD8 (2776)\n-3CDB Uncompressed Size     00002B78 (11128)\n-3CDF Filename Length       003C (60)\n-3CE1 Extra Length          0000 (0)\n-3CE3 Comment Length        0000 (0)\n-3CE5 Disk Start            0000 (0)\n-3CE7 Int File Attributes   0000 (0)\n+3CF1 Compression Method    0008 (8) 'Deflated'\n+3CF3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3CF7 CRC                   8BDBBEA7 (2346434215)\n+3CFB Compressed Size       00000AE8 (2792)\n+3CFF Uncompressed Size     00002C91 (11409)\n+3D03 Filename Length       003C (60)\n+3D05 Extra Length          0000 (0)\n+3D07 Comment Length        0000 (0)\n+3D09 Disk Start            0000 (0)\n+3D0B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3CE9 Ext File Attributes   81A40000 (2175008768)\n+3D0D 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-3CED Local Header Offset   00002537 (9527)\n-3CF1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D11 Local Header Offset   00002547 (9543)\n+3D15 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3CF1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D15: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3D2D CENTRAL HEADER #18    02014B50 (33639248)\n-3D31 Created Zip Spec      14 (20) '2.0'\n-3D32 Created OS            03 (3) 'Unix'\n-3D33 Extract Zip Spec      14 (20) '2.0'\n-3D34 Extract OS            00 (0) 'MS-DOS'\n-3D35 General Purpose Flag  0800 (2048)\n+3D51 CENTRAL HEADER #18    02014B50 (33639248)\n+3D55 Created Zip Spec      14 (20) '2.0'\n+3D56 Created OS            03 (3) 'Unix'\n+3D57 Extract Zip Spec      14 (20) '2.0'\n+3D58 Extract OS            00 (0) 'MS-DOS'\n+3D59 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3D37 Compression Method    0008 (8) 'Deflated'\n-3D39 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D3D CRC                   71DE9B6F (1910414191)\n-3D41 Compressed Size       0000020C (524)\n-3D45 Uncompressed Size     000003AF (943)\n-3D49 Filename Length       0032 (50)\n-3D4B Extra Length          0000 (0)\n-3D4D Comment Length        0000 (0)\n-3D4F Disk Start            0000 (0)\n-3D51 Int File Attributes   0000 (0)\n+3D5B Compression Method    0008 (8) 'Deflated'\n+3D5D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3D61 CRC                   B1C6B8A4 (2982590628)\n+3D65 Compressed Size       00000214 (532)\n+3D69 Uncompressed Size     000003C5 (965)\n+3D6D Filename Length       0032 (50)\n+3D6F Extra Length          0000 (0)\n+3D71 Comment Length        0000 (0)\n+3D73 Disk Start            0000 (0)\n+3D75 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3D53 Ext File Attributes   81A40000 (2175008768)\n+3D77 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-3D57 Local Header Offset   00003069 (12393)\n-3D5B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3D7B Local Header Offset   00003089 (12425)\n+3D7F Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3D5B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3D7F: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3D8D CENTRAL HEADER #19    02014B50 (33639248)\n-3D91 Created Zip Spec      14 (20) '2.0'\n-3D92 Created OS            03 (3) 'Unix'\n-3D93 Extract Zip Spec      14 (20) '2.0'\n-3D94 Extract OS            00 (0) 'MS-DOS'\n-3D95 General Purpose Flag  0800 (2048)\n+3DB1 CENTRAL HEADER #19    02014B50 (33639248)\n+3DB5 Created Zip Spec      14 (20) '2.0'\n+3DB6 Created OS            03 (3) 'Unix'\n+3DB7 Extract Zip Spec      14 (20) '2.0'\n+3DB8 Extract OS            00 (0) 'MS-DOS'\n+3DB9 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3D97 Compression Method    0008 (8) 'Deflated'\n-3D99 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3D9D CRC                   5B4B50C0 (1531662528)\n-3DA1 Compressed Size       00000039 (57)\n-3DA5 Uncompressed Size     0000003E (62)\n-3DA9 Filename Length       0049 (73)\n-3DAB Extra Length          0000 (0)\n-3DAD Comment Length        0000 (0)\n-3DAF Disk Start            0000 (0)\n-3DB1 Int File Attributes   0000 (0)\n+3DBB Compression Method    0008 (8) 'Deflated'\n+3DBD Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3DC1 CRC                   5B4B50C0 (1531662528)\n+3DC5 Compressed Size       00000039 (57)\n+3DC9 Uncompressed Size     0000003E (62)\n+3DCD Filename Length       0049 (73)\n+3DCF Extra Length          0000 (0)\n+3DD1 Comment Length        0000 (0)\n+3DD3 Disk Start            0000 (0)\n+3DD5 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3DB3 Ext File Attributes   81A40000 (2175008768)\n+3DD7 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-3DB7 Local Header Offset   000032C5 (12997)\n-3DBB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3DDB Local Header Offset   000032ED (13037)\n+3DDF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3DBB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3DDF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3E04 CENTRAL HEADER #20    02014B50 (33639248)\n-3E08 Created Zip Spec      14 (20) '2.0'\n-3E09 Created OS            03 (3) 'Unix'\n-3E0A Extract Zip Spec      14 (20) '2.0'\n-3E0B Extract OS            00 (0) 'MS-DOS'\n-3E0C General Purpose Flag  0800 (2048)\n+3E28 CENTRAL HEADER #20    02014B50 (33639248)\n+3E2C Created Zip Spec      14 (20) '2.0'\n+3E2D Created OS            03 (3) 'Unix'\n+3E2E Extract Zip Spec      14 (20) '2.0'\n+3E2F Extract OS            00 (0) 'MS-DOS'\n+3E30 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3E0E Compression Method    0008 (8) 'Deflated'\n-3E10 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3E14 CRC                   06F60447 (116786247)\n-3E18 Compressed Size       000003F9 (1017)\n-3E1C Uncompressed Size     00000BC5 (3013)\n-3E20 Filename Length       003D (61)\n-3E22 Extra Length          0000 (0)\n-3E24 Comment Length        0000 (0)\n-3E26 Disk Start            0000 (0)\n-3E28 Int File Attributes   0000 (0)\n+3E32 Compression Method    0008 (8) 'Deflated'\n+3E34 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3E38 CRC                   26CC786B (650934379)\n+3E3C Compressed Size       000003F5 (1013)\n+3E40 Uncompressed Size     00000B76 (2934)\n+3E44 Filename Length       003D (61)\n+3E46 Extra Length          0000 (0)\n+3E48 Comment Length        0000 (0)\n+3E4A Disk Start            0000 (0)\n+3E4C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3E2A Ext File Attributes   81A40000 (2175008768)\n+3E4E 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-3E2E Local Header Offset   00003365 (13157)\n-3E32 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3E52 Local Header Offset   0000338D (13197)\n+3E56 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E32: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3E56: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3E6F CENTRAL HEADER #21    02014B50 (33639248)\n-3E73 Created Zip Spec      14 (20) '2.0'\n-3E74 Created OS            03 (3) 'Unix'\n-3E75 Extract Zip Spec      14 (20) '2.0'\n-3E76 Extract OS            00 (0) 'MS-DOS'\n-3E77 General Purpose Flag  0800 (2048)\n+3E93 CENTRAL HEADER #21    02014B50 (33639248)\n+3E97 Created Zip Spec      14 (20) '2.0'\n+3E98 Created OS            03 (3) 'Unix'\n+3E99 Extract Zip Spec      14 (20) '2.0'\n+3E9A Extract OS            00 (0) 'MS-DOS'\n+3E9B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3E79 Compression Method    0008 (8) 'Deflated'\n-3E7B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3E7F CRC                   39E2F889 (971176073)\n-3E83 Compressed Size       0000004A (74)\n-3E87 Uncompressed Size     0000004C (76)\n-3E8B Filename Length       0044 (68)\n-3E8D Extra Length          0000 (0)\n-3E8F Comment Length        0000 (0)\n-3E91 Disk Start            0000 (0)\n-3E93 Int File Attributes   0000 (0)\n+3E9D Compression Method    0008 (8) 'Deflated'\n+3E9F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3EA3 CRC                   39E2F889 (971176073)\n+3EA7 Compressed Size       0000004A (74)\n+3EAB Uncompressed Size     0000004C (76)\n+3EAF Filename Length       0044 (68)\n+3EB1 Extra Length          0000 (0)\n+3EB3 Comment Length        0000 (0)\n+3EB5 Disk Start            0000 (0)\n+3EB7 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-3E95 Ext File Attributes   81A40000 (2175008768)\n+3EB9 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-3E99 Local Header Offset   000037B9 (14265)\n-3E9D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3EBD Local Header Offset   000037DD (14301)\n+3EC1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3E9D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3EC1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-3EE1 END CENTRAL HEADER    06054B50 (101010256)\n-3EE5 Number of this disk   0000 (0)\n-3EE7 Central Dir Disk no   0000 (0)\n-3EE9 Entries in this disk  0015 (21)\n-3EEB Total Entries         0015 (21)\n-3EED Size of Central Dir   0000067C (1660)\n-3EF1 Offset to Central Dir 00003865 (14437)\n-3EF5 Comment Length        0000 (0)\n+3F05 END CENTRAL HEADER    06054B50 (101010256)\n+3F09 Number of this disk   0000 (0)\n+3F0B Central Dir Disk no   0000 (0)\n+3F0D Entries in this disk  0015 (21)\n+3F0F Total Entries         0015 (21)\n+3F11 Size of Central Dir   0000067C (1660)\n+3F15 Offset to Central Dir 00003889 (14473)\n+3F19 Comment Length        0000 (0)\n #\n # Error Count: 11\n # Warning Count: 53\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/eureka/ConfigurableEurekaInstanceConfig.java", "source2": "org/apache/dubbo/registry/eureka/ConfigurableEurekaInstanceConfig.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,369 +1,369 @@\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.eureka;\n-\n-import com.netflix.appinfo.DataCenterInfo;\n-import com.netflix.appinfo.EurekaInstanceConfig;\n-import com.netflix.appinfo.InstanceInfo;\n-import com.netflix.appinfo.MyDataCenterInfo;\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-/**\n- * Configurable {@link EurekaInstanceConfig} implementation\n- */\n-class ConfigurableEurekaInstanceConfig implements EurekaInstanceConfig {\n-\n-    private String appname;\n-\n-    private String appGroupName;\n-\n-    private boolean instanceEnabledOnit;\n-\n-    private int nonSecurePort;\n-\n-    private int securePort;\n-\n-    private boolean nonSecurePortEnabled = true;\n-\n-    private boolean securePortEnabled;\n-\n-    private int leaseRenewalIntervalInSeconds = 30;\n-\n-    private int leaseExpirationDurationInSeconds = 90;\n-\n-    private String virtualHostName = \"unknown\";\n-\n-    private String instanceId;\n-\n-    private String secureVirtualHostName = \"unknown\";\n-\n-    private String aSGName;\n-\n-    private Map<String, String> metadataMap = new HashMap<>();\n-\n-    private DataCenterInfo dataCenterInfo = new MyDataCenterInfo(DataCenterInfo.Name.MyOwn);\n-\n-    private String ipAddress;\n-\n-    private String statusPageUrlPath;\n-\n-    private String statusPageUrl;\n-\n-    private String homePageUrlPath = \"/\";\n-\n-    private String homePageUrl;\n-\n-    private String healthCheckUrlPath;\n-\n-    private String healthCheckUrl;\n-\n-    private String secureHealthCheckUrl;\n-\n-    private String namespace = \"eureka\";\n-\n-    private String hostname;\n-\n-    private boolean preferIpAddress = false;\n-\n-    private InstanceInfo.InstanceStatus initialStatus = InstanceInfo.InstanceStatus.UP;\n-\n-    private String[] defaultAddressResolutionOrder = new String[0];\n-\n-    @Override\n-    public String getAppname() {\n-        return appname;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setAppname(String appname) {\n-        this.appname = appname;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getAppGroupName() {\n-        return appGroupName;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setAppGroupName(String appGroupName) {\n-        this.appGroupName = appGroupName;\n-        return this;\n-    }\n-\n-    @Override\n-    public boolean isInstanceEnabledOnit() {\n-        return instanceEnabledOnit;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setInstanceEnabledOnit(boolean instanceEnabledOnit) {\n-        this.instanceEnabledOnit = instanceEnabledOnit;\n-        return this;\n-    }\n-\n-    @Override\n-    public int getNonSecurePort() {\n-        return nonSecurePort;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setNonSecurePort(int nonSecurePort) {\n-        this.nonSecurePort = nonSecurePort;\n-        return this;\n-    }\n-\n-    @Override\n-    public int getSecurePort() {\n-        return securePort;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setSecurePort(int securePort) {\n-        this.securePort = securePort;\n-        return this;\n-    }\n-\n-    @Override\n-    public boolean isNonSecurePortEnabled() {\n-        return nonSecurePortEnabled;\n-    }\n-\n-    @Override\n-    public boolean getSecurePortEnabled() {\n-        return securePortEnabled;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setNonSecurePortEnabled(boolean nonSecurePortEnabled) {\n-        this.nonSecurePortEnabled = nonSecurePortEnabled;\n-        return this;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setSecurePortEnabled(boolean securePortEnabled) {\n-        this.securePortEnabled = securePortEnabled;\n-        return this;\n-    }\n-\n-    @Override\n-    public int getLeaseRenewalIntervalInSeconds() {\n-        return leaseRenewalIntervalInSeconds;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setLeaseRenewalIntervalInSeconds(int leaseRenewalIntervalInSeconds) {\n-        this.leaseRenewalIntervalInSeconds = leaseRenewalIntervalInSeconds;\n-        return this;\n-    }\n-\n-    @Override\n-    public int getLeaseExpirationDurationInSeconds() {\n-        return leaseExpirationDurationInSeconds;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setLeaseExpirationDurationInSeconds(int leaseExpirationDurationInSeconds) {\n-        this.leaseExpirationDurationInSeconds = leaseExpirationDurationInSeconds;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getVirtualHostName() {\n-        return virtualHostName;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setVirtualHostName(String virtualHostName) {\n-        this.virtualHostName = virtualHostName;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getInstanceId() {\n-        return instanceId;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setInstanceId(String instanceId) {\n-        this.instanceId = instanceId;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getSecureVirtualHostName() {\n-        return secureVirtualHostName;\n-    }\n-\n-    @Override\n-    public String getASGName() {\n-        return aSGName;\n-    }\n-\n-    @Override\n-    public String getHostName(boolean refresh) {\n-        return null;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setSecureVirtualHostName(String secureVirtualHostName) {\n-        this.secureVirtualHostName = secureVirtualHostName;\n-        return this;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setASGName(String aSGName) {\n-        this.aSGName = aSGName;\n-        return this;\n-    }\n-\n-    @Override\n-    public Map<String, String> getMetadataMap() {\n-        return metadataMap;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setMetadataMap(Map<String, String> metadataMap) {\n-        this.metadataMap = metadataMap;\n-        return this;\n-    }\n-\n-    @Override\n-    public DataCenterInfo getDataCenterInfo() {\n-        return dataCenterInfo;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setDataCenterInfo(DataCenterInfo dataCenterInfo) {\n-        this.dataCenterInfo = dataCenterInfo;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getIpAddress() {\n-        return ipAddress;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setIpAddress(String ipAddress) {\n-        this.ipAddress = ipAddress;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getStatusPageUrlPath() {\n-        return statusPageUrlPath;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setStatusPageUrlPath(String statusPageUrlPath) {\n-        this.statusPageUrlPath = statusPageUrlPath;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getStatusPageUrl() {\n-        return statusPageUrl;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setStatusPageUrl(String statusPageUrl) {\n-        this.statusPageUrl = statusPageUrl;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getHomePageUrlPath() {\n-        return homePageUrlPath;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setHomePageUrlPath(String homePageUrlPath) {\n-        this.homePageUrlPath = homePageUrlPath;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getHomePageUrl() {\n-        return homePageUrl;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setHomePageUrl(String homePageUrl) {\n-        this.homePageUrl = homePageUrl;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getHealthCheckUrlPath() {\n-        return healthCheckUrlPath;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setHealthCheckUrlPath(String healthCheckUrlPath) {\n-        this.healthCheckUrlPath = healthCheckUrlPath;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getHealthCheckUrl() {\n-        return healthCheckUrl;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setHealthCheckUrl(String healthCheckUrl) {\n-        this.healthCheckUrl = healthCheckUrl;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getSecureHealthCheckUrl() {\n-        return secureHealthCheckUrl;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setSecureHealthCheckUrl(String secureHealthCheckUrl) {\n-        this.secureHealthCheckUrl = secureHealthCheckUrl;\n-        return this;\n-    }\n-\n-    @Override\n-    public String getNamespace() {\n-        return namespace;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setNamespace(String namespace) {\n-        this.namespace = namespace;\n-        return this;\n-    }\n-\n-    public String getHostname() {\n-        return hostname;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setHostname(String hostname) {\n-        this.hostname = hostname;\n-        return this;\n-    }\n-\n-    public boolean isPreferIpAddress() {\n-        return preferIpAddress;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setPreferIpAddress(boolean preferIpAddress) {\n-        this.preferIpAddress = preferIpAddress;\n-        return this;\n-    }\n-\n-    public InstanceInfo.InstanceStatus getInitialStatus() {\n-        return initialStatus;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setInitialStatus(InstanceInfo.InstanceStatus initialStatus) {\n-        this.initialStatus = initialStatus;\n-        return this;\n-    }\n-\n-    @Override\n-    public String[] getDefaultAddressResolutionOrder() {\n-        return defaultAddressResolutionOrder;\n-    }\n-\n-    public ConfigurableEurekaInstanceConfig setDefaultAddressResolutionOrder(String[] defaultAddressResolutionOrder) {\n-        this.defaultAddressResolutionOrder = defaultAddressResolutionOrder;\n-        return this;\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.eureka;\r\n+\r\n+import com.netflix.appinfo.DataCenterInfo;\r\n+import com.netflix.appinfo.EurekaInstanceConfig;\r\n+import com.netflix.appinfo.InstanceInfo;\r\n+import com.netflix.appinfo.MyDataCenterInfo;\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+/**\r\n+ * Configurable {@link EurekaInstanceConfig} implementation\r\n+ */\r\n+class ConfigurableEurekaInstanceConfig implements EurekaInstanceConfig {\r\n+\r\n+    private String appname;\r\n+\r\n+    private String appGroupName;\r\n+\r\n+    private boolean instanceEnabledOnit;\r\n+\r\n+    private int nonSecurePort;\r\n+\r\n+    private int securePort;\r\n+\r\n+    private boolean nonSecurePortEnabled = true;\r\n+\r\n+    private boolean securePortEnabled;\r\n+\r\n+    private int leaseRenewalIntervalInSeconds = 30;\r\n+\r\n+    private int leaseExpirationDurationInSeconds = 90;\r\n+\r\n+    private String virtualHostName = \"unknown\";\r\n+\r\n+    private String instanceId;\r\n+\r\n+    private String secureVirtualHostName = \"unknown\";\r\n+\r\n+    private String aSGName;\r\n+\r\n+    private Map<String, String> metadataMap = new HashMap<>();\r\n+\r\n+    private DataCenterInfo dataCenterInfo = new MyDataCenterInfo(DataCenterInfo.Name.MyOwn);\r\n+\r\n+    private String ipAddress;\r\n+\r\n+    private String statusPageUrlPath;\r\n+\r\n+    private String statusPageUrl;\r\n+\r\n+    private String homePageUrlPath = \"/\";\r\n+\r\n+    private String homePageUrl;\r\n+\r\n+    private String healthCheckUrlPath;\r\n+\r\n+    private String healthCheckUrl;\r\n+\r\n+    private String secureHealthCheckUrl;\r\n+\r\n+    private String namespace = \"eureka\";\r\n+\r\n+    private String hostname;\r\n+\r\n+    private boolean preferIpAddress = false;\r\n+\r\n+    private InstanceInfo.InstanceStatus initialStatus = InstanceInfo.InstanceStatus.UP;\r\n+\r\n+    private String[] defaultAddressResolutionOrder = new String[0];\r\n+\r\n+    @Override\r\n+    public String getAppname() {\r\n+        return appname;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setAppname(String appname) {\r\n+        this.appname = appname;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getAppGroupName() {\r\n+        return appGroupName;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setAppGroupName(String appGroupName) {\r\n+        this.appGroupName = appGroupName;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isInstanceEnabledOnit() {\r\n+        return instanceEnabledOnit;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setInstanceEnabledOnit(boolean instanceEnabledOnit) {\r\n+        this.instanceEnabledOnit = instanceEnabledOnit;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getNonSecurePort() {\r\n+        return nonSecurePort;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setNonSecurePort(int nonSecurePort) {\r\n+        this.nonSecurePort = nonSecurePort;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getSecurePort() {\r\n+        return securePort;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setSecurePort(int securePort) {\r\n+        this.securePort = securePort;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isNonSecurePortEnabled() {\r\n+        return nonSecurePortEnabled;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean getSecurePortEnabled() {\r\n+        return securePortEnabled;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setNonSecurePortEnabled(boolean nonSecurePortEnabled) {\r\n+        this.nonSecurePortEnabled = nonSecurePortEnabled;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setSecurePortEnabled(boolean securePortEnabled) {\r\n+        this.securePortEnabled = securePortEnabled;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getLeaseRenewalIntervalInSeconds() {\r\n+        return leaseRenewalIntervalInSeconds;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setLeaseRenewalIntervalInSeconds(int leaseRenewalIntervalInSeconds) {\r\n+        this.leaseRenewalIntervalInSeconds = leaseRenewalIntervalInSeconds;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public int getLeaseExpirationDurationInSeconds() {\r\n+        return leaseExpirationDurationInSeconds;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setLeaseExpirationDurationInSeconds(int leaseExpirationDurationInSeconds) {\r\n+        this.leaseExpirationDurationInSeconds = leaseExpirationDurationInSeconds;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getVirtualHostName() {\r\n+        return virtualHostName;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setVirtualHostName(String virtualHostName) {\r\n+        this.virtualHostName = virtualHostName;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getInstanceId() {\r\n+        return instanceId;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setInstanceId(String instanceId) {\r\n+        this.instanceId = instanceId;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getSecureVirtualHostName() {\r\n+        return secureVirtualHostName;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getASGName() {\r\n+        return aSGName;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHostName(boolean refresh) {\r\n+        return null;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setSecureVirtualHostName(String secureVirtualHostName) {\r\n+        this.secureVirtualHostName = secureVirtualHostName;\r\n+        return this;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setASGName(String aSGName) {\r\n+        this.aSGName = aSGName;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public Map<String, String> getMetadataMap() {\r\n+        return metadataMap;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setMetadataMap(Map<String, String> metadataMap) {\r\n+        this.metadataMap = metadataMap;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public DataCenterInfo getDataCenterInfo() {\r\n+        return dataCenterInfo;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setDataCenterInfo(DataCenterInfo dataCenterInfo) {\r\n+        this.dataCenterInfo = dataCenterInfo;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getIpAddress() {\r\n+        return ipAddress;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setIpAddress(String ipAddress) {\r\n+        this.ipAddress = ipAddress;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getStatusPageUrlPath() {\r\n+        return statusPageUrlPath;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setStatusPageUrlPath(String statusPageUrlPath) {\r\n+        this.statusPageUrlPath = statusPageUrlPath;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getStatusPageUrl() {\r\n+        return statusPageUrl;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setStatusPageUrl(String statusPageUrl) {\r\n+        this.statusPageUrl = statusPageUrl;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHomePageUrlPath() {\r\n+        return homePageUrlPath;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setHomePageUrlPath(String homePageUrlPath) {\r\n+        this.homePageUrlPath = homePageUrlPath;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHomePageUrl() {\r\n+        return homePageUrl;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setHomePageUrl(String homePageUrl) {\r\n+        this.homePageUrl = homePageUrl;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHealthCheckUrlPath() {\r\n+        return healthCheckUrlPath;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setHealthCheckUrlPath(String healthCheckUrlPath) {\r\n+        this.healthCheckUrlPath = healthCheckUrlPath;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getHealthCheckUrl() {\r\n+        return healthCheckUrl;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setHealthCheckUrl(String healthCheckUrl) {\r\n+        this.healthCheckUrl = healthCheckUrl;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getSecureHealthCheckUrl() {\r\n+        return secureHealthCheckUrl;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setSecureHealthCheckUrl(String secureHealthCheckUrl) {\r\n+        this.secureHealthCheckUrl = secureHealthCheckUrl;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String getNamespace() {\r\n+        return namespace;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setNamespace(String namespace) {\r\n+        this.namespace = namespace;\r\n+        return this;\r\n+    }\r\n+\r\n+    public String getHostname() {\r\n+        return hostname;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setHostname(String hostname) {\r\n+        this.hostname = hostname;\r\n+        return this;\r\n+    }\r\n+\r\n+    public boolean isPreferIpAddress() {\r\n+        return preferIpAddress;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setPreferIpAddress(boolean preferIpAddress) {\r\n+        this.preferIpAddress = preferIpAddress;\r\n+        return this;\r\n+    }\r\n+\r\n+    public InstanceInfo.InstanceStatus getInitialStatus() {\r\n+        return initialStatus;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setInitialStatus(InstanceInfo.InstanceStatus initialStatus) {\r\n+        this.initialStatus = initialStatus;\r\n+        return this;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String[] getDefaultAddressResolutionOrder() {\r\n+        return defaultAddressResolutionOrder;\r\n+    }\r\n+\r\n+    public ConfigurableEurekaInstanceConfig setDefaultAddressResolutionOrder(String[] defaultAddressResolutionOrder) {\r\n+        this.defaultAddressResolutionOrder = defaultAddressResolutionOrder;\r\n+        return this;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java", "source2": "org/apache/dubbo/registry/eureka/EurekaServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,281 +1,281 @@\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.eureka;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.event.EventDispatcher;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\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-\n-import com.netflix.appinfo.ApplicationInfoManager;\n-import com.netflix.appinfo.EurekaInstanceConfig;\n-import com.netflix.appinfo.InstanceInfo;\n-import com.netflix.config.ConfigurationManager;\n-import com.netflix.discovery.CacheRefreshedEvent;\n-import com.netflix.discovery.DefaultEurekaClientConfig;\n-import com.netflix.discovery.DiscoveryClient;\n-import com.netflix.discovery.EurekaClient;\n-import com.netflix.discovery.EurekaClientConfig;\n-import com.netflix.discovery.EurekaEvent;\n-import com.netflix.discovery.shared.Application;\n-import com.netflix.discovery.shared.Applications;\n-\n-import java.util.ArrayList;\n-import java.util.Collections;\n-import java.util.LinkedHashSet;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Objects;\n-import java.util.Properties;\n-import java.util.Set;\n-\n-import static java.util.Collections.emptyList;\n-import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\n-import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\n-import static org.apache.dubbo.registry.client.ServiceDiscoveryRegistry.parseServices;\n-\n-/**\n- * Eureka {@link ServiceDiscovery} implementation based on Eureka API\n- */\n-public class EurekaServiceDiscovery extends AbstractServiceDiscovery {\n-\n-    private final EventDispatcher eventDispatcher = getDefaultExtension();\n-\n-    private ApplicationInfoManager applicationInfoManager;\n-\n-    private EurekaClient eurekaClient;\n-\n-    private Set<String> subscribedServices;\n-\n-    /**\n-     * last apps hash code is used to identify the {@link Applications} is changed or not\n-     */\n-    private String lastAppsHashCode;\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        Properties eurekaConfigProperties = buildEurekaConfigProperties(registryURL);\n-        initConfigurationManager(eurekaConfigProperties);\n-        initSubscribedServices(registryURL);\n-    }\n-\n-    /**\n-     * Build the Properties whose {@link java.util.Map.Entry entries} are retrieved from\n-     * {@link URL#getParameters() the parameters of the specified URL}, which will be used in the Eureka's {@link ConfigurationManager}\n-     *\n-     * @param registryURL the {@link URL url} to connect Eureka\n-     * @return non-null\n-     */\n-    private Properties buildEurekaConfigProperties(URL registryURL) {\n-        Properties properties = new Properties();\n-        Map<String, String> parameters = registryURL.getParameters();\n-        setDefaultProperties(registryURL, properties);\n-        parameters.entrySet().stream()\n-                .filter(this::filterEurekaProperty)\n-                .forEach(propertyEntry -> {\n-                    properties.setProperty(propertyEntry.getKey(), propertyEntry.getValue());\n-                });\n-        return properties;\n-    }\n-\n-    /**\n-     * Initialize {@link #subscribedServices} property\n-     *\n-     * @param registryURL the {@link URL url} to connect Eureka\n-     */\n-    private void initSubscribedServices(URL registryURL) {\n-        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\n-        ;\n-    }\n-\n-    private boolean filterEurekaProperty(Map.Entry<String, String> propertyEntry) {\n-        String propertyName = propertyEntry.getKey();\n-        return propertyName.startsWith(\"eureka.\");\n-    }\n-\n-    private void setDefaultProperties(URL registryURL, Properties properties) {\n-        setDefaultServiceURL(registryURL, properties);\n-        setDefaultInitialInstanceInfoReplicationIntervalSeconds(properties);\n-    }\n-\n-    private void setDefaultServiceURL(URL registryURL, Properties properties) {\n-        StringBuilder defaultServiceURLBuilder = new StringBuilder(\"http://\")\n-                .append(registryURL.getHost())\n-                .append(\":\")\n-                .append(registryURL.getPort())\n-                .append(\"/eureka\");\n-        properties.setProperty(\"eureka.serviceUrl.default\", defaultServiceURLBuilder.toString());\n-    }\n-\n-    /**\n-     * Set the default property for {@link EurekaClientConfig#getInitialInstanceInfoReplicationIntervalSeconds()}\n-     * which means do register immediately\n-     *\n-     * @param properties {@link Properties}\n-     */\n-    private void setDefaultInitialInstanceInfoReplicationIntervalSeconds(Properties properties) {\n-        properties.setProperty(\"eureka.appinfo.initial.replicate.time\", \"0\");\n-    }\n-\n-    /**\n-     * Initialize {@link ConfigurationManager}\n-     *\n-     * @param eurekaConfigProperties the Eureka's {@link ConfigurationManager}\n-     */\n-    private void initConfigurationManager(Properties eurekaConfigProperties) {\n-        ConfigurationManager.loadProperties(eurekaConfigProperties);\n-    }\n-\n-    private void initApplicationInfoManager(ServiceInstance serviceInstance) {\n-        EurekaInstanceConfig eurekaInstanceConfig = buildEurekaInstanceConfig(serviceInstance);\n-        this.applicationInfoManager = new ApplicationInfoManager(eurekaInstanceConfig, (ApplicationInfoManager.OptionalArgs) null);\n-    }\n-\n-    /**\n-     * Initialize {@link #eurekaClient} property\n-     *\n-     * @param serviceInstance {@link ServiceInstance}\n-     */\n-    private void initEurekaClient(ServiceInstance serviceInstance) {\n-        if (eurekaClient != null) {\n-            return;\n-        }\n-        initApplicationInfoManager(serviceInstance);\n-        EurekaClient eurekaClient = createEurekaClient();\n-        registerEurekaEventListener(eurekaClient);\n-        // set eurekaClient\n-        this.eurekaClient = eurekaClient;\n-    }\n-\n-    private void registerEurekaEventListener(EurekaClient eurekaClient) {\n-        eurekaClient.registerEventListener(this::onEurekaEvent);\n-    }\n-\n-    private void onEurekaEvent(EurekaEvent event) {\n-        if (event instanceof CacheRefreshedEvent) {\n-            onCacheRefreshedEvent(CacheRefreshedEvent.class.cast(event));\n-        }\n-    }\n-\n-    private void onCacheRefreshedEvent(CacheRefreshedEvent event) {\n-        synchronized (this) { // Make sure thread-safe in async execution\n-            Applications applications = eurekaClient.getApplications();\n-            String appsHashCode = applications.getAppsHashCode();\n-            if (!Objects.equals(lastAppsHashCode, appsHashCode)) { // Changed\n-                // Dispatch Events\n-                dispatchServiceInstancesChangedEvent();\n-                lastAppsHashCode = appsHashCode; // update current result\n-            }\n-        }\n-    }\n-\n-    private void dispatchServiceInstancesChangedEvent() {\n-        subscribedServices.forEach((serviceName) -> {\n-            eventDispatcher.dispatch(new ServiceInstancesChangedEvent(serviceName, getInstances(serviceName)));\n-        });\n-    }\n-\n-    private EurekaClient createEurekaClient() {\n-        EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();\n-        DiscoveryClient eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);\n-        return eurekaClient;\n-    }\n-\n-    @Override\n-    public void destroy() throws Exception {\n-        if (eurekaClient != null) {\n-            this.eurekaClient.shutdown();\n-        }\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        initEurekaClient(serviceInstance);\n-        setInstanceStatus(InstanceInfo.InstanceStatus.UP);\n-    }\n-\n-    private void setInstanceStatus(InstanceInfo.InstanceStatus status) {\n-        if (applicationInfoManager != null) {\n-            this.applicationInfoManager.setInstanceStatus(status);\n-        }\n-    }\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        setInstanceStatus(serviceInstance.isHealthy() ? InstanceInfo.InstanceStatus.UP :\n-                InstanceInfo.InstanceStatus.UNKNOWN);\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        setInstanceStatus(InstanceInfo.InstanceStatus.OUT_OF_SERVICE);\n-    }\n-\n-    @Override\n-    public Set<String> getServices() {\n-        Applications applications = this.eurekaClient.getApplications();\n-        if (applications == null) {\n-            return Collections.emptySet();\n-        }\n-        List<Application> registered = applications.getRegisteredApplications();\n-        Set<String> names = new LinkedHashSet<>();\n-        for (Application app : registered) {\n-            if (app.getInstances().isEmpty()) {\n-                continue;\n-            }\n-            names.add(app.getName().toLowerCase());\n-        }\n-        return names;\n-    }\n-\n-    @Override\n-    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\n-        Application application = this.eurekaClient.getApplication(serviceName);\n-\n-        if (application == null) {\n-            return emptyList();\n-        }\n-\n-        List<InstanceInfo> infos = application.getInstances();\n-        List<ServiceInstance> instances = new ArrayList<>();\n-        for (InstanceInfo info : infos) {\n-            instances.add(buildServiceInstance(info));\n-        }\n-        return instances;\n-    }\n-\n-    private ServiceInstance buildServiceInstance(InstanceInfo instance) {\n-        DefaultServiceInstance serviceInstance = new DefaultServiceInstance(instance.getId(), instance.getAppName(),\n-                instance.getHostName(),\n-                instance.isPortEnabled(InstanceInfo.PortType.SECURE) ? instance.getSecurePort() : instance.getPort());\n-        serviceInstance.setMetadata(instance.getMetadata());\n-        return serviceInstance;\n-    }\n-\n-    private EurekaInstanceConfig buildEurekaInstanceConfig(ServiceInstance serviceInstance) {\n-        ConfigurableEurekaInstanceConfig eurekaInstanceConfig = new ConfigurableEurekaInstanceConfig()\n-                .setInstanceId(serviceInstance.getId())\n-                .setAppname(serviceInstance.getServiceName())\n-                .setIpAddress(serviceInstance.getHost())\n-                .setNonSecurePort(serviceInstance.getPort())\n-                .setMetadataMap(serviceInstance.getMetadata());\n-        return eurekaInstanceConfig;\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.eureka;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.event.EventDispatcher;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\r\n+import org.apache.dubbo.registry.client.DefaultServiceInstance;\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+\r\n+import com.netflix.appinfo.ApplicationInfoManager;\r\n+import com.netflix.appinfo.EurekaInstanceConfig;\r\n+import com.netflix.appinfo.InstanceInfo;\r\n+import com.netflix.config.ConfigurationManager;\r\n+import com.netflix.discovery.CacheRefreshedEvent;\r\n+import com.netflix.discovery.DefaultEurekaClientConfig;\r\n+import com.netflix.discovery.DiscoveryClient;\r\n+import com.netflix.discovery.EurekaClient;\r\n+import com.netflix.discovery.EurekaClientConfig;\r\n+import com.netflix.discovery.EurekaEvent;\r\n+import com.netflix.discovery.shared.Application;\r\n+import com.netflix.discovery.shared.Applications;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.Collections;\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.Properties;\r\n+import java.util.Set;\r\n+\r\n+import static java.util.Collections.emptyList;\r\n+import static org.apache.dubbo.common.constants.RegistryConstants.SUBSCRIBED_SERVICE_NAMES_KEY;\r\n+import static org.apache.dubbo.event.EventDispatcher.getDefaultExtension;\r\n+import static org.apache.dubbo.registry.client.ServiceDiscoveryRegistry.parseServices;\r\n+\r\n+/**\r\n+ * Eureka {@link ServiceDiscovery} implementation based on Eureka API\r\n+ */\r\n+public class EurekaServiceDiscovery extends AbstractServiceDiscovery {\r\n+\r\n+    private final EventDispatcher eventDispatcher = getDefaultExtension();\r\n+\r\n+    private ApplicationInfoManager applicationInfoManager;\r\n+\r\n+    private EurekaClient eurekaClient;\r\n+\r\n+    private Set<String> subscribedServices;\r\n+\r\n+    /**\r\n+     * last apps hash code is used to identify the {@link Applications} is changed or not\r\n+     */\r\n+    private String lastAppsHashCode;\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        Properties eurekaConfigProperties = buildEurekaConfigProperties(registryURL);\r\n+        initConfigurationManager(eurekaConfigProperties);\r\n+        initSubscribedServices(registryURL);\r\n+    }\r\n+\r\n+    /**\r\n+     * Build the Properties whose {@link java.util.Map.Entry entries} are retrieved from\r\n+     * {@link URL#getParameters() the parameters of the specified URL}, which will be used in the Eureka's {@link ConfigurationManager}\r\n+     *\r\n+     * @param registryURL the {@link URL url} to connect Eureka\r\n+     * @return non-null\r\n+     */\r\n+    private Properties buildEurekaConfigProperties(URL registryURL) {\r\n+        Properties properties = new Properties();\r\n+        Map<String, String> parameters = registryURL.getParameters();\r\n+        setDefaultProperties(registryURL, properties);\r\n+        parameters.entrySet().stream()\r\n+                .filter(this::filterEurekaProperty)\r\n+                .forEach(propertyEntry -> {\r\n+                    properties.setProperty(propertyEntry.getKey(), propertyEntry.getValue());\r\n+                });\r\n+        return properties;\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize {@link #subscribedServices} property\r\n+     *\r\n+     * @param registryURL the {@link URL url} to connect Eureka\r\n+     */\r\n+    private void initSubscribedServices(URL registryURL) {\r\n+        this.subscribedServices = parseServices(registryURL.getParameter(SUBSCRIBED_SERVICE_NAMES_KEY));\r\n+        ;\r\n+    }\r\n+\r\n+    private boolean filterEurekaProperty(Map.Entry<String, String> propertyEntry) {\r\n+        String propertyName = propertyEntry.getKey();\r\n+        return propertyName.startsWith(\"eureka.\");\r\n+    }\r\n+\r\n+    private void setDefaultProperties(URL registryURL, Properties properties) {\r\n+        setDefaultServiceURL(registryURL, properties);\r\n+        setDefaultInitialInstanceInfoReplicationIntervalSeconds(properties);\r\n+    }\r\n+\r\n+    private void setDefaultServiceURL(URL registryURL, Properties properties) {\r\n+        StringBuilder defaultServiceURLBuilder = new StringBuilder(\"http://\")\r\n+                .append(registryURL.getHost())\r\n+                .append(\":\")\r\n+                .append(registryURL.getPort())\r\n+                .append(\"/eureka\");\r\n+        properties.setProperty(\"eureka.serviceUrl.default\", defaultServiceURLBuilder.toString());\r\n+    }\r\n+\r\n+    /**\r\n+     * Set the default property for {@link EurekaClientConfig#getInitialInstanceInfoReplicationIntervalSeconds()}\r\n+     * which means do register immediately\r\n+     *\r\n+     * @param properties {@link Properties}\r\n+     */\r\n+    private void setDefaultInitialInstanceInfoReplicationIntervalSeconds(Properties properties) {\r\n+        properties.setProperty(\"eureka.appinfo.initial.replicate.time\", \"0\");\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize {@link ConfigurationManager}\r\n+     *\r\n+     * @param eurekaConfigProperties the Eureka's {@link ConfigurationManager}\r\n+     */\r\n+    private void initConfigurationManager(Properties eurekaConfigProperties) {\r\n+        ConfigurationManager.loadProperties(eurekaConfigProperties);\r\n+    }\r\n+\r\n+    private void initApplicationInfoManager(ServiceInstance serviceInstance) {\r\n+        EurekaInstanceConfig eurekaInstanceConfig = buildEurekaInstanceConfig(serviceInstance);\r\n+        this.applicationInfoManager = new ApplicationInfoManager(eurekaInstanceConfig, (ApplicationInfoManager.OptionalArgs) null);\r\n+    }\r\n+\r\n+    /**\r\n+     * Initialize {@link #eurekaClient} property\r\n+     *\r\n+     * @param serviceInstance {@link ServiceInstance}\r\n+     */\r\n+    private void initEurekaClient(ServiceInstance serviceInstance) {\r\n+        if (eurekaClient != null) {\r\n+            return;\r\n+        }\r\n+        initApplicationInfoManager(serviceInstance);\r\n+        EurekaClient eurekaClient = createEurekaClient();\r\n+        registerEurekaEventListener(eurekaClient);\r\n+        // set eurekaClient\r\n+        this.eurekaClient = eurekaClient;\r\n+    }\r\n+\r\n+    private void registerEurekaEventListener(EurekaClient eurekaClient) {\r\n+        eurekaClient.registerEventListener(this::onEurekaEvent);\r\n+    }\r\n+\r\n+    private void onEurekaEvent(EurekaEvent event) {\r\n+        if (event instanceof CacheRefreshedEvent) {\r\n+            onCacheRefreshedEvent(CacheRefreshedEvent.class.cast(event));\r\n+        }\r\n+    }\r\n+\r\n+    private void onCacheRefreshedEvent(CacheRefreshedEvent event) {\r\n+        synchronized (this) { // Make sure thread-safe in async execution\r\n+            Applications applications = eurekaClient.getApplications();\r\n+            String appsHashCode = applications.getAppsHashCode();\r\n+            if (!Objects.equals(lastAppsHashCode, appsHashCode)) { // Changed\r\n+                // Dispatch Events\r\n+                dispatchServiceInstancesChangedEvent();\r\n+                lastAppsHashCode = appsHashCode; // update current result\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void dispatchServiceInstancesChangedEvent() {\r\n+        subscribedServices.forEach((serviceName) -> {\r\n+            eventDispatcher.dispatch(new ServiceInstancesChangedEvent(serviceName, getInstances(serviceName)));\r\n+        });\r\n+    }\r\n+\r\n+    private EurekaClient createEurekaClient() {\r\n+        EurekaClientConfig eurekaClientConfig = new DefaultEurekaClientConfig();\r\n+        DiscoveryClient eurekaClient = new DiscoveryClient(applicationInfoManager, eurekaClientConfig);\r\n+        return eurekaClient;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws Exception {\r\n+        if (eurekaClient != null) {\r\n+            this.eurekaClient.shutdown();\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        initEurekaClient(serviceInstance);\r\n+        setInstanceStatus(InstanceInfo.InstanceStatus.UP);\r\n+    }\r\n+\r\n+    private void setInstanceStatus(InstanceInfo.InstanceStatus status) {\r\n+        if (applicationInfoManager != null) {\r\n+            this.applicationInfoManager.setInstanceStatus(status);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        setInstanceStatus(serviceInstance.isHealthy() ? InstanceInfo.InstanceStatus.UP :\r\n+                InstanceInfo.InstanceStatus.UNKNOWN);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        setInstanceStatus(InstanceInfo.InstanceStatus.OUT_OF_SERVICE);\r\n+    }\r\n+\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        Applications applications = this.eurekaClient.getApplications();\r\n+        if (applications == null) {\r\n+            return Collections.emptySet();\r\n+        }\r\n+        List<Application> registered = applications.getRegisteredApplications();\r\n+        Set<String> names = new LinkedHashSet<>();\r\n+        for (Application app : registered) {\r\n+            if (app.getInstances().isEmpty()) {\r\n+                continue;\r\n+            }\r\n+            names.add(app.getName().toLowerCase());\r\n+        }\r\n+        return names;\r\n+    }\r\n+\r\n+    @Override\r\n+    public List<ServiceInstance> getInstances(String serviceName) throws NullPointerException {\r\n+        Application application = this.eurekaClient.getApplication(serviceName);\r\n+\r\n+        if (application == null) {\r\n+            return emptyList();\r\n+        }\r\n+\r\n+        List<InstanceInfo> infos = application.getInstances();\r\n+        List<ServiceInstance> instances = new ArrayList<>();\r\n+        for (InstanceInfo info : infos) {\r\n+            instances.add(buildServiceInstance(info));\r\n+        }\r\n+        return instances;\r\n+    }\r\n+\r\n+    private ServiceInstance buildServiceInstance(InstanceInfo instance) {\r\n+        DefaultServiceInstance serviceInstance = new DefaultServiceInstance(instance.getId(), instance.getAppName(),\r\n+                instance.getHostName(),\r\n+                instance.isPortEnabled(InstanceInfo.PortType.SECURE) ? instance.getSecurePort() : instance.getPort());\r\n+        serviceInstance.setMetadata(instance.getMetadata());\r\n+        return serviceInstance;\r\n+    }\r\n+\r\n+    private EurekaInstanceConfig buildEurekaInstanceConfig(ServiceInstance serviceInstance) {\r\n+        ConfigurableEurekaInstanceConfig eurekaInstanceConfig = new ConfigurableEurekaInstanceConfig()\r\n+                .setInstanceId(serviceInstance.getId())\r\n+                .setAppname(serviceInstance.getServiceName())\r\n+                .setIpAddress(serviceInstance.getHost())\r\n+                .setNonSecurePort(serviceInstance.getPort())\r\n+                .setMetadataMap(serviceInstance.getMetadata());\r\n+        return eurekaInstanceConfig;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/eureka/package-info.java", "source2": "org/apache/dubbo/registry/eureka/package-info.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,22 +1,22 @@\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 package contains the registry implementations for Netflix Eureka\n- *\n- * @since 2.7.5\n- */\n-package org.apache.dubbo.registry.eureka;\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 package contains the registry implementations for Netflix Eureka\r\n+ *\r\n+ * @since 2.7.5\r\n+ */\r\n+package org.apache.dubbo.registry.eureka;\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-eureka/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -41,16 +41,16 @@\n       <version>${project.parent.version}</version>\n     </dependency>\n     <dependency>\n       <groupId>com.netflix.eureka</groupId>\n       <artifactId>eureka-client</artifactId>\n       <exclusions>\n         <exclusion>\n-          <artifactId>jsr311-api</artifactId>\n           <groupId>javax.ws.rs</groupId>\n+          <artifactId>jsr311-api</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>javax.inject</groupId>\n       <artifactId>javax.inject</artifactId>\n       <version>1</version>\n"}]}]}
