{"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: 18995 bytes, number of entries: 26\n+Zip file size: 19056 bytes, number of entries: 26\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/sofa/\n@@ -10,19 +10,19 @@\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-sofa/\n -rw-r--r--  2.0 unx     5549 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      176 b- defN 20-Apr-01 08:04 META-INF/NOTICE\n--rw-r--r--  2.0 unx    10603 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistry.java\n--rw-r--r--  2.0 unx     1379 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryConstants.java\n--rw-r--r--  2.0 unx     1383 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryFactory.java\n--rw-r--r--  2.0 unx     2340 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryInstance.java\n--rw-r--r--  2.0 unx     9905 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscovery.java\n--rw-r--r--  2.0 unx     1241 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscoveryFactory.java\n+-rw-r--r--  2.0 unx    10899 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistry.java\n+-rw-r--r--  2.0 unx     1422 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryConstants.java\n+-rw-r--r--  2.0 unx     1424 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryFactory.java\n+-rw-r--r--  2.0 unx     2430 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryInstance.java\n+-rw-r--r--  2.0 unx    10159 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscovery.java\n+-rw-r--r--  2.0 unx     1269 b- defN 20-Apr-01 08:04 org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscoveryFactory.java\n -rw-r--r--  2.0 unx       55 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.RegistryFactory\n -rw-r--r--  2.0 unx       64 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery\n -rw-r--r--  2.0 unx       71 b- defN 20-Apr-01 08:04 META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscoveryFactory\n--rw-r--r--  2.0 unx     4787 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml\n+-rw-r--r--  2.0 unx     4654 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml\n -rw-r--r--  2.0 unx       74 b- defN 20-Apr-01 08:04 META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.properties\n-26 files, 49049 bytes uncompressed, 14993 bytes compressed:  69.4%\n+26 files, 49668 bytes uncompressed, 15054 bytes compressed:  69.7%\n"}, {"source1": "zipdetails --redact --scan --utc {}", "source2": "zipdetails --redact --scan --utc {}", "unified_diff": "@@ -281,1041 +281,1041 @@\n 17BC Extract Zip Spec      14 (20) '2.0'\n 17BD Extract OS            00 (0) 'MS-DOS'\n 17BE General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 17C0 Compression Method    0008 (8) 'Deflated'\n 17C2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-17C6 CRC                   67F68BAB (1744210859)\n-17CA Compressed Size       00000A8D (2701)\n-17CE Uncompressed Size     0000296B (10603)\n+17C6 CRC                   5CAA5BA4 (1554668452)\n+17CA Compressed Size       00000AA0 (2720)\n+17CE Uncompressed Size     00002A93 (10899)\n 17D2 Filename Length       0030 (48)\n 17D4 Extra Length          0000 (0)\n 17D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n # WARNING: Offset 0x17D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n 1806 PAYLOAD\n \n-2293 LOCAL HEADER #17      04034B50 (67324752)\n-2297 Extract Zip Spec      14 (20) '2.0'\n-2298 Extract OS            00 (0) 'MS-DOS'\n-2299 General Purpose Flag  0800 (2048)\n+22A6 LOCAL HEADER #17      04034B50 (67324752)\n+22AA Extract Zip Spec      14 (20) '2.0'\n+22AB Extract OS            00 (0) 'MS-DOS'\n+22AC General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-229B Compression Method    0008 (8) 'Deflated'\n-229D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-22A1 CRC                   5E420043 (1581383747)\n-22A5 Compressed Size       000002B5 (693)\n-22A9 Uncompressed Size     00000563 (1379)\n-22AD Filename Length       0039 (57)\n-22AF Extra Length          0000 (0)\n-22B1 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+22AE Compression Method    0008 (8) 'Deflated'\n+22B0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+22B4 CRC                   55DBCEB5 (1440468661)\n+22B8 Compressed Size       000002BE (702)\n+22BC Uncompressed Size     0000058E (1422)\n+22C0 Filename Length       0039 (57)\n+22C2 Extra Length          0000 (0)\n+22C4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x22B1: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x22C4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-22EA PAYLOAD\n+22FD PAYLOAD\n \n-259F LOCAL HEADER #18      04034B50 (67324752)\n-25A3 Extract Zip Spec      14 (20) '2.0'\n-25A4 Extract OS            00 (0) 'MS-DOS'\n-25A5 General Purpose Flag  0800 (2048)\n+25BB LOCAL HEADER #18      04034B50 (67324752)\n+25BF Extract Zip Spec      14 (20) '2.0'\n+25C0 Extract OS            00 (0) 'MS-DOS'\n+25C1 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-25A7 Compression Method    0008 (8) 'Deflated'\n-25A9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-25AD CRC                   F10F61B1 (4044317105)\n-25B1 Compressed Size       000002B7 (695)\n-25B5 Uncompressed Size     00000567 (1383)\n-25B9 Filename Length       0037 (55)\n-25BB Extra Length          0000 (0)\n-25BD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+25C3 Compression Method    0008 (8) 'Deflated'\n+25C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+25C9 CRC                   74ECF448 (1961686088)\n+25CD Compressed Size       000002C0 (704)\n+25D1 Uncompressed Size     00000590 (1424)\n+25D5 Filename Length       0037 (55)\n+25D7 Extra Length          0000 (0)\n+25D9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x25BD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x25D9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-25F4 PAYLOAD\n+2610 PAYLOAD\n \n-28AB LOCAL HEADER #19      04034B50 (67324752)\n-28AF Extract Zip Spec      14 (20) '2.0'\n-28B0 Extract OS            00 (0) 'MS-DOS'\n-28B1 General Purpose Flag  0800 (2048)\n+28D0 LOCAL HEADER #19      04034B50 (67324752)\n+28D4 Extract Zip Spec      14 (20) '2.0'\n+28D5 Extract OS            00 (0) 'MS-DOS'\n+28D6 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-28B3 Compression Method    0008 (8) 'Deflated'\n-28B5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-28B9 CRC                   F71501FC (4145349116)\n-28BD Compressed Size       0000035C (860)\n-28C1 Uncompressed Size     00000924 (2340)\n-28C5 Filename Length       0038 (56)\n-28C7 Extra Length          0000 (0)\n-28C9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+28D8 Compression Method    0008 (8) 'Deflated'\n+28DA Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+28DE CRC                   5119DCCD (1360649421)\n+28E2 Compressed Size       00000363 (867)\n+28E6 Uncompressed Size     0000097E (2430)\n+28EA Filename Length       0038 (56)\n+28EC Extra Length          0000 (0)\n+28EE Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x28C9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x28EE: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2901 PAYLOAD\n+2926 PAYLOAD\n \n-2C5D LOCAL HEADER #20      04034B50 (67324752)\n-2C61 Extract Zip Spec      14 (20) '2.0'\n-2C62 Extract OS            00 (0) 'MS-DOS'\n-2C63 General Purpose Flag  0800 (2048)\n+2C89 LOCAL HEADER #20      04034B50 (67324752)\n+2C8D Extract Zip Spec      14 (20) '2.0'\n+2C8E Extract OS            00 (0) 'MS-DOS'\n+2C8F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-2C65 Compression Method    0008 (8) 'Deflated'\n-2C67 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-2C6B CRC                   B6DFDCE2 (3068124386)\n-2C6F Compressed Size       00000A71 (2673)\n-2C73 Uncompressed Size     000026B1 (9905)\n-2C77 Filename Length       0040 (64)\n-2C79 Extra Length          0000 (0)\n-2C7B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+2C91 Compression Method    0008 (8) 'Deflated'\n+2C93 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+2C97 CRC                   A9FB32A5 (2851812005)\n+2C9B Compressed Size       00000A80 (2688)\n+2C9F Uncompressed Size     000027AF (10159)\n+2CA3 Filename Length       0040 (64)\n+2CA5 Extra Length          0000 (0)\n+2CA7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x2C7B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x2CA7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-2CBB PAYLOAD\n+2CE7 PAYLOAD\n \n-372C LOCAL HEADER #21      04034B50 (67324752)\n-3730 Extract Zip Spec      14 (20) '2.0'\n-3731 Extract OS            00 (0) 'MS-DOS'\n-3732 General Purpose Flag  0800 (2048)\n+3767 LOCAL HEADER #21      04034B50 (67324752)\n+376B Extract Zip Spec      14 (20) '2.0'\n+376C Extract OS            00 (0) 'MS-DOS'\n+376D General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3734 Compression Method    0008 (8) 'Deflated'\n-3736 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-373A CRC                   3C911134 (1016140084)\n-373E Compressed Size       00000264 (612)\n-3742 Uncompressed Size     000004D9 (1241)\n-3746 Filename Length       0047 (71)\n-3748 Extra Length          0000 (0)\n-374A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+376F Compression Method    0008 (8) 'Deflated'\n+3771 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3775 CRC                   1848A62B (407414315)\n+3779 Compressed Size       0000026D (621)\n+377D Uncompressed Size     000004F5 (1269)\n+3781 Filename Length       0047 (71)\n+3783 Extra Length          0000 (0)\n+3785 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x374A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3785: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3791 PAYLOAD\n+37CC PAYLOAD\n \n-39F5 LOCAL HEADER #22      04034B50 (67324752)\n-39F9 Extract Zip Spec      14 (20) '2.0'\n-39FA Extract OS            00 (0) 'MS-DOS'\n-39FB General Purpose Flag  0800 (2048)\n+3A39 LOCAL HEADER #22      04034B50 (67324752)\n+3A3D Extract Zip Spec      14 (20) '2.0'\n+3A3E Extract OS            00 (0) 'MS-DOS'\n+3A3F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-39FD Compression Method    0008 (8) 'Deflated'\n-39FF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A03 CRC                   C14332D3 (3242406611)\n-3A07 Compressed Size       00000031 (49)\n-3A0B Uncompressed Size     00000037 (55)\n-3A0F Filename Length       0041 (65)\n-3A11 Extra Length          0000 (0)\n-3A13 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3A41 Compression Method    0008 (8) 'Deflated'\n+3A43 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3A47 CRC                   C14332D3 (3242406611)\n+3A4B Compressed Size       00000031 (49)\n+3A4F Uncompressed Size     00000037 (55)\n+3A53 Filename Length       0041 (65)\n+3A55 Extra Length          0000 (0)\n+3A57 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3A13: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3A57: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3A54 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3A98 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3A85 LOCAL HEADER #23      04034B50 (67324752)\n-3A89 Extract Zip Spec      14 (20) '2.0'\n-3A8A Extract OS            00 (0) 'MS-DOS'\n-3A8B General Purpose Flag  0800 (2048)\n+3AC9 LOCAL HEADER #23      04034B50 (67324752)\n+3ACD Extract Zip Spec      14 (20) '2.0'\n+3ACE Extract OS            00 (0) 'MS-DOS'\n+3ACF General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3A8D Compression Method    0008 (8) 'Deflated'\n-3A8F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3A93 CRC                   A3C834B2 (2747806898)\n-3A97 Compressed Size       0000003A (58)\n-3A9B Uncompressed Size     00000040 (64)\n-3A9F Filename Length       0049 (73)\n-3AA1 Extra Length          0000 (0)\n-3AA3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3AD1 Compression Method    0008 (8) 'Deflated'\n+3AD3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3AD7 CRC                   A3C834B2 (2747806898)\n+3ADB Compressed Size       0000003A (58)\n+3ADF Uncompressed Size     00000040 (64)\n+3AE3 Filename Length       0049 (73)\n+3AE5 Extra Length          0000 (0)\n+3AE7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3AA3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3AE7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3AEC PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3B30 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3B26 LOCAL HEADER #24      04034B50 (67324752)\n-3B2A Extract Zip Spec      14 (20) '2.0'\n-3B2B Extract OS            00 (0) 'MS-DOS'\n-3B2C General Purpose Flag  0800 (2048)\n+3B6A LOCAL HEADER #24      04034B50 (67324752)\n+3B6E Extract Zip Spec      14 (20) '2.0'\n+3B6F Extract OS            00 (0) 'MS-DOS'\n+3B70 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3B2E Compression Method    0008 (8) 'Deflated'\n-3B30 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3B34 CRC                   9A3129A6 (2586913190)\n-3B38 Compressed Size       00000041 (65)\n-3B3C Uncompressed Size     00000047 (71)\n-3B40 Filename Length       0050 (80)\n-3B42 Extra Length          0000 (0)\n-3B44 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3B72 Compression Method    0008 (8) 'Deflated'\n+3B74 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3B78 CRC                   9A3129A6 (2586913190)\n+3B7C Compressed Size       00000041 (65)\n+3B80 Uncompressed Size     00000047 (71)\n+3B84 Filename Length       0050 (80)\n+3B86 Extra Length          0000 (0)\n+3B88 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3B44: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3B88: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3B94 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+3BD8 PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-3BD5 LOCAL HEADER #25      04034B50 (67324752)\n-3BD9 Extract Zip Spec      14 (20) '2.0'\n-3BDA Extract OS            00 (0) 'MS-DOS'\n-3BDB General Purpose Flag  0800 (2048)\n+3C19 LOCAL HEADER #25      04034B50 (67324752)\n+3C1D Extract Zip Spec      14 (20) '2.0'\n+3C1E Extract OS            00 (0) 'MS-DOS'\n+3C1F General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-3BDD Compression Method    0008 (8) 'Deflated'\n-3BDF Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-3BE3 CRC                   6F2313AC (1864569772)\n-3BE7 Compressed Size       000004B1 (1201)\n-3BEB Uncompressed Size     000012B3 (4787)\n-3BEF Filename Length       003B (59)\n-3BF1 Extra Length          0000 (0)\n-3BF3 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+3C21 Compression Method    0008 (8) 'Deflated'\n+3C23 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+3C27 CRC                   72A63AD4 (1923496660)\n+3C2B Compressed Size       000004AA (1194)\n+3C2F Uncompressed Size     0000122E (4654)\n+3C33 Filename Length       003B (59)\n+3C35 Extra Length          0000 (0)\n+3C37 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x3BF3: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x3C37: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-3C2E PAYLOAD\n+3C72 PAYLOAD\n \n-40DF LOCAL HEADER #26      04034B50 (67324752)\n-40E3 Extract Zip Spec      14 (20) '2.0'\n-40E4 Extract OS            00 (0) 'MS-DOS'\n-40E5 General Purpose Flag  0800 (2048)\n+411C LOCAL HEADER #26      04034B50 (67324752)\n+4120 Extract Zip Spec      14 (20) '2.0'\n+4121 Extract OS            00 (0) 'MS-DOS'\n+4122 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-40E7 Compression Method    0008 (8) 'Deflated'\n-40E9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-40ED CRC                   88872903 (2290559235)\n-40F1 Compressed Size       00000048 (72)\n-40F5 Uncompressed Size     0000004A (74)\n-40F9 Filename Length       0042 (66)\n-40FB Extra Length          0000 (0)\n-40FD Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4124 Compression Method    0008 (8) 'Deflated'\n+4126 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+412A CRC                   88872903 (2290559235)\n+412E Compressed Size       00000048 (72)\n+4132 Uncompressed Size     0000004A (74)\n+4136 Filename Length       0042 (66)\n+4138 Extra Length          0000 (0)\n+413A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x40FD: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x413A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-413F PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n+417C PAYLOAD               XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n \n-4187 CENTRAL HEADER #1     02014B50 (33639248)\n-418B Created Zip Spec      14 (20) '2.0'\n-418C Created OS            03 (3) 'Unix'\n-418D Extract Zip Spec      14 (20) '2.0'\n-418E Extract OS            00 (0) 'MS-DOS'\n-418F General Purpose Flag  0800 (2048)\n+41C4 CENTRAL HEADER #1     02014B50 (33639248)\n+41C8 Created Zip Spec      14 (20) '2.0'\n+41C9 Created OS            03 (3) 'Unix'\n+41CA Extract Zip Spec      14 (20) '2.0'\n+41CB Extract OS            00 (0) 'MS-DOS'\n+41CC General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4191 Compression Method    0008 (8) 'Deflated'\n-4193 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4197 CRC                   A689EB18 (2794056472)\n-419B Compressed Size       00000042 (66)\n-419F Uncompressed Size     00000040 (64)\n-41A3 Filename Length       0014 (20)\n-41A5 Extra Length          0000 (0)\n-41A7 Comment Length        0000 (0)\n-41A9 Disk Start            0000 (0)\n-41AB Int File Attributes   0000 (0)\n+41CE Compression Method    0008 (8) 'Deflated'\n+41D0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+41D4 CRC                   A689EB18 (2794056472)\n+41D8 Compressed Size       00000042 (66)\n+41DC Uncompressed Size     00000040 (64)\n+41E0 Filename Length       0014 (20)\n+41E2 Extra Length          0000 (0)\n+41E4 Comment Length        0000 (0)\n+41E6 Disk Start            0000 (0)\n+41E8 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-41AD Ext File Attributes   81A40000 (2175008768)\n+41EA 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-41B1 Local Header Offset   00000000 (0)\n-41B5 Filename              'XXXXXXXXXXXXXXXXXXXX'\n+41EE Local Header Offset   00000000 (0)\n+41F2 Filename              'XXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x41B5: Filename 'XXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x41F2: Filename 'XXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-41C9 CENTRAL HEADER #2     02014B50 (33639248)\n-41CD Created Zip Spec      14 (20) '2.0'\n-41CE Created OS            03 (3) 'Unix'\n-41CF Extract Zip Spec      0A (10) '1.0'\n-41D0 Extract OS            00 (0) 'MS-DOS'\n-41D1 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-41D3 Compression Method    0000 (0) 'Stored'\n-41D5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-41D9 CRC                   00000000 (0)\n-41DD Compressed Size       00000000 (0)\n-41E1 Uncompressed Size     00000000 (0)\n-41E5 Filename Length       0009 (9)\n-41E7 Extra Length          0000 (0)\n-41E9 Comment Length        0000 (0)\n-41EB Disk Start            0000 (0)\n-41ED Int File Attributes   0000 (0)\n+4206 CENTRAL HEADER #2     02014B50 (33639248)\n+420A Created Zip Spec      14 (20) '2.0'\n+420B Created OS            03 (3) 'Unix'\n+420C Extract Zip Spec      0A (10) '1.0'\n+420D Extract OS            00 (0) 'MS-DOS'\n+420E General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4210 Compression Method    0000 (0) 'Stored'\n+4212 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4216 CRC                   00000000 (0)\n+421A Compressed Size       00000000 (0)\n+421E Uncompressed Size     00000000 (0)\n+4222 Filename Length       0009 (9)\n+4224 Extra Length          0000 (0)\n+4226 Comment Length        0000 (0)\n+4228 Disk Start            0000 (0)\n+422A Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-41EF Ext File Attributes   41ED0010 (1106051088)\n+422C 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-41F3 Local Header Offset   00000074 (116)\n-41F7 Filename              'XXXXXXXXX'\n+4230 Local Header Offset   00000074 (116)\n+4234 Filename              'XXXXXXXXX'\n #\n-# WARNING: Offset 0x41F7: Filename 'XXXXXXXXX'\n+# WARNING: Offset 0x4234: Filename 'XXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x41F7: Directory 'XXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4234: Directory 'XXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x41CF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n+# WARNING: Offset 0x420C: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXX'\n #\n \n-4200 CENTRAL HEADER #3     02014B50 (33639248)\n-4204 Created Zip Spec      14 (20) '2.0'\n-4205 Created OS            03 (3) 'Unix'\n-4206 Extract Zip Spec      0A (10) '1.0'\n-4207 Extract OS            00 (0) 'MS-DOS'\n-4208 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-420A Compression Method    0000 (0) 'Stored'\n-420C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4210 CRC                   00000000 (0)\n-4214 Compressed Size       00000000 (0)\n-4218 Uncompressed Size     00000000 (0)\n-421C Filename Length       0004 (4)\n-421E Extra Length          0000 (0)\n-4220 Comment Length        0000 (0)\n-4222 Disk Start            0000 (0)\n-4224 Int File Attributes   0000 (0)\n+423D CENTRAL HEADER #3     02014B50 (33639248)\n+4241 Created Zip Spec      14 (20) '2.0'\n+4242 Created OS            03 (3) 'Unix'\n+4243 Extract Zip Spec      0A (10) '1.0'\n+4244 Extract OS            00 (0) 'MS-DOS'\n+4245 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4247 Compression Method    0000 (0) 'Stored'\n+4249 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+424D CRC                   00000000 (0)\n+4251 Compressed Size       00000000 (0)\n+4255 Uncompressed Size     00000000 (0)\n+4259 Filename Length       0004 (4)\n+425B Extra Length          0000 (0)\n+425D Comment Length        0000 (0)\n+425F Disk Start            0000 (0)\n+4261 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4226 Ext File Attributes   41ED0010 (1106051088)\n+4263 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-422A Local Header Offset   0000009B (155)\n-422E Filename              'XXXX'\n+4267 Local Header Offset   0000009B (155)\n+426B Filename              'XXXX'\n #\n-# WARNING: Offset 0x422E: Filename 'XXXX'\n+# WARNING: Offset 0x426B: Filename 'XXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x422E: Directory 'XXXX' must end in a '/'\n+# ERROR: Offset 0x426B: Directory 'XXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4206: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n+# WARNING: Offset 0x4243: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXX'\n #\n \n-4232 CENTRAL HEADER #4     02014B50 (33639248)\n-4236 Created Zip Spec      14 (20) '2.0'\n-4237 Created OS            03 (3) 'Unix'\n-4238 Extract Zip Spec      0A (10) '1.0'\n-4239 Extract OS            00 (0) 'MS-DOS'\n-423A General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-423C Compression Method    0000 (0) 'Stored'\n-423E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4242 CRC                   00000000 (0)\n-4246 Compressed Size       00000000 (0)\n-424A Uncompressed Size     00000000 (0)\n-424E Filename Length       000B (11)\n-4250 Extra Length          0000 (0)\n-4252 Comment Length        0000 (0)\n-4254 Disk Start            0000 (0)\n-4256 Int File Attributes   0000 (0)\n+426F CENTRAL HEADER #4     02014B50 (33639248)\n+4273 Created Zip Spec      14 (20) '2.0'\n+4274 Created OS            03 (3) 'Unix'\n+4275 Extract Zip Spec      0A (10) '1.0'\n+4276 Extract OS            00 (0) 'MS-DOS'\n+4277 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4279 Compression Method    0000 (0) 'Stored'\n+427B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+427F CRC                   00000000 (0)\n+4283 Compressed Size       00000000 (0)\n+4287 Uncompressed Size     00000000 (0)\n+428B Filename Length       000B (11)\n+428D Extra Length          0000 (0)\n+428F Comment Length        0000 (0)\n+4291 Disk Start            0000 (0)\n+4293 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4258 Ext File Attributes   41ED0010 (1106051088)\n+4295 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-425C Local Header Offset   000000BD (189)\n-4260 Filename              'XXXXXXXXXXX'\n+4299 Local Header Offset   000000BD (189)\n+429D Filename              'XXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4260: Filename 'XXXXXXXXXXX'\n+# WARNING: Offset 0x429D: Filename 'XXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4260: Directory 'XXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x429D: Directory 'XXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4238: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n+# WARNING: Offset 0x4275: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXX'\n #\n \n-426B CENTRAL HEADER #5     02014B50 (33639248)\n-426F Created Zip Spec      14 (20) '2.0'\n-4270 Created OS            03 (3) 'Unix'\n-4271 Extract Zip Spec      0A (10) '1.0'\n-4272 Extract OS            00 (0) 'MS-DOS'\n-4273 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4275 Compression Method    0000 (0) 'Stored'\n-4277 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-427B CRC                   00000000 (0)\n-427F Compressed Size       00000000 (0)\n-4283 Uncompressed Size     00000000 (0)\n-4287 Filename Length       0011 (17)\n-4289 Extra Length          0000 (0)\n-428B Comment Length        0000 (0)\n-428D Disk Start            0000 (0)\n-428F Int File Attributes   0000 (0)\n+42A8 CENTRAL HEADER #5     02014B50 (33639248)\n+42AC Created Zip Spec      14 (20) '2.0'\n+42AD Created OS            03 (3) 'Unix'\n+42AE Extract Zip Spec      0A (10) '1.0'\n+42AF Extract OS            00 (0) 'MS-DOS'\n+42B0 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+42B2 Compression Method    0000 (0) 'Stored'\n+42B4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+42B8 CRC                   00000000 (0)\n+42BC Compressed Size       00000000 (0)\n+42C0 Uncompressed Size     00000000 (0)\n+42C4 Filename Length       0011 (17)\n+42C6 Extra Length          0000 (0)\n+42C8 Comment Length        0000 (0)\n+42CA Disk Start            0000 (0)\n+42CC Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4291 Ext File Attributes   41ED0010 (1106051088)\n+42CE 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-4295 Local Header Offset   000000E6 (230)\n-4299 Filename              'XXXXXXXXXXXXXXXXX'\n+42D2 Local Header Offset   000000E6 (230)\n+42D6 Filename              'XXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4299: Filename 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42D6: Filename 'XXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4299: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x42D6: Directory 'XXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4271: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42AE: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXX'\n #\n \n-42AA CENTRAL HEADER #6     02014B50 (33639248)\n-42AE Created Zip Spec      14 (20) '2.0'\n-42AF Created OS            03 (3) 'Unix'\n-42B0 Extract Zip Spec      0A (10) '1.0'\n-42B1 Extract OS            00 (0) 'MS-DOS'\n-42B2 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-42B4 Compression Method    0000 (0) 'Stored'\n-42B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-42BA CRC                   00000000 (0)\n-42BE Compressed Size       00000000 (0)\n-42C2 Uncompressed Size     00000000 (0)\n-42C6 Filename Length       001A (26)\n-42C8 Extra Length          0000 (0)\n-42CA Comment Length        0000 (0)\n-42CC Disk Start            0000 (0)\n-42CE Int File Attributes   0000 (0)\n+42E7 CENTRAL HEADER #6     02014B50 (33639248)\n+42EB Created Zip Spec      14 (20) '2.0'\n+42EC Created OS            03 (3) 'Unix'\n+42ED Extract Zip Spec      0A (10) '1.0'\n+42EE Extract OS            00 (0) 'MS-DOS'\n+42EF General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+42F1 Compression Method    0000 (0) 'Stored'\n+42F3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+42F7 CRC                   00000000 (0)\n+42FB Compressed Size       00000000 (0)\n+42FF Uncompressed Size     00000000 (0)\n+4303 Filename Length       001A (26)\n+4305 Extra Length          0000 (0)\n+4307 Comment Length        0000 (0)\n+4309 Disk Start            0000 (0)\n+430B Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-42D0 Ext File Attributes   41ED0010 (1106051088)\n+430D 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-42D4 Local Header Offset   00000115 (277)\n-42D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4311 Local Header Offset   00000115 (277)\n+4315 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x42D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4315: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x42D8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x4315: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x42B0: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x42ED: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-42F2 CENTRAL HEADER #7     02014B50 (33639248)\n-42F6 Created Zip Spec      14 (20) '2.0'\n-42F7 Created OS            03 (3) 'Unix'\n-42F8 Extract Zip Spec      0A (10) '1.0'\n-42F9 Extract OS            00 (0) 'MS-DOS'\n-42FA General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-42FC Compression Method    0000 (0) 'Stored'\n-42FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4302 CRC                   00000000 (0)\n-4306 Compressed Size       00000000 (0)\n-430A Uncompressed Size     00000000 (0)\n-430E Filename Length       001F (31)\n-4310 Extra Length          0000 (0)\n-4312 Comment Length        0000 (0)\n-4314 Disk Start            0000 (0)\n-4316 Int File Attributes   0000 (0)\n+432F CENTRAL HEADER #7     02014B50 (33639248)\n+4333 Created Zip Spec      14 (20) '2.0'\n+4334 Created OS            03 (3) 'Unix'\n+4335 Extract Zip Spec      0A (10) '1.0'\n+4336 Extract OS            00 (0) 'MS-DOS'\n+4337 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4339 Compression Method    0000 (0) 'Stored'\n+433B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+433F CRC                   00000000 (0)\n+4343 Compressed Size       00000000 (0)\n+4347 Uncompressed Size     00000000 (0)\n+434B Filename Length       001F (31)\n+434D Extra Length          0000 (0)\n+434F Comment Length        0000 (0)\n+4351 Disk Start            0000 (0)\n+4353 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4318 Ext File Attributes   41ED0010 (1106051088)\n+4355 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-431C Local Header Offset   0000014D (333)\n-4320 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4359 Local Header Offset   0000014D (333)\n+435D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4320: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x435D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x4320: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x435D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x42F8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4335: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-433F CENTRAL HEADER #8     02014B50 (33639248)\n-4343 Created Zip Spec      14 (20) '2.0'\n-4344 Created OS            03 (3) 'Unix'\n-4345 Extract Zip Spec      0A (10) '1.0'\n-4346 Extract OS            00 (0) 'MS-DOS'\n-4347 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4349 Compression Method    0000 (0) 'Stored'\n-434B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-434F CRC                   00000000 (0)\n-4353 Compressed Size       00000000 (0)\n-4357 Uncompressed Size     00000000 (0)\n-435B Filename Length       000F (15)\n-435D Extra Length          0000 (0)\n-435F Comment Length        0000 (0)\n-4361 Disk Start            0000 (0)\n-4363 Int File Attributes   0000 (0)\n-     [Bit 0]               0 'Binary Data'\n-4365 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-4369 Local Header Offset   0000018A (394)\n-436D Filename              'XXXXXXXXXXXXXXX'\n-#\n-# WARNING: Offset 0x436D: Filename 'XXXXXXXXXXXXXXX'\n-#          Zero length filename\n-#\n-# ERROR: Offset 0x436D: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n-#        'External Attributes' flag this as a directory\n-#\n-# WARNING: Offset 0x4345: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n-#\n-\n-437C CENTRAL HEADER #9     02014B50 (33639248)\n+437C CENTRAL HEADER #8     02014B50 (33639248)\n 4380 Created Zip Spec      14 (20) '2.0'\n 4381 Created OS            03 (3) 'Unix'\n 4382 Extract Zip Spec      0A (10) '1.0'\n 4383 Extract OS            00 (0) 'MS-DOS'\n 4384 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n 4386 Compression Method    0000 (0) 'Stored'\n 4388 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n 438C CRC                   00000000 (0)\n 4390 Compressed Size       00000000 (0)\n 4394 Uncompressed Size     00000000 (0)\n-4398 Filename Length       0018 (24)\n+4398 Filename Length       000F (15)\n 439A Extra Length          0000 (0)\n 439C Comment Length        0000 (0)\n 439E Disk Start            0000 (0)\n 43A0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n 43A2 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-43A6 Local Header Offset   000001B7 (439)\n-43AA Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n+43A6 Local Header Offset   0000018A (394)\n+43AA Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x43AA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x43AA: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x43AA: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x43AA: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4382: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4382: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-43C2 CENTRAL HEADER #10    02014B50 (33639248)\n-43C6 Created Zip Spec      14 (20) '2.0'\n-43C7 Created OS            03 (3) 'Unix'\n-43C8 Extract Zip Spec      0A (10) '1.0'\n-43C9 Extract OS            00 (0) 'MS-DOS'\n-43CA General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-43CC Compression Method    0000 (0) 'Stored'\n-43CE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-43D2 CRC                   00000000 (0)\n-43D6 Compressed Size       00000000 (0)\n-43DA Uncompressed Size     00000000 (0)\n-43DE Filename Length       000F (15)\n-43E0 Extra Length          0000 (0)\n-43E2 Comment Length        0000 (0)\n-43E4 Disk Start            0000 (0)\n-43E6 Int File Attributes   0000 (0)\n+43B9 CENTRAL HEADER #9     02014B50 (33639248)\n+43BD Created Zip Spec      14 (20) '2.0'\n+43BE Created OS            03 (3) 'Unix'\n+43BF Extract Zip Spec      0A (10) '1.0'\n+43C0 Extract OS            00 (0) 'MS-DOS'\n+43C1 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+43C3 Compression Method    0000 (0) 'Stored'\n+43C5 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+43C9 CRC                   00000000 (0)\n+43CD Compressed Size       00000000 (0)\n+43D1 Uncompressed Size     00000000 (0)\n+43D5 Filename Length       0018 (24)\n+43D7 Extra Length          0000 (0)\n+43D9 Comment Length        0000 (0)\n+43DB Disk Start            0000 (0)\n+43DD Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-43E8 Ext File Attributes   41ED0010 (1106051088)\n+43DF 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-43EC Local Header Offset   000001ED (493)\n-43F0 Filename              'XXXXXXXXXXXXXXX'\n+43E3 Local Header Offset   000001B7 (439)\n+43E7 Filename              'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x43F0: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x43E7: Filename 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x43F0: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x43E7: Directory 'XXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x43C8: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x43BF: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-43FF CENTRAL HEADER #11    02014B50 (33639248)\n+43FF CENTRAL HEADER #10    02014B50 (33639248)\n 4403 Created Zip Spec      14 (20) '2.0'\n 4404 Created OS            03 (3) 'Unix'\n 4405 Extract Zip Spec      0A (10) '1.0'\n 4406 Extract OS            00 (0) 'MS-DOS'\n 4407 General Purpose Flag  0800 (2048)\n      [Bit 11]              1 'Language Encoding'\n 4409 Compression Method    0000 (0) 'Stored'\n 440B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n 440F CRC                   00000000 (0)\n 4413 Compressed Size       00000000 (0)\n 4417 Uncompressed Size     00000000 (0)\n-441B Filename Length       0020 (32)\n+441B Filename Length       000F (15)\n 441D Extra Length          0000 (0)\n 441F Comment Length        0000 (0)\n 4421 Disk Start            0000 (0)\n 4423 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n 4425 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-4429 Local Header Offset   0000021A (538)\n-442D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4429 Local Header Offset   000001ED (493)\n+442D Filename              'XXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x442D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x442D: Filename 'XXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x442D: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x442D: Directory 'XXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4405: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4405: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXX'\n #\n \n-444D CENTRAL HEADER #12    02014B50 (33639248)\n-4451 Created Zip Spec      14 (20) '2.0'\n-4452 Created OS            03 (3) 'Unix'\n-4453 Extract Zip Spec      0A (10) '1.0'\n-4454 Extract OS            00 (0) 'MS-DOS'\n-4455 General Purpose Flag  0800 (2048)\n-     [Bit 11]              1 'Language Encoding'\n-4457 Compression Method    0000 (0) 'Stored'\n-4459 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-445D CRC                   00000000 (0)\n-4461 Compressed Size       00000000 (0)\n-4465 Uncompressed Size     00000000 (0)\n-4469 Filename Length       0034 (52)\n-446B Extra Length          0000 (0)\n-446D Comment Length        0000 (0)\n-446F Disk Start            0000 (0)\n-4471 Int File Attributes   0000 (0)\n+443C CENTRAL HEADER #11    02014B50 (33639248)\n+4440 Created Zip Spec      14 (20) '2.0'\n+4441 Created OS            03 (3) 'Unix'\n+4442 Extract Zip Spec      0A (10) '1.0'\n+4443 Extract OS            00 (0) 'MS-DOS'\n+4444 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4446 Compression Method    0000 (0) 'Stored'\n+4448 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+444C CRC                   00000000 (0)\n+4450 Compressed Size       00000000 (0)\n+4454 Uncompressed Size     00000000 (0)\n+4458 Filename Length       0020 (32)\n+445A Extra Length          0000 (0)\n+445C Comment Length        0000 (0)\n+445E Disk Start            0000 (0)\n+4460 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4473 Ext File Attributes   41ED0010 (1106051088)\n+4462 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-4477 Local Header Offset   00000258 (600)\n-447B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4466 Local Header Offset   0000021A (538)\n+446A Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x447B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x446A: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n-# ERROR: Offset 0x447B: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+# ERROR: Offset 0x446A: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n #        'External Attributes' flag this as a directory\n #\n-# WARNING: Offset 0x4453: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4442: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n \n-44AF CENTRAL HEADER #13    02014B50 (33639248)\n-44B3 Created Zip Spec      14 (20) '2.0'\n-44B4 Created OS            03 (3) 'Unix'\n-44B5 Extract Zip Spec      14 (20) '2.0'\n-44B6 Extract OS            00 (0) 'MS-DOS'\n-44B7 General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n-     [Bit 11]              1 'Language Encoding'\n-44B9 Compression Method    0008 (8) 'Deflated'\n-44BB Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-44BF CRC                   C2CE7E1E (3268312606)\n-44C3 Compressed Size       00000492 (1170)\n-44C7 Uncompressed Size     000015AD (5549)\n-44CB Filename Length       0015 (21)\n-44CD Extra Length          0000 (0)\n-44CF Comment Length        0000 (0)\n-44D1 Disk Start            0000 (0)\n-44D3 Int File Attributes   0000 (0)\n+448A CENTRAL HEADER #12    02014B50 (33639248)\n+448E Created Zip Spec      14 (20) '2.0'\n+448F Created OS            03 (3) 'Unix'\n+4490 Extract Zip Spec      0A (10) '1.0'\n+4491 Extract OS            00 (0) 'MS-DOS'\n+4492 General Purpose Flag  0800 (2048)\n+     [Bit 11]              1 'Language Encoding'\n+4494 Compression Method    0000 (0) 'Stored'\n+4496 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+449A CRC                   00000000 (0)\n+449E Compressed Size       00000000 (0)\n+44A2 Uncompressed Size     00000000 (0)\n+44A6 Filename Length       0034 (52)\n+44A8 Extra Length          0000 (0)\n+44AA Comment Length        0000 (0)\n+44AC Disk Start            0000 (0)\n+44AE Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-44D5 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-44D9 Local Header Offset   000002AA (682)\n-44DD Filename              'XXXXXXXXXXXXXXXXXXXXX'\n+44B0 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+44B4 Local Header Offset   00000258 (600)\n+44B8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x44DD: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x44B8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n+# ERROR: Offset 0x44B8: Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' must end in a '/'\n+#        'External Attributes' flag this as a directory\n+#\n+# WARNING: Offset 0x4490: 'Extract Zip Spec' is '1.0'. Need value >= '2.0' for Directory 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+#\n \n-44F2 CENTRAL HEADER #14    02014B50 (33639248)\n-44F6 Created Zip Spec      14 (20) '2.0'\n-44F7 Created OS            03 (3) 'Unix'\n-44F8 Extract Zip Spec      14 (20) '2.0'\n-44F9 Extract OS            00 (0) 'MS-DOS'\n-44FA General Purpose Flag  0800 (2048)\n-     [Bits 1-2]            0 'Normal Compression'\n-     [Bit 11]              1 'Language Encoding'\n-44FC Compression Method    0008 (8) 'Deflated'\n-44FE Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4502 CRC                   86E2B4B4 (2263004340)\n-4506 Compressed Size       00000F6D (3949)\n-450A Uncompressed Size     00002C5E (11358)\n-450E Filename Length       0010 (16)\n-4510 Extra Length          0000 (0)\n-4512 Comment Length        0000 (0)\n-4514 Disk Start            0000 (0)\n-4516 Int File Attributes   0000 (0)\n+44EC CENTRAL HEADER #13    02014B50 (33639248)\n+44F0 Created Zip Spec      14 (20) '2.0'\n+44F1 Created OS            03 (3) 'Unix'\n+44F2 Extract Zip Spec      14 (20) '2.0'\n+44F3 Extract OS            00 (0) 'MS-DOS'\n+44F4 General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+44F6 Compression Method    0008 (8) 'Deflated'\n+44F8 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+44FC CRC                   C2CE7E1E (3268312606)\n+4500 Compressed Size       00000492 (1170)\n+4504 Uncompressed Size     000015AD (5549)\n+4508 Filename Length       0015 (21)\n+450A Extra Length          0000 (0)\n+450C Comment Length        0000 (0)\n+450E Disk Start            0000 (0)\n+4510 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4518 Ext File Attributes   81A40000 (2175008768)\n+4512 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-451C Local Header Offset   0000076F (1903)\n-4520 Filename              'XXXXXXXXXXXXXXXX'\n+4516 Local Header Offset   000002AA (682)\n+451A Filename              'XXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4520: Filename 'XXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x451A: Filename 'XXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4530 CENTRAL HEADER #15    02014B50 (33639248)\n-4534 Created Zip Spec      14 (20) '2.0'\n-4535 Created OS            03 (3) 'Unix'\n-4536 Extract Zip Spec      14 (20) '2.0'\n-4537 Extract OS            00 (0) 'MS-DOS'\n-4538 General Purpose Flag  0800 (2048)\n+452F CENTRAL HEADER #14    02014B50 (33639248)\n+4533 Created Zip Spec      14 (20) '2.0'\n+4534 Created OS            03 (3) 'Unix'\n+4535 Extract Zip Spec      14 (20) '2.0'\n+4536 Extract OS            00 (0) 'MS-DOS'\n+4537 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-453A Compression Method    0008 (8) 'Deflated'\n-453C Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4540 CRC                   C293BB87 (3264461703)\n-4544 Compressed Size       00000081 (129)\n-4548 Uncompressed Size     000000B0 (176)\n-454C Filename Length       000F (15)\n-454E Extra Length          0000 (0)\n-4550 Comment Length        0000 (0)\n-4552 Disk Start            0000 (0)\n-4554 Int File Attributes   0000 (0)\n+4539 Compression Method    0008 (8) 'Deflated'\n+453B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+453F CRC                   86E2B4B4 (2263004340)\n+4543 Compressed Size       00000F6D (3949)\n+4547 Uncompressed Size     00002C5E (11358)\n+454B Filename Length       0010 (16)\n+454D Extra Length          0000 (0)\n+454F Comment Length        0000 (0)\n+4551 Disk Start            0000 (0)\n+4553 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4556 Ext File Attributes   81A40000 (2175008768)\n+4555 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-455A Local Header Offset   0000170A (5898)\n-455E Filename              'XXXXXXXXXXXXXXX'\n+4559 Local Header Offset   0000076F (1903)\n+455D Filename              'XXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x455E: Filename 'XXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x455D: Filename 'XXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-456D CENTRAL HEADER #16    02014B50 (33639248)\n+456D CENTRAL HEADER #15    02014B50 (33639248)\n 4571 Created Zip Spec      14 (20) '2.0'\n 4572 Created OS            03 (3) 'Unix'\n 4573 Extract Zip Spec      14 (20) '2.0'\n 4574 Extract OS            00 (0) 'MS-DOS'\n 4575 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n 4577 Compression Method    0008 (8) 'Deflated'\n 4579 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-457D CRC                   67F68BAB (1744210859)\n-4581 Compressed Size       00000A8D (2701)\n-4585 Uncompressed Size     0000296B (10603)\n-4589 Filename Length       0030 (48)\n+457D CRC                   C293BB87 (3264461703)\n+4581 Compressed Size       00000081 (129)\n+4585 Uncompressed Size     000000B0 (176)\n+4589 Filename Length       000F (15)\n 458B Extra Length          0000 (0)\n 458D Comment Length        0000 (0)\n 458F Disk Start            0000 (0)\n 4591 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n 4593 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-4597 Local Header Offset   000017B8 (6072)\n-459B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4597 Local Header Offset   0000170A (5898)\n+459B Filename              'XXXXXXXXXXXXXXX'\n+#\n+# WARNING: Offset 0x459B: Filename 'XXXXXXXXXXXXXXX'\n+#          Zero length filename\n+#\n+\n+45AA CENTRAL HEADER #16    02014B50 (33639248)\n+45AE Created Zip Spec      14 (20) '2.0'\n+45AF Created OS            03 (3) 'Unix'\n+45B0 Extract Zip Spec      14 (20) '2.0'\n+45B1 Extract OS            00 (0) 'MS-DOS'\n+45B2 General Purpose Flag  0800 (2048)\n+     [Bits 1-2]            0 'Normal Compression'\n+     [Bit 11]              1 'Language Encoding'\n+45B4 Compression Method    0008 (8) 'Deflated'\n+45B6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+45BA CRC                   5CAA5BA4 (1554668452)\n+45BE Compressed Size       00000AA0 (2720)\n+45C2 Uncompressed Size     00002A93 (10899)\n+45C6 Filename Length       0030 (48)\n+45C8 Extra Length          0000 (0)\n+45CA Comment Length        0000 (0)\n+45CC Disk Start            0000 (0)\n+45CE Int File Attributes   0000 (0)\n+     [Bit 0]               0 'Binary Data'\n+45D0 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+45D4 Local Header Offset   000017B8 (6072)\n+45D8 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x459B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x45D8: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-45CB CENTRAL HEADER #17    02014B50 (33639248)\n-45CF Created Zip Spec      14 (20) '2.0'\n-45D0 Created OS            03 (3) 'Unix'\n-45D1 Extract Zip Spec      14 (20) '2.0'\n-45D2 Extract OS            00 (0) 'MS-DOS'\n-45D3 General Purpose Flag  0800 (2048)\n+4608 CENTRAL HEADER #17    02014B50 (33639248)\n+460C Created Zip Spec      14 (20) '2.0'\n+460D Created OS            03 (3) 'Unix'\n+460E Extract Zip Spec      14 (20) '2.0'\n+460F Extract OS            00 (0) 'MS-DOS'\n+4610 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-45D5 Compression Method    0008 (8) 'Deflated'\n-45D7 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-45DB CRC                   5E420043 (1581383747)\n-45DF Compressed Size       000002B5 (693)\n-45E3 Uncompressed Size     00000563 (1379)\n-45E7 Filename Length       0039 (57)\n-45E9 Extra Length          0000 (0)\n-45EB Comment Length        0000 (0)\n-45ED Disk Start            0000 (0)\n-45EF Int File Attributes   0000 (0)\n+4612 Compression Method    0008 (8) 'Deflated'\n+4614 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4618 CRC                   55DBCEB5 (1440468661)\n+461C Compressed Size       000002BE (702)\n+4620 Uncompressed Size     0000058E (1422)\n+4624 Filename Length       0039 (57)\n+4626 Extra Length          0000 (0)\n+4628 Comment Length        0000 (0)\n+462A Disk Start            0000 (0)\n+462C Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-45F1 Ext File Attributes   81A40000 (2175008768)\n+462E 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-45F5 Local Header Offset   00002293 (8851)\n-45F9 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4632 Local Header Offset   000022A6 (8870)\n+4636 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x45F9: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4636: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4632 CENTRAL HEADER #18    02014B50 (33639248)\n-4636 Created Zip Spec      14 (20) '2.0'\n-4637 Created OS            03 (3) 'Unix'\n-4638 Extract Zip Spec      14 (20) '2.0'\n-4639 Extract OS            00 (0) 'MS-DOS'\n-463A General Purpose Flag  0800 (2048)\n+466F CENTRAL HEADER #18    02014B50 (33639248)\n+4673 Created Zip Spec      14 (20) '2.0'\n+4674 Created OS            03 (3) 'Unix'\n+4675 Extract Zip Spec      14 (20) '2.0'\n+4676 Extract OS            00 (0) 'MS-DOS'\n+4677 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-463C Compression Method    0008 (8) 'Deflated'\n-463E Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4642 CRC                   F10F61B1 (4044317105)\n-4646 Compressed Size       000002B7 (695)\n-464A Uncompressed Size     00000567 (1383)\n-464E Filename Length       0037 (55)\n-4650 Extra Length          0000 (0)\n-4652 Comment Length        0000 (0)\n-4654 Disk Start            0000 (0)\n-4656 Int File Attributes   0000 (0)\n+4679 Compression Method    0008 (8) 'Deflated'\n+467B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+467F CRC                   74ECF448 (1961686088)\n+4683 Compressed Size       000002C0 (704)\n+4687 Uncompressed Size     00000590 (1424)\n+468B Filename Length       0037 (55)\n+468D Extra Length          0000 (0)\n+468F Comment Length        0000 (0)\n+4691 Disk Start            0000 (0)\n+4693 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4658 Ext File Attributes   81A40000 (2175008768)\n+4695 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-465C Local Header Offset   0000259F (9631)\n-4660 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4699 Local Header Offset   000025BB (9659)\n+469D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4660: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x469D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4697 CENTRAL HEADER #19    02014B50 (33639248)\n-469B Created Zip Spec      14 (20) '2.0'\n-469C Created OS            03 (3) 'Unix'\n-469D Extract Zip Spec      14 (20) '2.0'\n-469E Extract OS            00 (0) 'MS-DOS'\n-469F General Purpose Flag  0800 (2048)\n+46D4 CENTRAL HEADER #19    02014B50 (33639248)\n+46D8 Created Zip Spec      14 (20) '2.0'\n+46D9 Created OS            03 (3) 'Unix'\n+46DA Extract Zip Spec      14 (20) '2.0'\n+46DB Extract OS            00 (0) 'MS-DOS'\n+46DC General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-46A1 Compression Method    0008 (8) 'Deflated'\n-46A3 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-46A7 CRC                   F71501FC (4145349116)\n-46AB Compressed Size       0000035C (860)\n-46AF Uncompressed Size     00000924 (2340)\n-46B3 Filename Length       0038 (56)\n-46B5 Extra Length          0000 (0)\n-46B7 Comment Length        0000 (0)\n-46B9 Disk Start            0000 (0)\n-46BB Int File Attributes   0000 (0)\n+46DE Compression Method    0008 (8) 'Deflated'\n+46E0 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+46E4 CRC                   5119DCCD (1360649421)\n+46E8 Compressed Size       00000363 (867)\n+46EC Uncompressed Size     0000097E (2430)\n+46F0 Filename Length       0038 (56)\n+46F2 Extra Length          0000 (0)\n+46F4 Comment Length        0000 (0)\n+46F6 Disk Start            0000 (0)\n+46F8 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-46BD Ext File Attributes   81A40000 (2175008768)\n+46FA 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-46C1 Local Header Offset   000028AB (10411)\n-46C5 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+46FE Local Header Offset   000028D0 (10448)\n+4702 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x46C5: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4702: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-46FD CENTRAL HEADER #20    02014B50 (33639248)\n-4701 Created Zip Spec      14 (20) '2.0'\n-4702 Created OS            03 (3) 'Unix'\n-4703 Extract Zip Spec      14 (20) '2.0'\n-4704 Extract OS            00 (0) 'MS-DOS'\n-4705 General Purpose Flag  0800 (2048)\n+473A CENTRAL HEADER #20    02014B50 (33639248)\n+473E Created Zip Spec      14 (20) '2.0'\n+473F Created OS            03 (3) 'Unix'\n+4740 Extract Zip Spec      14 (20) '2.0'\n+4741 Extract OS            00 (0) 'MS-DOS'\n+4742 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4707 Compression Method    0008 (8) 'Deflated'\n-4709 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-470D CRC                   B6DFDCE2 (3068124386)\n-4711 Compressed Size       00000A71 (2673)\n-4715 Uncompressed Size     000026B1 (9905)\n-4719 Filename Length       0040 (64)\n-471B Extra Length          0000 (0)\n-471D Comment Length        0000 (0)\n-471F Disk Start            0000 (0)\n-4721 Int File Attributes   0000 (0)\n+4744 Compression Method    0008 (8) 'Deflated'\n+4746 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+474A CRC                   A9FB32A5 (2851812005)\n+474E Compressed Size       00000A80 (2688)\n+4752 Uncompressed Size     000027AF (10159)\n+4756 Filename Length       0040 (64)\n+4758 Extra Length          0000 (0)\n+475A Comment Length        0000 (0)\n+475C Disk Start            0000 (0)\n+475E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4723 Ext File Attributes   81A40000 (2175008768)\n+4760 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-4727 Local Header Offset   00002C5D (11357)\n-472B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4764 Local Header Offset   00002C89 (11401)\n+4768 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x472B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4768: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-476B CENTRAL HEADER #21    02014B50 (33639248)\n-476F Created Zip Spec      14 (20) '2.0'\n-4770 Created OS            03 (3) 'Unix'\n-4771 Extract Zip Spec      14 (20) '2.0'\n-4772 Extract OS            00 (0) 'MS-DOS'\n-4773 General Purpose Flag  0800 (2048)\n+47A8 CENTRAL HEADER #21    02014B50 (33639248)\n+47AC Created Zip Spec      14 (20) '2.0'\n+47AD Created OS            03 (3) 'Unix'\n+47AE Extract Zip Spec      14 (20) '2.0'\n+47AF Extract OS            00 (0) 'MS-DOS'\n+47B0 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4775 Compression Method    0008 (8) 'Deflated'\n-4777 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-477B CRC                   3C911134 (1016140084)\n-477F Compressed Size       00000264 (612)\n-4783 Uncompressed Size     000004D9 (1241)\n-4787 Filename Length       0047 (71)\n-4789 Extra Length          0000 (0)\n-478B Comment Length        0000 (0)\n-478D Disk Start            0000 (0)\n-478F Int File Attributes   0000 (0)\n+47B2 Compression Method    0008 (8) 'Deflated'\n+47B4 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+47B8 CRC                   1848A62B (407414315)\n+47BC Compressed Size       0000026D (621)\n+47C0 Uncompressed Size     000004F5 (1269)\n+47C4 Filename Length       0047 (71)\n+47C6 Extra Length          0000 (0)\n+47C8 Comment Length        0000 (0)\n+47CA Disk Start            0000 (0)\n+47CC Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4791 Ext File Attributes   81A40000 (2175008768)\n+47CE 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-4795 Local Header Offset   0000372C (14124)\n-4799 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+47D2 Local Header Offset   00003767 (14183)\n+47D6 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4799: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x47D6: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-47E0 CENTRAL HEADER #22    02014B50 (33639248)\n-47E4 Created Zip Spec      14 (20) '2.0'\n-47E5 Created OS            03 (3) 'Unix'\n-47E6 Extract Zip Spec      14 (20) '2.0'\n-47E7 Extract OS            00 (0) 'MS-DOS'\n-47E8 General Purpose Flag  0800 (2048)\n+481D CENTRAL HEADER #22    02014B50 (33639248)\n+4821 Created Zip Spec      14 (20) '2.0'\n+4822 Created OS            03 (3) 'Unix'\n+4823 Extract Zip Spec      14 (20) '2.0'\n+4824 Extract OS            00 (0) 'MS-DOS'\n+4825 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-47EA Compression Method    0008 (8) 'Deflated'\n-47EC Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-47F0 CRC                   C14332D3 (3242406611)\n-47F4 Compressed Size       00000031 (49)\n-47F8 Uncompressed Size     00000037 (55)\n-47FC Filename Length       0041 (65)\n-47FE Extra Length          0000 (0)\n-4800 Comment Length        0000 (0)\n-4802 Disk Start            0000 (0)\n-4804 Int File Attributes   0000 (0)\n+4827 Compression Method    0008 (8) 'Deflated'\n+4829 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+482D CRC                   C14332D3 (3242406611)\n+4831 Compressed Size       00000031 (49)\n+4835 Uncompressed Size     00000037 (55)\n+4839 Filename Length       0041 (65)\n+483B Extra Length          0000 (0)\n+483D Comment Length        0000 (0)\n+483F Disk Start            0000 (0)\n+4841 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4806 Ext File Attributes   81A40000 (2175008768)\n+4843 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-480A Local Header Offset   000039F5 (14837)\n-480E Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4847 Local Header Offset   00003A39 (14905)\n+484B Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x480E: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x484B: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-484F CENTRAL HEADER #23    02014B50 (33639248)\n-4853 Created Zip Spec      14 (20) '2.0'\n-4854 Created OS            03 (3) 'Unix'\n-4855 Extract Zip Spec      14 (20) '2.0'\n-4856 Extract OS            00 (0) 'MS-DOS'\n-4857 General Purpose Flag  0800 (2048)\n+488C CENTRAL HEADER #23    02014B50 (33639248)\n+4890 Created Zip Spec      14 (20) '2.0'\n+4891 Created OS            03 (3) 'Unix'\n+4892 Extract Zip Spec      14 (20) '2.0'\n+4893 Extract OS            00 (0) 'MS-DOS'\n+4894 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-4859 Compression Method    0008 (8) 'Deflated'\n-485B Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-485F CRC                   A3C834B2 (2747806898)\n-4863 Compressed Size       0000003A (58)\n-4867 Uncompressed Size     00000040 (64)\n-486B Filename Length       0049 (73)\n-486D Extra Length          0000 (0)\n-486F Comment Length        0000 (0)\n-4871 Disk Start            0000 (0)\n-4873 Int File Attributes   0000 (0)\n+4896 Compression Method    0008 (8) 'Deflated'\n+4898 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+489C CRC                   A3C834B2 (2747806898)\n+48A0 Compressed Size       0000003A (58)\n+48A4 Uncompressed Size     00000040 (64)\n+48A8 Filename Length       0049 (73)\n+48AA Extra Length          0000 (0)\n+48AC Comment Length        0000 (0)\n+48AE Disk Start            0000 (0)\n+48B0 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-4875 Ext File Attributes   81A40000 (2175008768)\n+48B2 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-4879 Local Header Offset   00003A85 (14981)\n-487D Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+48B6 Local Header Offset   00003AC9 (15049)\n+48BA Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x487D: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x48BA: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-48C6 CENTRAL HEADER #24    02014B50 (33639248)\n-48CA Created Zip Spec      14 (20) '2.0'\n-48CB Created OS            03 (3) 'Unix'\n-48CC Extract Zip Spec      14 (20) '2.0'\n-48CD Extract OS            00 (0) 'MS-DOS'\n-48CE General Purpose Flag  0800 (2048)\n+4903 CENTRAL HEADER #24    02014B50 (33639248)\n+4907 Created Zip Spec      14 (20) '2.0'\n+4908 Created OS            03 (3) 'Unix'\n+4909 Extract Zip Spec      14 (20) '2.0'\n+490A Extract OS            00 (0) 'MS-DOS'\n+490B General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-48D0 Compression Method    0008 (8) 'Deflated'\n-48D2 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-48D6 CRC                   9A3129A6 (2586913190)\n-48DA Compressed Size       00000041 (65)\n-48DE Uncompressed Size     00000047 (71)\n-48E2 Filename Length       0050 (80)\n-48E4 Extra Length          0000 (0)\n-48E6 Comment Length        0000 (0)\n-48E8 Disk Start            0000 (0)\n-48EA Int File Attributes   0000 (0)\n+490D Compression Method    0008 (8) 'Deflated'\n+490F Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4913 CRC                   9A3129A6 (2586913190)\n+4917 Compressed Size       00000041 (65)\n+491B Uncompressed Size     00000047 (71)\n+491F Filename Length       0050 (80)\n+4921 Extra Length          0000 (0)\n+4923 Comment Length        0000 (0)\n+4925 Disk Start            0000 (0)\n+4927 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-48EC Ext File Attributes   81A40000 (2175008768)\n+4929 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-48F0 Local Header Offset   00003B26 (15142)\n-48F4 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+492D Local Header Offset   00003B6A (15210)\n+4931 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x48F4: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4931: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4944 CENTRAL HEADER #25    02014B50 (33639248)\n-4948 Created Zip Spec      14 (20) '2.0'\n-4949 Created OS            03 (3) 'Unix'\n-494A Extract Zip Spec      14 (20) '2.0'\n-494B Extract OS            00 (0) 'MS-DOS'\n-494C General Purpose Flag  0800 (2048)\n+4981 CENTRAL HEADER #25    02014B50 (33639248)\n+4985 Created Zip Spec      14 (20) '2.0'\n+4986 Created OS            03 (3) 'Unix'\n+4987 Extract Zip Spec      14 (20) '2.0'\n+4988 Extract OS            00 (0) 'MS-DOS'\n+4989 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-494E Compression Method    0008 (8) 'Deflated'\n-4950 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-4954 CRC                   6F2313AC (1864569772)\n-4958 Compressed Size       000004B1 (1201)\n-495C Uncompressed Size     000012B3 (4787)\n-4960 Filename Length       003B (59)\n-4962 Extra Length          0000 (0)\n-4964 Comment Length        0000 (0)\n-4966 Disk Start            0000 (0)\n-4968 Int File Attributes   0000 (0)\n+498B Compression Method    0008 (8) 'Deflated'\n+498D Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+4991 CRC                   72A63AD4 (1923496660)\n+4995 Compressed Size       000004AA (1194)\n+4999 Uncompressed Size     0000122E (4654)\n+499D Filename Length       003B (59)\n+499F Extra Length          0000 (0)\n+49A1 Comment Length        0000 (0)\n+49A3 Disk Start            0000 (0)\n+49A5 Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-496A Ext File Attributes   81A40000 (2175008768)\n+49A7 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-496E Local Header Offset   00003BD5 (15317)\n-4972 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+49AB Local Header Offset   00003C19 (15385)\n+49AF Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x4972: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x49AF: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-49AD CENTRAL HEADER #26    02014B50 (33639248)\n-49B1 Created Zip Spec      14 (20) '2.0'\n-49B2 Created OS            03 (3) 'Unix'\n-49B3 Extract Zip Spec      14 (20) '2.0'\n-49B4 Extract OS            00 (0) 'MS-DOS'\n-49B5 General Purpose Flag  0800 (2048)\n+49EA CENTRAL HEADER #26    02014B50 (33639248)\n+49EE Created Zip Spec      14 (20) '2.0'\n+49EF Created OS            03 (3) 'Unix'\n+49F0 Extract Zip Spec      14 (20) '2.0'\n+49F1 Extract OS            00 (0) 'MS-DOS'\n+49F2 General Purpose Flag  0800 (2048)\n      [Bits 1-2]            0 'Normal Compression'\n      [Bit 11]              1 'Language Encoding'\n-49B7 Compression Method    0008 (8) 'Deflated'\n-49B9 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n-49BD CRC                   88872903 (2290559235)\n-49C1 Compressed Size       00000048 (72)\n-49C5 Uncompressed Size     0000004A (74)\n-49C9 Filename Length       0042 (66)\n-49CB Extra Length          0000 (0)\n-49CD Comment Length        0000 (0)\n-49CF Disk Start            0000 (0)\n-49D1 Int File Attributes   0000 (0)\n+49F4 Compression Method    0008 (8) 'Deflated'\n+49F6 Modification Time     50814080 (1350647936) 'Wed Apr  1 08:04:00 2020'\n+49FA CRC                   88872903 (2290559235)\n+49FE Compressed Size       00000048 (72)\n+4A02 Uncompressed Size     0000004A (74)\n+4A06 Filename Length       0042 (66)\n+4A08 Extra Length          0000 (0)\n+4A0A Comment Length        0000 (0)\n+4A0C Disk Start            0000 (0)\n+4A0E Int File Attributes   0000 (0)\n      [Bit 0]               0 'Binary Data'\n-49D3 Ext File Attributes   81A40000 (2175008768)\n+4A10 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-49D7 Local Header Offset   000040DF (16607)\n-49DB Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+4A14 Local Header Offset   0000411C (16668)\n+4A18 Filename              'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #\n-# WARNING: Offset 0x49DB: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n+# WARNING: Offset 0x4A18: Filename 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'\n #          Zero length filename\n #\n \n-4A1D END CENTRAL HEADER    06054B50 (101010256)\n-4A21 Number of this disk   0000 (0)\n-4A23 Central Dir Disk no   0000 (0)\n-4A25 Entries in this disk  001A (26)\n-4A27 Total Entries         001A (26)\n-4A29 Size of Central Dir   00000896 (2198)\n-4A2D Offset to Central Dir 00004187 (16775)\n-4A31 Comment Length        0000 (0)\n+4A5A END CENTRAL HEADER    06054B50 (101010256)\n+4A5E Number of this disk   0000 (0)\n+4A60 Central Dir Disk no   0000 (0)\n+4A62 Entries in this disk  001A (26)\n+4A64 Total Entries         001A (26)\n+4A66 Size of Central Dir   00000896 (2198)\n+4A6A Offset to Central Dir 000041C4 (16836)\n+4A6E Comment Length        0000 (0)\n #\n # Error Count: 11\n # Warning Count: 63\n #\n # Done\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistry.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistry.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,296 +1,296 @@\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.sofa;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.StringUtils;\n-import org.apache.dubbo.registry.NotifyListener;\n-import org.apache.dubbo.registry.support.FailbackRegistry;\n-\n-import com.alipay.sofa.registry.client.api.RegistryClient;\n-import com.alipay.sofa.registry.client.api.RegistryClientConfig;\n-import com.alipay.sofa.registry.client.api.Subscriber;\n-import com.alipay.sofa.registry.client.api.model.RegistryType;\n-import com.alipay.sofa.registry.client.api.model.UserData;\n-import com.alipay.sofa.registry.client.api.registration.PublisherRegistration;\n-import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration;\n-import com.alipay.sofa.registry.client.provider.DefaultRegistryClient;\n-import com.alipay.sofa.registry.client.provider.DefaultRegistryClientConfigBuilder;\n-import com.alipay.sofa.registry.core.model.ScopeEnum;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.CountDownLatch;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\n-import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\n-import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\n-import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\n-import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\n-import static org.apache.dubbo.registry.Constants.SUBSCRIBE_KEY;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.ADDRESS_WAIT_TIME_KEY;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.DEFAULT_GROUP;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_DATA_CENTER;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_REGION;\n-\n-/**\n- * The Sofa registry.\n- *\n- * @since 2.7.2\n- */\n-public class SofaRegistry extends FailbackRegistry {\n-\n-    /**\n-     * Cache subscriber by dataId\n-     */\n-    private final Map<String, Subscriber> subscribers = new ConcurrentHashMap<>();\n-\n-    /**\n-     * Direct registry client\n-     */\n-    private RegistryClient registryClient;\n-    /**\n-     * wait address from registry\n-     */\n-    private int waitAddressTimeout;\n-\n-    /**\n-     * Instantiates a new Sofa registry.\n-     *\n-     * @param url the url\n-     */\n-    public SofaRegistry(URL url) {\n-        super(url);\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Build sofa registry by url:\" + url);\n-        }\n-        this.registryClient = buildClient(url);\n-        this.waitAddressTimeout = Integer.parseInt(ConfigUtils.getProperty(ADDRESS_WAIT_TIME_KEY, \"5000\"));\n-    }\n-\n-    /**\n-     * Build client registry client.\n-     *\n-     * @param url the url\n-     * @return the registry client\n-     */\n-    protected RegistryClient buildClient(URL url) {\n-        RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start()\n-                .setDataCenter(LOCAL_DATA_CENTER)\n-                .setZone(LOCAL_REGION)\n-                .setRegistryEndpoint(url.getHost())\n-                .setRegistryEndpointPort(url.getPort()).build();\n-\n-        DefaultRegistryClient registryClient = new DefaultRegistryClient(config);\n-        registryClient.init();\n-        return registryClient;\n-    }\n-\n-    @Override\n-    public boolean isAvailable() {\n-        return true;\n-    }\n-\n-    @Override\n-    public void doRegister(URL url) {\n-        if (!url.getParameter(REGISTER_KEY, true)\n-                || CONSUMER_PROTOCOL.equals(url.getProtocol())) {\n-            return;\n-        }\n-\n-        String serviceName = buildServiceName(url);\n-        String serviceData = url.toFullString();\n-\n-        PublisherRegistration registration = new PublisherRegistration(serviceName);\n-        addAttributesForPub(registration);\n-\n-        registryClient.register(registration, serviceData);\n-    }\n-\n-    /**\n-     * Add attributes for pub.\n-     *\n-     * @param publisherRegistration the publisher registration\n-     */\n-    protected void addAttributesForPub(PublisherRegistration publisherRegistration) {\n-        publisherRegistration.setGroup(DEFAULT_GROUP);\n-    }\n-\n-    @Override\n-    public void doUnregister(URL url) {\n-        if (!url.getParameter(REGISTER_KEY, true)\n-                || CONSUMER_PROTOCOL.equals(url.getProtocol())) {\n-            return;\n-        }\n-        String serviceName = buildServiceName(url);\n-        registryClient.unregister(serviceName, DEFAULT_GROUP, RegistryType.PUBLISHER);\n-    }\n-\n-    @Override\n-    public void doSubscribe(URL url, final NotifyListener listener) {\n-        if (!url.getParameter(SUBSCRIBE_KEY, true)\n-                || PROVIDER_PROTOCOL.equals(url.getProtocol())) {\n-            return;\n-        }\n-\n-        String serviceName = buildServiceName(url);\n-        // com.alipay.test.TestService:1.0:group@dubbo\n-        Subscriber listSubscriber = subscribers.get(serviceName);\n-\n-        if (listSubscriber != null) {\n-            logger.warn(\"Service name [\" + serviceName + \"] have bean registered in SOFARegistry.\");\n-\n-            CountDownLatch countDownLatch = new CountDownLatch(1);\n-            handleRegistryData(listSubscriber.peekData(), listener, countDownLatch);\n-            waitAddress(serviceName, countDownLatch);\n-            return;\n-        }\n-\n-        final CountDownLatch latch = new CountDownLatch(1);\n-        SubscriberRegistration subscriberRegistration = new SubscriberRegistration(serviceName,\n-                (dataId, data) -> {\n-                    //record change\n-                    printAddressData(dataId, data);\n-                    handleRegistryData(data, listener, latch);\n-                });\n-\n-        addAttributesForSub(subscriberRegistration);\n-        listSubscriber = registryClient.register(subscriberRegistration);\n-\n-        subscribers.put(serviceName, listSubscriber);\n-\n-        waitAddress(serviceName, latch);\n-    }\n-\n-    private void waitAddress(String serviceName, CountDownLatch countDownLatch) {\n-        try {\n-            if (!countDownLatch.await(waitAddressTimeout, TimeUnit.MILLISECONDS)) {\n-                logger.warn(\"Subscribe data failed by dataId \" + serviceName);\n-            }\n-        } catch (Exception e) {\n-            logger.error(\"Error when wait Address!\", e);\n-        }\n-    }\n-\n-    @Override\n-    public void doUnsubscribe(URL url, NotifyListener listener) {\n-        if (!url.getParameter(SUBSCRIBE_KEY, true)\n-                || PROVIDER_PROTOCOL.equals(url.getProtocol())) {\n-            return;\n-        }\n-        String serviceName = buildServiceName(url);\n-\n-        registryClient.unregister(serviceName, DEFAULT_GROUP, RegistryType.SUBSCRIBER);\n-    }\n-\n-    private void handleRegistryData(UserData data, NotifyListener notifyListener,\n-                                    CountDownLatch latch) {\n-        try {\n-            List<URL> urls = new ArrayList<>();\n-            if (null != data) {\n-\n-                List<String> datas = flatUserData(data);\n-                for (String serviceUrl : datas) {\n-                    URL url = URL.valueOf(serviceUrl);\n-                    String serverApplication = url.getParameter(APPLICATION_KEY);\n-                    if (StringUtils.isNotEmpty(serverApplication)) {\n-                        url = url.addParameter(\"dstApp\", serverApplication);\n-                    }\n-                    urls.add(url);\n-                }\n-            }\n-            notifyListener.notify(urls);\n-        } finally {\n-            latch.countDown();\n-        }\n-    }\n-\n-    private String buildServiceName(URL url) {\n-        // return url.getServiceKey();\n-        StringBuilder buf = new StringBuilder();\n-        buf.append(url.getServiceInterface());\n-        String version = url.getParameter(VERSION_KEY);\n-        if (StringUtils.isNotEmpty(version)) {\n-            buf.append(\":\").append(version);\n-        }\n-        String group = url.getParameter(GROUP_KEY);\n-        if (StringUtils.isNotEmpty(group)) {\n-            buf.append(\":\").append(group);\n-        }\n-        buf.append(\"@\").append(DUBBO);\n-        return buf.toString();\n-    }\n-\n-    /**\n-     * Print address data.\n-     *\n-     * @param dataId   the data id\n-     * @param userData the user data\n-     */\n-    protected void printAddressData(String dataId, UserData userData) {\n-\n-        List<String> datas;\n-        if (userData == null) {\n-            datas = new ArrayList<>(0);\n-        } else {\n-            datas = flatUserData(userData);\n-        }\n-\n-        StringBuilder sb = new StringBuilder();\n-        for (String provider : datas) {\n-            sb.append(\"  >>> \").append(provider).append(\"\\n\");\n-        }\n-        if (logger.isInfoEnabled()) {\n-            logger.info(\"Receive updated RPC service addresses: service[\" + dataId\n-                    + \"]\\n  .Available target addresses size [\" + datas.size() + \"]\\n\"\n-                    + sb.toString());\n-        }\n-    }\n-\n-    /**\n-     * Add attributes for sub.\n-     *\n-     * @param subscriberRegistration the subscriber registration\n-     */\n-    protected void addAttributesForSub(SubscriberRegistration subscriberRegistration) {\n-        subscriberRegistration.setGroup(DEFAULT_GROUP);\n-        subscriberRegistration.setScopeEnum(ScopeEnum.global);\n-    }\n-\n-    /**\n-     * Flat user data list.\n-     *\n-     * @param userData the user data\n-     * @return the list\n-     */\n-    protected List<String> flatUserData(UserData userData) {\n-        List<String> result = new ArrayList<>();\n-        Map<String, List<String>> zoneData = userData.getZoneData();\n-\n-        for (Map.Entry<String, List<String>> entry : zoneData.entrySet()) {\n-            result.addAll(entry.getValue());\n-        }\n-\n-        return result;\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.sofa;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.StringUtils;\r\n+import org.apache.dubbo.registry.NotifyListener;\r\n+import org.apache.dubbo.registry.support.FailbackRegistry;\r\n+\r\n+import com.alipay.sofa.registry.client.api.RegistryClient;\r\n+import com.alipay.sofa.registry.client.api.RegistryClientConfig;\r\n+import com.alipay.sofa.registry.client.api.Subscriber;\r\n+import com.alipay.sofa.registry.client.api.model.RegistryType;\r\n+import com.alipay.sofa.registry.client.api.model.UserData;\r\n+import com.alipay.sofa.registry.client.api.registration.PublisherRegistration;\r\n+import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration;\r\n+import com.alipay.sofa.registry.client.provider.DefaultRegistryClient;\r\n+import com.alipay.sofa.registry.client.provider.DefaultRegistryClientConfigBuilder;\r\n+import com.alipay.sofa.registry.core.model.ScopeEnum;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.CountDownLatch;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.common.constants.CommonConstants.APPLICATION_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.DUBBO;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;\r\n+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;\r\n+import static org.apache.dubbo.registry.Constants.CONSUMER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.PROVIDER_PROTOCOL;\r\n+import static org.apache.dubbo.registry.Constants.REGISTER_KEY;\r\n+import static org.apache.dubbo.registry.Constants.SUBSCRIBE_KEY;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.ADDRESS_WAIT_TIME_KEY;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.DEFAULT_GROUP;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_DATA_CENTER;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_REGION;\r\n+\r\n+/**\r\n+ * The Sofa registry.\r\n+ *\r\n+ * @since 2.7.2\r\n+ */\r\n+public class SofaRegistry extends FailbackRegistry {\r\n+\r\n+    /**\r\n+     * Cache subscriber by dataId\r\n+     */\r\n+    private final Map<String, Subscriber> subscribers = new ConcurrentHashMap<>();\r\n+\r\n+    /**\r\n+     * Direct registry client\r\n+     */\r\n+    private RegistryClient registryClient;\r\n+    /**\r\n+     * wait address from registry\r\n+     */\r\n+    private int waitAddressTimeout;\r\n+\r\n+    /**\r\n+     * Instantiates a new Sofa registry.\r\n+     *\r\n+     * @param url the url\r\n+     */\r\n+    public SofaRegistry(URL url) {\r\n+        super(url);\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Build sofa registry by url:\" + url);\r\n+        }\r\n+        this.registryClient = buildClient(url);\r\n+        this.waitAddressTimeout = Integer.parseInt(ConfigUtils.getProperty(ADDRESS_WAIT_TIME_KEY, \"5000\"));\r\n+    }\r\n+\r\n+    /**\r\n+     * Build client registry client.\r\n+     *\r\n+     * @param url the url\r\n+     * @return the registry client\r\n+     */\r\n+    protected RegistryClient buildClient(URL url) {\r\n+        RegistryClientConfig config = DefaultRegistryClientConfigBuilder.start()\r\n+                .setDataCenter(LOCAL_DATA_CENTER)\r\n+                .setZone(LOCAL_REGION)\r\n+                .setRegistryEndpoint(url.getHost())\r\n+                .setRegistryEndpointPort(url.getPort()).build();\r\n+\r\n+        DefaultRegistryClient registryClient = new DefaultRegistryClient(config);\r\n+        registryClient.init();\r\n+        return registryClient;\r\n+    }\r\n+\r\n+    @Override\r\n+    public boolean isAvailable() {\r\n+        return true;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(URL url) {\r\n+        if (!url.getParameter(REGISTER_KEY, true)\r\n+                || CONSUMER_PROTOCOL.equals(url.getProtocol())) {\r\n+            return;\r\n+        }\r\n+\r\n+        String serviceName = buildServiceName(url);\r\n+        String serviceData = url.toFullString();\r\n+\r\n+        PublisherRegistration registration = new PublisherRegistration(serviceName);\r\n+        addAttributesForPub(registration);\r\n+\r\n+        registryClient.register(registration, serviceData);\r\n+    }\r\n+\r\n+    /**\r\n+     * Add attributes for pub.\r\n+     *\r\n+     * @param publisherRegistration the publisher registration\r\n+     */\r\n+    protected void addAttributesForPub(PublisherRegistration publisherRegistration) {\r\n+        publisherRegistration.setGroup(DEFAULT_GROUP);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnregister(URL url) {\r\n+        if (!url.getParameter(REGISTER_KEY, true)\r\n+                || CONSUMER_PROTOCOL.equals(url.getProtocol())) {\r\n+            return;\r\n+        }\r\n+        String serviceName = buildServiceName(url);\r\n+        registryClient.unregister(serviceName, DEFAULT_GROUP, RegistryType.PUBLISHER);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doSubscribe(URL url, final NotifyListener listener) {\r\n+        if (!url.getParameter(SUBSCRIBE_KEY, true)\r\n+                || PROVIDER_PROTOCOL.equals(url.getProtocol())) {\r\n+            return;\r\n+        }\r\n+\r\n+        String serviceName = buildServiceName(url);\r\n+        // com.alipay.test.TestService:1.0:group@dubbo\r\n+        Subscriber listSubscriber = subscribers.get(serviceName);\r\n+\r\n+        if (listSubscriber != null) {\r\n+            logger.warn(\"Service name [\" + serviceName + \"] have bean registered in SOFARegistry.\");\r\n+\r\n+            CountDownLatch countDownLatch = new CountDownLatch(1);\r\n+            handleRegistryData(listSubscriber.peekData(), listener, countDownLatch);\r\n+            waitAddress(serviceName, countDownLatch);\r\n+            return;\r\n+        }\r\n+\r\n+        final CountDownLatch latch = new CountDownLatch(1);\r\n+        SubscriberRegistration subscriberRegistration = new SubscriberRegistration(serviceName,\r\n+                (dataId, data) -> {\r\n+                    //record change\r\n+                    printAddressData(dataId, data);\r\n+                    handleRegistryData(data, listener, latch);\r\n+                });\r\n+\r\n+        addAttributesForSub(subscriberRegistration);\r\n+        listSubscriber = registryClient.register(subscriberRegistration);\r\n+\r\n+        subscribers.put(serviceName, listSubscriber);\r\n+\r\n+        waitAddress(serviceName, latch);\r\n+    }\r\n+\r\n+    private void waitAddress(String serviceName, CountDownLatch countDownLatch) {\r\n+        try {\r\n+            if (!countDownLatch.await(waitAddressTimeout, TimeUnit.MILLISECONDS)) {\r\n+                logger.warn(\"Subscribe data failed by dataId \" + serviceName);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            logger.error(\"Error when wait Address!\", e);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUnsubscribe(URL url, NotifyListener listener) {\r\n+        if (!url.getParameter(SUBSCRIBE_KEY, true)\r\n+                || PROVIDER_PROTOCOL.equals(url.getProtocol())) {\r\n+            return;\r\n+        }\r\n+        String serviceName = buildServiceName(url);\r\n+\r\n+        registryClient.unregister(serviceName, DEFAULT_GROUP, RegistryType.SUBSCRIBER);\r\n+    }\r\n+\r\n+    private void handleRegistryData(UserData data, NotifyListener notifyListener,\r\n+                                    CountDownLatch latch) {\r\n+        try {\r\n+            List<URL> urls = new ArrayList<>();\r\n+            if (null != data) {\r\n+\r\n+                List<String> datas = flatUserData(data);\r\n+                for (String serviceUrl : datas) {\r\n+                    URL url = URL.valueOf(serviceUrl);\r\n+                    String serverApplication = url.getParameter(APPLICATION_KEY);\r\n+                    if (StringUtils.isNotEmpty(serverApplication)) {\r\n+                        url = url.addParameter(\"dstApp\", serverApplication);\r\n+                    }\r\n+                    urls.add(url);\r\n+                }\r\n+            }\r\n+            notifyListener.notify(urls);\r\n+        } finally {\r\n+            latch.countDown();\r\n+        }\r\n+    }\r\n+\r\n+    private String buildServiceName(URL url) {\r\n+        // return url.getServiceKey();\r\n+        StringBuilder buf = new StringBuilder();\r\n+        buf.append(url.getServiceInterface());\r\n+        String version = url.getParameter(VERSION_KEY);\r\n+        if (StringUtils.isNotEmpty(version)) {\r\n+            buf.append(\":\").append(version);\r\n+        }\r\n+        String group = url.getParameter(GROUP_KEY);\r\n+        if (StringUtils.isNotEmpty(group)) {\r\n+            buf.append(\":\").append(group);\r\n+        }\r\n+        buf.append(\"@\").append(DUBBO);\r\n+        return buf.toString();\r\n+    }\r\n+\r\n+    /**\r\n+     * Print address data.\r\n+     *\r\n+     * @param dataId   the data id\r\n+     * @param userData the user data\r\n+     */\r\n+    protected void printAddressData(String dataId, UserData userData) {\r\n+\r\n+        List<String> datas;\r\n+        if (userData == null) {\r\n+            datas = new ArrayList<>(0);\r\n+        } else {\r\n+            datas = flatUserData(userData);\r\n+        }\r\n+\r\n+        StringBuilder sb = new StringBuilder();\r\n+        for (String provider : datas) {\r\n+            sb.append(\"  >>> \").append(provider).append(\"\\n\");\r\n+        }\r\n+        if (logger.isInfoEnabled()) {\r\n+            logger.info(\"Receive updated RPC service addresses: service[\" + dataId\r\n+                    + \"]\\n  .Available target addresses size [\" + datas.size() + \"]\\n\"\r\n+                    + sb.toString());\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Add attributes for sub.\r\n+     *\r\n+     * @param subscriberRegistration the subscriber registration\r\n+     */\r\n+    protected void addAttributesForSub(SubscriberRegistration subscriberRegistration) {\r\n+        subscriberRegistration.setGroup(DEFAULT_GROUP);\r\n+        subscriberRegistration.setScopeEnum(ScopeEnum.global);\r\n+    }\r\n+\r\n+    /**\r\n+     * Flat user data list.\r\n+     *\r\n+     * @param userData the user data\r\n+     * @return the list\r\n+     */\r\n+    protected List<String> flatUserData(UserData userData) {\r\n+        List<String> result = new ArrayList<>();\r\n+        Map<String, List<String>> zoneData = userData.getZoneData();\r\n+\r\n+        for (Map.Entry<String, List<String>> entry : zoneData.entrySet()) {\r\n+            result.addAll(entry.getValue());\r\n+        }\r\n+\r\n+        return result;\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistryConstants.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistryConstants.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,43 +1,43 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.sofa;\n-\n-/**\n- * @since 2.7.2\n- */\n-public class SofaRegistryConstants {\n-\n-    /**\n-     * Default data center\n-     */\n-    public static final String LOCAL_DATA_CENTER = \"DefaultDataCenter\";\n-\n-    /**\n-     * Default region\n-     */\n-    public static final String LOCAL_REGION = \"DEFAULT_ZONE\";\n-\n-    /**\n-     * Default group\n-     */\n-    public static final String DEFAULT_GROUP = \"SOFA\";\n-\n-    /**\n-     * parameter for address.wait.time of rpc reference\n-     */\n-    public static final String ADDRESS_WAIT_TIME_KEY = \"rpc.reference.address.wait.time\";\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.sofa;\r\n+\r\n+/**\r\n+ * @since 2.7.2\r\n+ */\r\n+public class SofaRegistryConstants {\r\n+\r\n+    /**\r\n+     * Default data center\r\n+     */\r\n+    public static final String LOCAL_DATA_CENTER = \"DefaultDataCenter\";\r\n+\r\n+    /**\r\n+     * Default region\r\n+     */\r\n+    public static final String LOCAL_REGION = \"DEFAULT_ZONE\";\r\n+\r\n+    /**\r\n+     * Default group\r\n+     */\r\n+    public static final String DEFAULT_GROUP = \"SOFA\";\r\n+\r\n+    /**\r\n+     * parameter for address.wait.time of rpc reference\r\n+     */\r\n+    public static final String ADDRESS_WAIT_TIME_KEY = \"rpc.reference.address.wait.time\";\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistryFactory.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,41 +1,41 @@\n-/*\n- * Licensed to the Apache Software Foundation (ASF) under one or more\n- * contributor license agreements.  See the NOTICE file distributed with\n- * this work for additional information regarding copyright ownership.\n- * The ASF licenses this file to You under the Apache License, Version 2.0\n- * (the \"License\"); you may not use this file except in compliance with\n- * the License.  You may obtain a copy of the License at\n- *\n- *     http://www.apache.org/licenses/LICENSE-2.0\n- *\n- * Unless required by applicable law or agreed to in writing, software\n- * distributed under the License is distributed on an \"AS IS\" BASIS,\n- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n- * See the License for the specific language governing permissions and\n- * limitations under the License.\n- */\n-package org.apache.dubbo.registry.sofa;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.Registry;\n-import org.apache.dubbo.registry.support.AbstractRegistryFactory;\n-\n-/**\n- * @since 2.7.2\n- */\n-public class SofaRegistryFactory extends AbstractRegistryFactory {\n-\n-    @Override\n-    protected Registry createRegistry(URL url) {\n-        initEnvironment(url);\n-        return new SofaRegistry(url);\n-    }\n-\n-    /**\n-     * For extension, such as load zone/accessKey/secretKey/...\n-     * \n-     * @param url URL\n-     */\n-    protected void initEnvironment(URL url) {\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.sofa;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.Registry;\r\n+import org.apache.dubbo.registry.support.AbstractRegistryFactory;\r\n+\r\n+/**\r\n+ * @since 2.7.2\r\n+ */\r\n+public class SofaRegistryFactory extends AbstractRegistryFactory {\r\n+\r\n+    @Override\r\n+    protected Registry createRegistry(URL url) {\r\n+        initEnvironment(url);\r\n+        return new SofaRegistry(url);\r\n+    }\r\n+\r\n+    /**\r\n+     * For extension, such as load zone/accessKey/secretKey/...\r\n+     * \r\n+     * @param url URL\r\n+     */\r\n+    protected void initEnvironment(URL url) {\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistryInstance.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistryInstance.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,90 +1,90 @@\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.sofa;\n-\n-\n-import java.util.HashMap;\n-import java.util.Map;\n-\n-public class SofaRegistryInstance {\n-    private String id;\n-\n-    private String host;\n-\n-    private int port;\n-\n-    private String name;\n-\n-    private Map<String, String> metadata = new HashMap<>();\n-\n-    private SofaRegistryInstance() {\n-    }\n-\n-    public SofaRegistryInstance(String id, String host, int port, String name, Map<String, String> metadata) {\n-        this.id = id;\n-        this.host = host;\n-        this.port = port;\n-        this.name = name;\n-        this.metadata = metadata;\n-    }\n-\n-    public String getHost() {\n-        return host;\n-    }\n-\n-    public void setHost(String host) {\n-        this.host = host;\n-    }\n-\n-    public int getPort() {\n-        return port;\n-    }\n-\n-    public void setPort(int port) {\n-        this.port = port;\n-    }\n-\n-    public String getId() {\n-        return id;\n-    }\n-\n-    public void setId(String id) {\n-        this.id = id;\n-    }\n-\n-    public String getName() {\n-        return this.name;\n-    }\n-\n-    public void setName(String name) {\n-        this.name = name;\n-    }\n-\n-    public Map<String, String> getMetadata() {\n-        return this.metadata;\n-    }\n-\n-    public void setMetadata(Map<String, String> metadata) {\n-        this.metadata = metadata;\n-    }\n-\n-    @Override\n-    public String toString() {\n-        return \"SofaRegistryInstance{\" + \"id='\" + this.id + '\\''+ \"host='\" + this.host + '\\'' + \"port='\" + this.port + '\\''+ \", name='\" + this.name\n-                + '\\'' + \", metadata=\" + this.metadata + '}';\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.sofa;\r\n+\r\n+\r\n+import java.util.HashMap;\r\n+import java.util.Map;\r\n+\r\n+public class SofaRegistryInstance {\r\n+    private String id;\r\n+\r\n+    private String host;\r\n+\r\n+    private int port;\r\n+\r\n+    private String name;\r\n+\r\n+    private Map<String, String> metadata = new HashMap<>();\r\n+\r\n+    private SofaRegistryInstance() {\r\n+    }\r\n+\r\n+    public SofaRegistryInstance(String id, String host, int port, String name, Map<String, String> metadata) {\r\n+        this.id = id;\r\n+        this.host = host;\r\n+        this.port = port;\r\n+        this.name = name;\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    public String getHost() {\r\n+        return host;\r\n+    }\r\n+\r\n+    public void setHost(String host) {\r\n+        this.host = host;\r\n+    }\r\n+\r\n+    public int getPort() {\r\n+        return port;\r\n+    }\r\n+\r\n+    public void setPort(int port) {\r\n+        this.port = port;\r\n+    }\r\n+\r\n+    public String getId() {\r\n+        return id;\r\n+    }\r\n+\r\n+    public void setId(String id) {\r\n+        this.id = id;\r\n+    }\r\n+\r\n+    public String getName() {\r\n+        return this.name;\r\n+    }\r\n+\r\n+    public void setName(String name) {\r\n+        this.name = name;\r\n+    }\r\n+\r\n+    public Map<String, String> getMetadata() {\r\n+        return this.metadata;\r\n+    }\r\n+\r\n+    public void setMetadata(Map<String, String> metadata) {\r\n+        this.metadata = metadata;\r\n+    }\r\n+\r\n+    @Override\r\n+    public String toString() {\r\n+        return \"SofaRegistryInstance{\" + \"id='\" + this.id + '\\''+ \"host='\" + this.host + '\\'' + \"port='\" + this.port + '\\''+ \", name='\" + this.name\r\n+                + '\\'' + \", metadata=\" + this.metadata + '}';\r\n+    }\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscovery.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscovery.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,254 +1,254 @@\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.sofa;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.common.logger.Logger;\n-import org.apache.dubbo.common.logger.LoggerFactory;\n-import org.apache.dubbo.common.utils.ConfigUtils;\n-import org.apache.dubbo.common.utils.DefaultPage;\n-import org.apache.dubbo.common.utils.Page;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscovery;\n-import org.apache.dubbo.registry.client.DefaultServiceInstance;\n-import org.apache.dubbo.registry.client.ServiceInstance;\n-import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\n-import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\n-import org.apache.dubbo.rpc.RpcException;\n-\n-import com.alipay.sofa.registry.client.api.Publisher;\n-import com.alipay.sofa.registry.client.api.RegistryClientConfig;\n-import com.alipay.sofa.registry.client.api.Subscriber;\n-import com.alipay.sofa.registry.client.api.model.RegistryType;\n-import com.alipay.sofa.registry.client.api.model.UserData;\n-import com.alipay.sofa.registry.client.api.registration.PublisherRegistration;\n-import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration;\n-import com.alipay.sofa.registry.client.provider.DefaultRegistryClient;\n-import com.alipay.sofa.registry.client.provider.DefaultRegistryClientConfigBuilder;\n-import com.alipay.sofa.registry.core.model.ScopeEnum;\n-import com.google.gson.Gson;\n-\n-import java.util.ArrayList;\n-import java.util.List;\n-import java.util.Map;\n-import java.util.Set;\n-import java.util.concurrent.ConcurrentHashMap;\n-import java.util.concurrent.CountDownLatch;\n-import java.util.concurrent.TimeUnit;\n-\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.ADDRESS_WAIT_TIME_KEY;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_DATA_CENTER;\n-import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_REGION;\n-\n-\n-public class SofaRegistryServiceDiscovery extends AbstractServiceDiscovery {\n-\n-    private static final Logger LOGGER = LoggerFactory.getLogger(SofaRegistryServiceDiscovery.class);\n-\n-    private static final String DEFAULT_GROUP = \"dubbo\";\n-\n-    private URL registryURL;\n-\n-    private DefaultRegistryClient registryClient;\n-\n-    private int waitAddressTimeout;\n-\n-    private RegistryClientConfig registryClientConfig;\n-\n-    private final Map<String, Publisher> publishers = new ConcurrentHashMap<>();\n-\n-    private final Map<String, Subscriber> subscribers = new ConcurrentHashMap<>();\n-\n-    private ServiceInstance serviceInstance;\n-\n-    private Gson gson = new Gson();\n-\n-    @Override\n-    public void initialize(URL registryURL) throws Exception {\n-        this.registryURL = registryURL;\n-\n-        this.registryClientConfig = DefaultRegistryClientConfigBuilder.start()\n-                .setDataCenter(LOCAL_DATA_CENTER)\n-                .setZone(LOCAL_REGION)\n-                .setRegistryEndpoint(registryURL.getHost())\n-                .setRegistryEndpointPort(registryURL.getPort()).build();\n-\n-        registryClient = new DefaultRegistryClient(this.registryClientConfig);\n-        registryClient.init();\n-\n-        this.waitAddressTimeout = Integer.parseInt(ConfigUtils.getProperty(ADDRESS_WAIT_TIME_KEY, \"5000\"));\n-    }\n-\n-    @Override\n-    public URL getUrl() {\n-        return registryURL;\n-    }\n-\n-    @Override\n-    public void destroy() throws Exception {\n-    }\n-\n-    @Override\n-    public void doRegister(ServiceInstance serviceInstance) {\n-        SofaRegistryInstance sofaRegistryInstance = new SofaRegistryInstance(serviceInstance.getId(), serviceInstance.getHost(), serviceInstance.getPort(), serviceInstance.getServiceName(), serviceInstance.getMetadata());\n-        Publisher publisher = publishers.get(serviceInstance.getServiceName());\n-        this.serviceInstance = serviceInstance;\n-        if (null == publisher) {\n-            PublisherRegistration registration = new PublisherRegistration(serviceInstance.getServiceName());\n-            registration.setGroup(DEFAULT_GROUP);\n-            publisher = registryClient.register(registration, gson.toJson(sofaRegistryInstance));\n-\n-            publishers.put(serviceInstance.getServiceName(), publisher);\n-        } else {\n-            publisher.republish(gson.toJson(sofaRegistryInstance));\n-        }\n-    }\n-\n-    @Override\n-    public void doUpdate(ServiceInstance serviceInstance) {\n-        register(serviceInstance);\n-    }\n-\n-    @Override\n-    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\n-        registryClient.unregister(serviceInstance.getServiceName(), DEFAULT_GROUP, RegistryType.PUBLISHER);\n-    }\n-\n-    @Override\n-    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\n-        listener.getServiceNames().forEach(serviceName -> registerServiceWatcher(serviceName, listener));\n-    }\n-\n-    protected void registerServiceWatcher(String serviceName, ServiceInstancesChangedListener listener) {\n-        Subscriber subscriber = subscribers.get(serviceName);\n-\n-        if (null == subscriber) {\n-            final CountDownLatch latch = new CountDownLatch(1);\n-            SubscriberRegistration subscriberRegistration = new SubscriberRegistration(serviceName, (dataId, data) -> {\n-                handleRegistryData(dataId, data, listener, latch);\n-            });\n-            subscriberRegistration.setGroup(DEFAULT_GROUP);\n-            subscriberRegistration.setScopeEnum(ScopeEnum.global);\n-\n-            subscriber = registryClient.register(subscriberRegistration);\n-            subscribers.put(serviceName, subscriber);\n-            waitAddress(serviceName, latch);\n-        }\n-    }\n-\n-    @Override\n-    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly)\n-            throws NullPointerException, IllegalArgumentException, UnsupportedOperationException {\n-        Subscriber subscriber = subscribers.get(serviceName);\n-\n-        if (null != subscriber) {\n-            List<ServiceInstance> serviceInstanceList = handleRegistryData(serviceName, subscriber.peekData(), null, null);\n-            return new DefaultPage<>(offset, pageSize, serviceInstanceList, serviceInstanceList.size());\n-        }\n-\n-        throw new RpcException(\"getInstances error!\");\n-    }\n-\n-    private List<ServiceInstance> handleRegistryData(String dataId, UserData userData, ServiceInstancesChangedListener listener, CountDownLatch latch) {\n-        try {\n-            List<String> datas = getUserData(dataId, userData);\n-            List<ServiceInstance> serviceInstances = new ArrayList<>(datas.size());\n-\n-            for (String serviceData : datas) {\n-                SofaRegistryInstance sri = gson.fromJson(serviceData, SofaRegistryInstance.class);\n-\n-                DefaultServiceInstance serviceInstance = new DefaultServiceInstance(sri.getId(), dataId, sri.getHost(), sri.getPort());\n-                serviceInstance.setMetadata(sri.getMetadata());\n-                serviceInstances.add(serviceInstance);\n-            }\n-\n-            if (null != listener) {\n-                listener.onEvent(new ServiceInstancesChangedEvent(dataId, serviceInstances));\n-            }\n-\n-            return serviceInstances;\n-        } finally {\n-            if (null != latch) {\n-                latch.countDown();\n-            }\n-        }\n-    }\n-\n-    private void waitAddress(String serviceName, CountDownLatch countDownLatch) {\n-        try {\n-            if (!countDownLatch.await(waitAddressTimeout, TimeUnit.MILLISECONDS)) {\n-                LOGGER.warn(\"Subscribe data failed by dataId \" + serviceName);\n-            }\n-        } catch (Exception e) {\n-            LOGGER.error(\"Error when wait Address!\", e);\n-        }\n-    }\n-\n-    /**\n-     * Print address data.\n-     *\n-     * @param dataId   the data id\n-     * @param userData the user data\n-     */\n-    protected List<String> getUserData(String dataId, UserData userData) {\n-\n-        List<String> datas = null;\n-        if (userData == null) {\n-            datas = new ArrayList<>(0);\n-        } else {\n-            datas = flatUserData(userData);\n-        }\n-\n-        StringBuilder sb = new StringBuilder();\n-        for (String provider : datas) {\n-            sb.append(\"  >>> \").append(provider).append(\"\\n\");\n-        }\n-        if (LOGGER.isInfoEnabled()) {\n-            LOGGER.info(\"Receive updated RPC service addresses: service[\" + dataId\n-                    + \"]\\n  .Available target addresses size [\" + datas.size() + \"]\\n\"\n-                    + sb.toString());\n-        }\n-\n-        return datas;\n-    }\n-\n-    /**\n-     * Flat user data list.\n-     *\n-     * @param userData the user data\n-     * @return the list\n-     */\n-    protected List<String> flatUserData(UserData userData) {\n-        List<String> result = new ArrayList<>();\n-        Map<String, List<String>> zoneData = userData.getZoneData();\n-\n-        for (Map.Entry<String, List<String>> entry : zoneData.entrySet()) {\n-            result.addAll(entry.getValue());\n-        }\n-\n-        return result;\n-    }\n-\n-    /**\n-     * @return\n-     * @TODO \u540e\u7eed\u786e\u8ba4\u4e0b\n-     */\n-    @Override\n-    public Set<String> getServices() {\n-        return subscribers.keySet();\n-    }\n-\n-}\n+/*\r\n+ * Licensed to the Apache Software Foundation (ASF) under one or more\r\n+ * contributor license agreements.  See the NOTICE file distributed with\r\n+ * this work for additional information regarding copyright ownership.\r\n+ * The ASF licenses this file to You under the Apache License, Version 2.0\r\n+ * (the \"License\"); you may not use this file except in compliance with\r\n+ * the License.  You may obtain a copy of the License at\r\n+ *\r\n+ *     http://www.apache.org/licenses/LICENSE-2.0\r\n+ *\r\n+ * Unless required by applicable law or agreed to in writing, software\r\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n+ * See the License for the specific language governing permissions and\r\n+ * limitations under the License.\r\n+ */\r\n+package org.apache.dubbo.registry.sofa;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.common.logger.Logger;\r\n+import org.apache.dubbo.common.logger.LoggerFactory;\r\n+import org.apache.dubbo.common.utils.ConfigUtils;\r\n+import org.apache.dubbo.common.utils.DefaultPage;\r\n+import org.apache.dubbo.common.utils.Page;\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.ServiceInstance;\r\n+import org.apache.dubbo.registry.client.event.ServiceInstancesChangedEvent;\r\n+import org.apache.dubbo.registry.client.event.listener.ServiceInstancesChangedListener;\r\n+import org.apache.dubbo.rpc.RpcException;\r\n+\r\n+import com.alipay.sofa.registry.client.api.Publisher;\r\n+import com.alipay.sofa.registry.client.api.RegistryClientConfig;\r\n+import com.alipay.sofa.registry.client.api.Subscriber;\r\n+import com.alipay.sofa.registry.client.api.model.RegistryType;\r\n+import com.alipay.sofa.registry.client.api.model.UserData;\r\n+import com.alipay.sofa.registry.client.api.registration.PublisherRegistration;\r\n+import com.alipay.sofa.registry.client.api.registration.SubscriberRegistration;\r\n+import com.alipay.sofa.registry.client.provider.DefaultRegistryClient;\r\n+import com.alipay.sofa.registry.client.provider.DefaultRegistryClientConfigBuilder;\r\n+import com.alipay.sofa.registry.core.model.ScopeEnum;\r\n+import com.google.gson.Gson;\r\n+\r\n+import java.util.ArrayList;\r\n+import java.util.List;\r\n+import java.util.Map;\r\n+import java.util.Set;\r\n+import java.util.concurrent.ConcurrentHashMap;\r\n+import java.util.concurrent.CountDownLatch;\r\n+import java.util.concurrent.TimeUnit;\r\n+\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.ADDRESS_WAIT_TIME_KEY;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_DATA_CENTER;\r\n+import static org.apache.dubbo.registry.sofa.SofaRegistryConstants.LOCAL_REGION;\r\n+\r\n+\r\n+public class SofaRegistryServiceDiscovery extends AbstractServiceDiscovery {\r\n+\r\n+    private static final Logger LOGGER = LoggerFactory.getLogger(SofaRegistryServiceDiscovery.class);\r\n+\r\n+    private static final String DEFAULT_GROUP = \"dubbo\";\r\n+\r\n+    private URL registryURL;\r\n+\r\n+    private DefaultRegistryClient registryClient;\r\n+\r\n+    private int waitAddressTimeout;\r\n+\r\n+    private RegistryClientConfig registryClientConfig;\r\n+\r\n+    private final Map<String, Publisher> publishers = new ConcurrentHashMap<>();\r\n+\r\n+    private final Map<String, Subscriber> subscribers = new ConcurrentHashMap<>();\r\n+\r\n+    private ServiceInstance serviceInstance;\r\n+\r\n+    private Gson gson = new Gson();\r\n+\r\n+    @Override\r\n+    public void initialize(URL registryURL) throws Exception {\r\n+        this.registryURL = registryURL;\r\n+\r\n+        this.registryClientConfig = DefaultRegistryClientConfigBuilder.start()\r\n+                .setDataCenter(LOCAL_DATA_CENTER)\r\n+                .setZone(LOCAL_REGION)\r\n+                .setRegistryEndpoint(registryURL.getHost())\r\n+                .setRegistryEndpointPort(registryURL.getPort()).build();\r\n+\r\n+        registryClient = new DefaultRegistryClient(this.registryClientConfig);\r\n+        registryClient.init();\r\n+\r\n+        this.waitAddressTimeout = Integer.parseInt(ConfigUtils.getProperty(ADDRESS_WAIT_TIME_KEY, \"5000\"));\r\n+    }\r\n+\r\n+    @Override\r\n+    public URL getUrl() {\r\n+        return registryURL;\r\n+    }\r\n+\r\n+    @Override\r\n+    public void destroy() throws Exception {\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doRegister(ServiceInstance serviceInstance) {\r\n+        SofaRegistryInstance sofaRegistryInstance = new SofaRegistryInstance(serviceInstance.getId(), serviceInstance.getHost(), serviceInstance.getPort(), serviceInstance.getServiceName(), serviceInstance.getMetadata());\r\n+        Publisher publisher = publishers.get(serviceInstance.getServiceName());\r\n+        this.serviceInstance = serviceInstance;\r\n+        if (null == publisher) {\r\n+            PublisherRegistration registration = new PublisherRegistration(serviceInstance.getServiceName());\r\n+            registration.setGroup(DEFAULT_GROUP);\r\n+            publisher = registryClient.register(registration, gson.toJson(sofaRegistryInstance));\r\n+\r\n+            publishers.put(serviceInstance.getServiceName(), publisher);\r\n+        } else {\r\n+            publisher.republish(gson.toJson(sofaRegistryInstance));\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public void doUpdate(ServiceInstance serviceInstance) {\r\n+        register(serviceInstance);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void unregister(ServiceInstance serviceInstance) throws RuntimeException {\r\n+        registryClient.unregister(serviceInstance.getServiceName(), DEFAULT_GROUP, RegistryType.PUBLISHER);\r\n+    }\r\n+\r\n+    @Override\r\n+    public void addServiceInstancesChangedListener(ServiceInstancesChangedListener listener) throws NullPointerException, IllegalArgumentException {\r\n+        listener.getServiceNames().forEach(serviceName -> registerServiceWatcher(serviceName, listener));\r\n+    }\r\n+\r\n+    protected void registerServiceWatcher(String serviceName, ServiceInstancesChangedListener listener) {\r\n+        Subscriber subscriber = subscribers.get(serviceName);\r\n+\r\n+        if (null == subscriber) {\r\n+            final CountDownLatch latch = new CountDownLatch(1);\r\n+            SubscriberRegistration subscriberRegistration = new SubscriberRegistration(serviceName, (dataId, data) -> {\r\n+                handleRegistryData(dataId, data, listener, latch);\r\n+            });\r\n+            subscriberRegistration.setGroup(DEFAULT_GROUP);\r\n+            subscriberRegistration.setScopeEnum(ScopeEnum.global);\r\n+\r\n+            subscriber = registryClient.register(subscriberRegistration);\r\n+            subscribers.put(serviceName, subscriber);\r\n+            waitAddress(serviceName, latch);\r\n+        }\r\n+    }\r\n+\r\n+    @Override\r\n+    public Page<ServiceInstance> getInstances(String serviceName, int offset, int pageSize, boolean healthyOnly)\r\n+            throws NullPointerException, IllegalArgumentException, UnsupportedOperationException {\r\n+        Subscriber subscriber = subscribers.get(serviceName);\r\n+\r\n+        if (null != subscriber) {\r\n+            List<ServiceInstance> serviceInstanceList = handleRegistryData(serviceName, subscriber.peekData(), null, null);\r\n+            return new DefaultPage<>(offset, pageSize, serviceInstanceList, serviceInstanceList.size());\r\n+        }\r\n+\r\n+        throw new RpcException(\"getInstances error!\");\r\n+    }\r\n+\r\n+    private List<ServiceInstance> handleRegistryData(String dataId, UserData userData, ServiceInstancesChangedListener listener, CountDownLatch latch) {\r\n+        try {\r\n+            List<String> datas = getUserData(dataId, userData);\r\n+            List<ServiceInstance> serviceInstances = new ArrayList<>(datas.size());\r\n+\r\n+            for (String serviceData : datas) {\r\n+                SofaRegistryInstance sri = gson.fromJson(serviceData, SofaRegistryInstance.class);\r\n+\r\n+                DefaultServiceInstance serviceInstance = new DefaultServiceInstance(sri.getId(), dataId, sri.getHost(), sri.getPort());\r\n+                serviceInstance.setMetadata(sri.getMetadata());\r\n+                serviceInstances.add(serviceInstance);\r\n+            }\r\n+\r\n+            if (null != listener) {\r\n+                listener.onEvent(new ServiceInstancesChangedEvent(dataId, serviceInstances));\r\n+            }\r\n+\r\n+            return serviceInstances;\r\n+        } finally {\r\n+            if (null != latch) {\r\n+                latch.countDown();\r\n+            }\r\n+        }\r\n+    }\r\n+\r\n+    private void waitAddress(String serviceName, CountDownLatch countDownLatch) {\r\n+        try {\r\n+            if (!countDownLatch.await(waitAddressTimeout, TimeUnit.MILLISECONDS)) {\r\n+                LOGGER.warn(\"Subscribe data failed by dataId \" + serviceName);\r\n+            }\r\n+        } catch (Exception e) {\r\n+            LOGGER.error(\"Error when wait Address!\", e);\r\n+        }\r\n+    }\r\n+\r\n+    /**\r\n+     * Print address data.\r\n+     *\r\n+     * @param dataId   the data id\r\n+     * @param userData the user data\r\n+     */\r\n+    protected List<String> getUserData(String dataId, UserData userData) {\r\n+\r\n+        List<String> datas = null;\r\n+        if (userData == null) {\r\n+            datas = new ArrayList<>(0);\r\n+        } else {\r\n+            datas = flatUserData(userData);\r\n+        }\r\n+\r\n+        StringBuilder sb = new StringBuilder();\r\n+        for (String provider : datas) {\r\n+            sb.append(\"  >>> \").append(provider).append(\"\\n\");\r\n+        }\r\n+        if (LOGGER.isInfoEnabled()) {\r\n+            LOGGER.info(\"Receive updated RPC service addresses: service[\" + dataId\r\n+                    + \"]\\n  .Available target addresses size [\" + datas.size() + \"]\\n\"\r\n+                    + sb.toString());\r\n+        }\r\n+\r\n+        return datas;\r\n+    }\r\n+\r\n+    /**\r\n+     * Flat user data list.\r\n+     *\r\n+     * @param userData the user data\r\n+     * @return the list\r\n+     */\r\n+    protected List<String> flatUserData(UserData userData) {\r\n+        List<String> result = new ArrayList<>();\r\n+        Map<String, List<String>> zoneData = userData.getZoneData();\r\n+\r\n+        for (Map.Entry<String, List<String>> entry : zoneData.entrySet()) {\r\n+            result.addAll(entry.getValue());\r\n+        }\r\n+\r\n+        return result;\r\n+    }\r\n+\r\n+    /**\r\n+     * @return\r\n+     * @TODO \u540e\u7eed\u786e\u8ba4\u4e0b\r\n+     */\r\n+    @Override\r\n+    public Set<String> getServices() {\r\n+        return subscribers.keySet();\r\n+    }\r\n+\r\n+}\r\n"}, {"source1": "org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscoveryFactory.java", "source2": "org/apache/dubbo/registry/sofa/SofaRegistryServiceDiscoveryFactory.java", "comments": ["Ordering differences only"], "unified_diff": "@@ -1,28 +1,28 @@\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.sofa;\n-\n-import org.apache.dubbo.common.URL;\n-import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\n-import org.apache.dubbo.registry.client.ServiceDiscovery;\n-\n-public class SofaRegistryServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\n-    @Override\n-    protected ServiceDiscovery createDiscovery(URL registryURL) {\n-        return new SofaRegistryServiceDiscovery();\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.sofa;\r\n+\r\n+import org.apache.dubbo.common.URL;\r\n+import org.apache.dubbo.registry.client.AbstractServiceDiscoveryFactory;\r\n+import org.apache.dubbo.registry.client.ServiceDiscovery;\r\n+\r\n+public class SofaRegistryServiceDiscoveryFactory extends AbstractServiceDiscoveryFactory {\r\n+    @Override\r\n+    protected ServiceDiscovery createDiscovery(URL registryURL) {\r\n+        return new SofaRegistryServiceDiscovery();\r\n+    }\r\n+}\r\n"}, {"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml", "unified_diff": null, "details": [{"source1": "META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml", "source2": "META-INF/maven/org.apache.dubbo/dubbo-registry-sofa/pom.xml", "comments": ["Ordering differences only"], "unified_diff": "@@ -52,16 +52,16 @@\n       <optional>true</optional>\n     </dependency>\n     <dependency>\n       <groupId>com.alipay.sofa</groupId>\n       <artifactId>registry-client-all</artifactId>\n       <exclusions>\n         <exclusion>\n-          <artifactId>sofa-common-tools</artifactId>\n           <groupId>com.alipay.sofa</groupId>\n+          <artifactId>sofa-common-tools</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.apache.dubbo</groupId>\n       <artifactId>dubbo-rpc-dubbo</artifactId>\n       <version>${project.version}</version>\n@@ -86,28 +86,28 @@\n     </dependency>\n     <dependency>\n       <groupId>com.alipay.sofa</groupId>\n       <artifactId>registry-test</artifactId>\n       <scope>test</scope>\n       <exclusions>\n         <exclusion>\n-          <artifactId>log4j-over-slf4j</artifactId>\n           <groupId>org.slf4j</groupId>\n+          <artifactId>log4j-over-slf4j</artifactId>\n         </exclusion>\n         <exclusion>\n-          <artifactId>log4j-jcl</artifactId>\n           <groupId>org.apache.logging.log4j</groupId>\n+          <artifactId>log4j-jcl</artifactId>\n         </exclusion>\n         <exclusion>\n-          <artifactId>log4j-core</artifactId>\n           <groupId>org.apache.logging.log4j</groupId>\n+          <artifactId>log4j-core</artifactId>\n         </exclusion>\n         <exclusion>\n-          <artifactId>log4j-api</artifactId>\n           <groupId>org.apache.logging.log4j</groupId>\n+          <artifactId>log4j-api</artifactId>\n         </exclusion>\n       </exclusions>\n     </dependency>\n     <dependency>\n       <groupId>org.jboss.resteasy</groupId>\n       <artifactId>resteasy-jaxrs</artifactId>\n       <scope>test</scope>\n"}]}]}
