ChangeLog 191 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986
2025-02-19  Jay Berkenbilt  <ejb@ql.org>

        * END USE OF ChangeLog. From this point forward, please consult
        the release notes for important changes and version control
        history for detailed changes.

2025-02-15  Jay Berkenbilt  <ejb@ql.org>

	* 11.10.1: release

	* Detect cygwin as Windows for fix-qdf tests that don't work on
	Windows. The perl used for the test runner in GitHub Actions
	changed. This was causing some non-Windows tests to fail and also
	causing path canonicalization to fail for absolute paths with
	drive letters.

	* Detect zopfli by looking for <zopfli/zopfli.h> rather than just
	<zopfli.h>

2025-02-08  Jay Berkenbilt  <ejb@ql.org>

	* 11.10.0: release

2025-02-02  Jay Berkenbilt  <ejb@ql.org>

	* Add support for the zopfli compression library. See manual for
	details. Fixes #1323.

	* Have fix-qdf accept a second argument, interpreted as the output
	file. Fixes #1330.

2024-02-01  M Holger  <m.holger@qpdf.org>

	* Bug fix: in qpdf CLI / QPDFJob throw a QPDFUsage exception if a
	parameter is given for a flag. Previously the parameter was ignored and
	e.g. --encrypt=n was treated as --encrypt. Fixes #1329.

2024-09-20  Chao Li  <mslichao@outlook.com>

	* Add C API function qpdf_oh_free_buffer to release memory allocated
	by stream data functions.

2024-09-19  M Holger  <m.holger@qpdf.org>

	* Bug fix: QPDFWriter stream DecodeLevel incorrectly defaulted to
	none instead of generalized. Fixes #1286.

2024-08-25  M Holger  <m.holger@qpdf.org>

	* Add new command-line arguments --remove-metadata and --remove-info
	to exclude document metadata and information from the output PDF
	file. Partially fixes #1145.

2024-08-06  M Holger  <m.holger@qpdf.org>

	* Bug fix: when writing real numbers as JSON ensure that they don't
	have a trailing decimal point. Fixes #1261.

2024-07-14  M Holger  <m.holger@qpdf.org>

	* Bug fix: handle named destinations where the entry is a
	dictionary with /D entry instead of an explicit destination.
	Fixes #1238.

2024-07-04  M Holger  <m.holger@qpdf.org>

	* Treat corrupt JPEG streams as unfilterable. This avoids them
	getting uncompressed when writing PDF files with decode level all.

2024-07-02  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDF::setMaxWarnings to set the maximum of warnings before
	warning suppression.

	* Add static option to Pl_DCT to limit memory usage of
	decompression. The option is generally exposed but is primarily
	intended to support fuzz tests, which have explicit memory limits
	that are smaller than what is commonly seen in the wild with PDF
	files.

	* Add static option to Pl_DCT to control whether decompression of
	corrupt JPEG data is attempted.

2024-07-01  M Holger  <m.holger@qpdf.org>

	* Bug fix: certain invalid object streams caused the insertion of
	invalid entries into in the xref table.

2024-06-29  M Holger  <m.holger@qpdf.org>

	* Bug fix: in QPDFOutlineObjectHelper detect loops in the list of
	direct children of an outline item.

2024-06-27  M Holger  <m.holger@qpdf.org>

	* Add sanity check in QPDF xref table reconstruction to reject
	objects with impossibly large object id in order to improve
	handling of severely damaged PDF files.

2024-06-25  M Holger  <m.holger@qpdf.org>

	* Detect severely damaged PDF files early. After parsing the xref
	table in QPDF throw a damagedPDF exception if the root of the pages
	tree is not a dictionary.

2024-06-07  Jay Berkenbilt  <ejb@ql.org>

	* 11.9.1: release

2024-06-06  Jay Berkenbilt  <ejb@ql.org>

	* Rewrite a recursive function to be iterative in linearization to
	enable more complex files to be linearized, especially on Windows.

2024-02-24  Jay Berkenbilt  <ejb@ql.org>

	* Avoid non-standard use of `std::basic_string_view`. Contribution
	from Zoe Clifford.

2024-02-24  Jay Berkenbilt  <ejb@ql.org>

	* 11.9.0: release

2024-02-17  Jay Berkenbilt  <ejb@ql.org>

	* Add ENABLE_COVERAGE cmake option to assist with generating
	coverage reports.

	* From M. Holger: add QPDFObjectHandle::writeJSON to directly
	write a JSON representation to a pipeline. This is much faster
	than writing the serialized result of getJSON.

2024-02-11  Jay Berkenbilt  <ejb@ql.org>

	* The previous fix to #1056 was incomplete. When setting a check
	box value, the previous fix allowed any value other than /Off to
	mean checked. Now we also set the actual value based on the
	allowable non-/Off value in the normal appearance dictionary.
	Fixes #1056.

2024-02-03  Jay Berkenbilt  <ejb@ql.org>

	* Add fuzz testing for JSON.

2024-01-15  Jay Berkenbilt  <ejb@ql.org>

	* Add JSON::getDictItem (from m-holger)

2024-01-10  Jay Berkenbilt  <ejb@ql.org>

	* Allow --overlay and --underlay to be repeated. They may appear
	multiple times on the command-line and will be stacked in the
	order in which they appear. In QPDFJob JSON, the overlay and
	underlay keys may contain arrays. For compatibility, they may also
	contain a single dictionary.

2024-01-09  Jay Berkenbilt  <ejb@ql.org>

	* Add new command-line arguments --file and --range which can be
	used within --pages in place of positional arguments. Allow --file
	to be used inside of --overlay and --underlay as well. These new
	options can be freely intermixed with positional arguments. Also
	add file(), range(), and password() to QPDFJob::PagesConfig as an
	alternative to pageSpec.

2024-01-08  Jay Berkenbilt  <ejb@ql.org>

	* 11.8.0: release

2024-01-07  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: treat references to older generations of objects as
	null.

2024-01-06  Jay Berkenbilt  <ejb@ql.org>

	* When recovering a file's xref table, attempt to find xref
	streams if a traditional trailer dictionary is not found. Fixes
	#1103.

2024-01-05  Jay Berkenbilt  <ejb@ql.org>

	* Add --set-page-labels command-line argument and supporting API.
	Fixes #939.
	  - QPDFJob::Config::setPageLabels
	  - pdf_page_label_e enumerated type
	  - QPDFPageLabelDocumentHelper::pageLabelDict

2024-01-01  Jay Berkenbilt  <ejb@ql.org>

	* Support comma-separated numeric values with --collate to select
	different group sizes from different files. Fixes #505.

	* Support "x" before a group in a numeric range to exclude a group
	from the previous group. Details are in the manual. Fixes #564,
	#790.

2023-12-29  Jay Berkenbilt  <ejb@ql.org>

	* When flattening annotations, preserve annotations without any
	appearance information at all, such as types /Link, /Popup, and
	/Projection. Fixes #1039.

2023-12-25  Jay Berkenbilt  <ejb@ql.org>

	* Detect overlong UTF-8 in the UTF-8 decoder, and fix detection of
	8-bit characters in erroneous UTF-8 strings.

2023-12-24  Jay Berkenbilt  <ejb@ql.org>

	* 11.7.0: release

2023-12-23  Jay Berkenbilt  <ejb@ql.org>

	* Define CPACK_NSIS_MODIFY_PATH for the Windows builds so the
	official installers will offer to modify PATH when installing
	qpdf. Fixes #1054.

	* Add QPDFAcroFormDocumentHelper::disableDigitalSignatures, which
	disables any digital signature fields, leaving their visual
	representations intact. The --remove-restrictions command-line
	argument now calls this. Fixes #1015.

2023-12-22  Jay Berkenbilt  <ejb@ql.org>

	* Generate a more complete qpdf "man page" from the same source as
	qpdf --help. Fixes #1064.

	* Allow the syntax "--encrypt --user-password=user-password
	--owner-password=owner-password --bits={40,128,256}" when
	encrypting PDF files. This is an alternative to the syntax
	"--encrypt user-password owner-password {40,128,256}", which will
	continue to be supported. The new syntax works better with shell
	completion and allows creation of passwords that start with "-".
	Fixes #874.

	* When setting a check box value, allow any value other than /Off
	to mean checked. This is permitted by the spec. Previously, any
	value other than /Yes or /Off was rejected. Fixes #1056.

2023-12-21  Jay Berkenbilt  <ejb@ql.org>

	* Fix to QPDF JSON: a floating point number that appears in
	scientific notation will be converted to fixed-point notation,
	rounded to six digits after the decimal point. Fixes #1079.

	* Fix to QPDF JSON: the syntax "n:/pdf-syntax" is now accepted as
	an alternative way to represent names. This can be used for any
	name (e.g. "n:/text#2fplain"), but it is necessary when the name
	contains binary characters. For example, /one#a0two must be
	represented as "n:/one#a0two" since the single byte a0 is not
	valid in JSON. Fixes #1072.

	* From M. Holger: Refactor QPDFParser for performance. See #1059
	for a discussion.

2023-12-20  Jay Berkenbilt  <ejb@ql.org>

	* Update code and tests so that qpdf's test suite no longer
	depends on the output of any specific zlib implementation. This
	makes it possible to get a fully passing test suite with any
	API-compatible zlib library. CI tests with the default zlib as
	well as zlib-ng (including verifying that zlib-ng is not the
	default), but any zlib implementation should work. Fixes #774.

	* Bug fix: with --compress-streams=n, don't compress object, XRef,
	or linearization hint streams.

2023-12-16  Jay Berkenbilt  <ejb@ql.org>

	* Add new C++ functions "qpdf_c_get_qpdf" and "qpdf_c_wrap" to
	qpdf-c.h that make it possible to write your own extern "C"
	functions in C++ that interoperate with the C API. See
	examples/extend-c-api for more information.

	* Bug fix from M. Holger: the default for /Columns in PNG filter
	is 1, but libqpdf was acting like it was 0.

	* Enhancement from M. Holger: add methods to Buffer to work more
	easily with std::string.

2023-12-10  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.4: release

2023-12-09  Jay Berkenbilt  <ejb@ql.org>

	* Install fix: include cmake files with the dev component.

2023-11-20  Jay Berkenbilt  <ejb@ql.org>

	* Build AppImage with an older Linux distribution to support AWS
	Lambda. Fixes #1086.

2023-10-15  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.3: release

2023-10-14  Jay Berkenbilt  <ejb@ql.org>

	* Tweak linearization code to better handle files between 2 GB and
	4 GB in size. Fixes #1023.

	* Fix data loss bug: qpdf could discard a the character after an
	escaped octal string consisting of less than three digits. For
	content, this would only happen with QDF or when normalizing
	content. Outside of content, it could have happened in any binary
	string, such as /ID, if the encoding software used octal escape
	strings with less than three digits. This bug was introduced
	between 10.6.3 and 11.0.0. Fixes #1050.

2023-10-07  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.2: release

	* Bug fix: when piping stream data, don't call finish on failure
	if the failure was caused by a previous call to finish. Fixes
	#1042.

	* Push .idea directory with the beginning of a sharable JetBrains
	CLion configuration.

2023-09-05  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.1: release

	* Fix a logic error introduced in 11.6.0 in the fix to
	copyForeignObject. The bug could result in some pages not being
	copied.

2023-09-03  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.0: release

	* ascii85 parser: ignore spaces everywhere including between ~
	and >. Fixes #973.

	* Bug fix: with --pages, if one of the external files had warnings
	but the main file did not, the warning was previously not taken
	into consideration when determining the exit status.

	* Put quotation marks around the command in completion output to
	better handle spaces in paths. It is not a perfect fix (ideally,
	full shell-compatible quoting should be used), but it handles more
	cases than the old code and should handle all reasonable cases of
	qpdf being in a directory with a space in its name, which is
	common in Windows. Fixes #1021.

	* Move check for random number device to runtime instead of
	compile time. Since, by default, the crypto provider provides
	random numbers, runtime determination of a random number device is
	usually not needed. Fixes #1022.

2023-09-02  Jay Berkenbilt  <ejb@ql.org>

	* Maintain links to foreign pages when copying foreign objects.
	This allows hyperlinks in imported files to work. Fixes #1003.

	* Bug fix: Return a null object if an attempt is made to to copy a
	foreign /Pages object with copyForeignObject. This corrects a
	possible crash. Fixes #1010.

	* Bug fix: Return a null object if an attempt is made to to copy a
	foreign /Pages object with copyForeignObject. Fixes #1003.

	* Add /MediaBox to a page if absent. Thanks M. Holger.

	* Use std::vector internally for Pl_Buffer to
	avoid incompatibility with C++20. Thanks to Zoe Clifford. Fixes #1024.

2023-07-09  Jay Berkenbilt  <ejb@ql.org>

	* 11.5.0: release

	* This release consists entirely of changes made by M. Holger.
	Mostly this is changes to the private API, performance
	enhancements, code cleanup, and reformatting to 100 columns
	instead of 80. For qpdf development, we are starting to use
	JetBrains CLion, so a lot of the changes are moving us toward a
	cleaner development experience in that environment.

2023-06-15  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when a the same page is copied multiple times, copy
	the annotations rather than having multiple pages share an
	annotation object. Thanks to M. Holger for the fix. Fixes #600.

2023-06-14  Jay Berkenbilt  <ejb@ql.org>

	* Add "FUTURE" build option for enabling experimental APIs. Do not
	package qpdf built with the FUTURE option as there are no binary
	compatibility or even source compatibility guarantees. The option
	is intended for developers who want to ensure that future
	potentially breaking changes are compatible with their code or
	provide feedback on upcoming changes. At present, the only feature
	enabled by FUTURE is a move constructor for QPDFObjectHandle.
	While this shouldn't break any code, it would change details about
	how many copies of a specific QPDFObjectHandle were in existence,
	so it could potentially break code that was relying on internal
	shared pointer reference counts. Thanks to M. Holger for the idea
	and contribution.

2023-05-25  Jay Berkenbilt  <ejb@ql.org>

	* Add new method Buffer::copy and deprecate Buffer copy
	constructor and assignment operator. Buffer copy operations are
	expensive as they always involve copying the buffer content. Use
	"buffer2 = buffer1.copy();" or "Buffer buffer2{buffer1.copy()};"
	to make it explicit that copying is intended. This change was
	contributed by M. Holger.

2023-05-21  Jay Berkenbilt  <ejb@ql.org>

	* 11.4.0: release

2023-05-20  Jay Berkenbilt  <ejb@ql.org>

	* From M. Holger: add QPDF::newReserved as a better alternative to
	QPDFObjectHandle::newReserved. The operation of creating a new
	reserved object fits better in the QPDF API. The old call just
	delegates to the new one.

2023-05-13  Jay Berkenbilt  <ejb@ql.org>

	* When an annotation dictionary's appearance dictionary (`/AP`)
	has a key that is a stream, disregard `/AS` (which is supposed to
	point to a subkey). This enables qpdf to not ignore annotations
	that have incorrect values for `/AS` when the appearance stream is
	directly in the `/AP` dictionary instead of in a subkey. Fixes
	#949.

2023-04-02  Jay Berkenbilt  <ejb@ql.org>
	* Allow QPDFJob's workflow to be split into a reading phase and a
	writing phase to allow the caller to operate on the QPDF object
	before it is written. This adds methods QPDFJob::createQPDF and
	QPDFJob::writeQPDF and corresponding C API functions
	qpdfjob_create_qpdf and qpdfjob_write_qpdf. Thanks to M. Holger
	for the contribution.

2023-04-01  Jay Berkenbilt  <ejb@ql.org>
	* From M. Holger: throw a logic error if an uninitialized or
	foreign QPDFObjectHandle is added to an array.

2023-03-18  Jay Berkenbilt  <ejb@ql.org>

	* Enhance --optimize-images to support images nested inside of
	form XObjects. Thanks to Connor Osborne (github user cdosborn) for
	the contribution. Fixes #923.

2023-02-25  Jay Berkenbilt  <ejb@ql.org>

	* 11.3.0: release

	* When performing overlay or underlay operations, convert the
	original page to a form XObject instead of simply isolating its
	contents with q/Q operators. This prevents unbalanced q/Q
	operators in any of the original pages from messing up the
	graphics state of anything that is overlaid on top of it. Fixes
	#904.

2023-02-18  Jay Berkenbilt  <ejb@ql.org>

	* Treat all linearization errors and warnings as warnings, and
	issue them through the normal warning system using the new error
	code qpdf_e_linearization. That means that --no-warn will suppress
	them, and the file name is included in the warning. Fixes #851.

2023-01-28  Jay Berkenbilt  <ejb@ql.org>

	* New option --remove-restrictions removes security restrictions
	from digitally signed files. Fixes #833.

2023-01-09  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: flatten annotations should handle a page with no
	/Resources key. Fixes #827.

2022-11-20  Jay Berkenbilt  <ejb@ql.org>

	* 11.2.0: release

	* Add a few convenience methods to QPDFTokenizer::Token for
	checking token types. thanks to M. Holger for the contribution.

	* Add stream creation methods to the QPDF class as a better
	alternative to the ones in the QPDFObjectHandle class. Thanks to
	M. Holger for the contribution.

2022-11-19  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: handle special case of an earlier xref stream object's
	object number being reused by an update made by appending the
	file. Fixes #809.

2022-10-08  Jay Berkenbilt  <ejb@ql.org>

	* Fix major performance bug with the openssl crypto provider when
	using OpenSSL 3. The legacy loader and rc4 algorithm was being
	loaded with every call to the crypto provider instead of once in
	the life of the program. Fixes #798.

	* performance_check: add --test option to limit which tests are
	run.

2022-10-06  Jay Berkenbilt  <ejb@ql.org>

	* Change minimum required C++ version from C++-14 to C++-17.

	* Fix another symbol export issue with the MinGW build.

2022-10-01  Jay Berkenbilt  <ejb@ql.org>

	* 11.1.1: release

2022-09-27  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: avoid having the AppImage discard the first argument
	when renamed to one of the embedded executables. Fixes #789.

	* Add AppImage-specific tests to CI. These test different
	invocation styles and loading of the proper shared library.

2022-09-26  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: avoid using PDF Doc encoding for strings whose PDF Doc
	encoding representation starts with UTF-16 or UTF-8 markers. Fixes
	#778.

2022-09-27  Jay Berkenbilt  <ejb@ql.org>

	* Add tests to CI for char being unsigned by default.

2022-09-14  Jay Berkenbilt  <ejb@ql.org>

	* 11.1.0: release

	* Add notes to documentation clarifying that installing the dev
	component usually requires the lib component to also be installed.

	* Set CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON in cmake to
	(hopefully) solve the problem of older installed qpdf headers
	interfering with building qpdf from source. Fixes #763.

2022-09-12  Jay Berkenbilt  <ejb@ql.org>

	* Add some missing DLL exports that only affect the Windows build.

	* Remove compile-time test for LL_FMT. It's unlikely that any
	compiler new enough to build qpdf still doesn't support %lld.

2022-09-10  Jay Berkenbilt  <ejb@ql.org>

	* 11.0.0: release

2022-09-09  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::isSameObjectAs to test whether two
	QPDFObjectHandle objects point to the same underlying object.

	* Expose ability to create custom loggers and to get and set the
	logger for QPDF and QPDFJob through the C API.

2022-09-08  Jay Berkenbilt  <ejb@ql.org>

	* Added new functions to the C API to support qpdf JSON:
	qpdf_create_from_json_file, qpdf_create_from_json_data,
	qpdf_update_from_json_file, qpdf_update_from_json_data, and
	qpdf_write_json. Examples can be found in qpdf-ctest.c (in the
	source tree), tests 42 through 47.

	* Add QPDFObjectHandle::isDestroyed() to test whether an indirect
	object was from a QPDF that has been destroyed.

2022-09-07  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::getQPDF(), which returns a reference, as
	an alternative to QPDFObjectHandle::getOwningQPDF().

2022-09-06  Jay Berkenbilt  <ejb@ql.org>

	* For all bounding box methods in QPDFPageObjectHelper other than
	MediaBox, add a parameter `copy_if_fallback`, and add comments
	explaining in depth exactly what copy_if_shared and
	copy_if_fallback mean. Fixes #664.

	* Add new methods getArtBox and getBleedBox to
	QPDFPageObjectHelper, completing the set of bounding box methods.

	* The --show-encryption option now works even if a correct
	password is not supplied. If you were using --show-encryption to
	test whether you have the right password, use --requires-password
	instead. Fixes #598.

2022-09-05  Jay Berkenbilt  <ejb@ql.org>

	* Add a move constructor to Buffer, making it possible to move
	rather than copy the internal buffer. Thanks to jbarlow83 for the
	contribution.

2022-09-02  Jay Berkenbilt  <ejb@ql.org>

	* Add new QPDF::create() factory method that returns
	std::shared_ptr<QPDF>.

	* Prevent copying/assigning to QPDF objects in the API. It has
	never been safe to do this, but the API wasn't preventing it.

2022-09-01  Jay Berkenbilt  <ejb@ql.org>

	* Remove QPDFObject.hh from include/qpdf. The only reason to
	include was to get QPDFObject::object_type_e. Instead, include
	qpdf/Constants.h, and change `QPDFObject::ot_` to `::ot_`.

	* More optimizations and cleanup from m-holger (#726, #730)
	including major refactor of QPDF's internal representations of
	objects. In addition to a large performance improvement, this also
	made it possible for QPDFObjectHandle::getOwningQPDF() to return a
	null pointer if the owning QPDF had been destroyed. (A more
	complete solution to this problem will be introduced for qpdf 12.)
	This work also paves the way for a future alternative to
	QPDFObjectHandle that is more idiomatic C++ and has greater type
	safety.

2022-08-31  Jay Berkenbilt  <ejb@ql.org>

	* From m-holger (#729): refactor QPDF's parser into a new
	QPDFParser class, cleaning the code, significantly improving
	performance.

2022-08-27  Jay Berkenbilt  <ejb@ql.org>

	* From m-holger: major refactoring of QPDFTokenizer to improve
	readability and to optimize performance. This also included some
	optimizations to some InputSource classes. Thanks for this
	excellent contribution. Fixes #749, #442.

2022-08-07  Jay Berkenbilt  <ejb@ql.org>

	* Add new build configuration option ENABLE_QTC, which is off by
	default when not running in MAINTAINER_MODE. When this is off,
	QTC coverage calls sprinkled throughout the qpdf source code are
	compiled out for increased performance. See "Build Options" in the
	manual for a discussion. Fixes #714.

2022-08-06  Jay Berkenbilt  <ejb@ql.org>

	* Added by m-holger: QPDF::getObject() method as a simpler form of
	getObjectByID or getObjectByObjGen. The older methods are being
	retained for compatibility and are not deprecated.

2022-07-24  Jay Berkenbilt  <ejb@ql.org>

	* include/qpdf/JSON.hh: Schema validation: allow a single item to
	appear anywhere that the schema has an array of a single item.
	This makes it possible to change an element of the schema from an
	item to an array to allow the data to accept an array where a
	single value was previously required. This change is needed to
	allow QPDFJob JSON to start accepting multiple items where a
	single item used to be expected without breaking backward
	compatibility. Without this change, the earlier fix to
	removeAttachment would be a breaking change. Also allow the schema
	to contain a multi-element array, which means that the output has
	to have an array of the same length in the corresponding location,
	and each element is validated against the corresponding schema
	element.

	* QPDFObjectHandle: for the methods insertItem, appendItem,
	eraseItem, replaceKey, and removeKey, add a corresponding
	"AndGetNew" and/or "AndGetOld" methods. The ones that end with
	"AndGetNew" return the newly added item. The ones that end with
	"AndGetOld" return the old value. The AndGetNew methods make it
	possible to create a new object, add it to an array or dictionary,
	and get a handle to it all in one line. The AndGetOld methods make
	it easier to retrieve an old value when removing or replacing it.

	* Thanks to m-holger for doing significant cleanup of private APIs
	and internals around QPDFObjGen and for significantly improving
	the performance of QPDFObjGen -- See #731. This includes a few
	user-visible changes:
	- Addition of QPDFObjectHandle::StreamDataProvider::provideStreamData
	  overloads that take QPDFObjGen
	- Addition of an optional argument to QPDFObjGen::unparse allowing
	  specification of a separator character, with the default
	  resulting in the old behavior
	Examples have been updated to use improved APIs. The old
	provideStreamData overloads will continue to be supported, so
	updating older code to use the new interfaces is entirely at the
	programmer's discretion.

2022-06-25  Jay Berkenbilt  <ejb@ql.org>

	* Add tracking methods QPDF::everCalledGetAllPages() and
	QPDF::everPushedInheritedAttributesToPages(). Since those methods
	may have the side effect of creating new objects and replace
	objects in various places in the pages tree, it's useful to be
	able to find out whether they've ever been called.

2022-06-18  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFJob::registerProgressReporter, making it possible to
	override the progress reporter that is used when --progress (or
	the equivalent) is configured with QPDFJob. This is
	qpdfjob_register_progress_reporter in the C API.

	* Add examples that show how to capture QPDFJob's output by
	configuring the default logger (qpdfjob-save-attachment.cc,
	qpdfjob-c-save-attachment.c). Fixes #691.

	* Add C API for QPDFLogger -- see qpdflogger-c.h

	* Add additional qpdfjob C API functions take a handle.

	* Add qpdf_exit_code_e to Constants.h so that exit codes from
	QPDFJob are accessible to the C API.

	* When --progress or --verbose is combined with writing to
	standard output, progress reporting and verbose messages go to
	standard error. Previously it was disabled in this case.

2022-06-05  Jay Berkenbilt  <ejb@ql.org>

	* QPDFJob: API breaking change: QPDFJob::doIfVerbose passes a
	Pipeline& rather than a std::ostream& to the the callback
	function.

	* Add integer types to pipeline's operator<<: short, int, long,
	long long, unsigned short, unsigned int, unsigned long, unsigned
	long long.

2022-05-30  Jay Berkenbilt  <ejb@ql.org>

	* qpdf JSON is now at version 2. New command-line arguments:
	--json-output, --json-input, --update-from-json. New methods
	QPDF::writeJSON, QPDF::createFromJSON, QPDF::updateFromJSON. For
	details, see the "qpdf JSON" chapter of the manual.

	* When showing encryption data in json output, when the user
	password was recovered with by the owner password and the
	specified password does not match the user password, reveal the
	user password. This is not possible with 256-bit keys.

	* Include additional information in --list-attachments --verbose
	and in --json --json-key=attachments.

	* Add QUtil::qpdf_time_to_iso8601 and QUtil::pdf_time_to_iso8601
	for converting PDF/qpdf timestamps to ISO-8601 date format.

2022-05-18  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::FileCloser to the public API. This is a simple inline
	class to help with automatic file closing.

2022-05-17  Jay Berkenbilt  <ejb@ql.org>

	* Allow passing *uninitialized* (not null) objects to
	replaceStreamData as filter and/or decode_parms to leave any
	existing values for /Filter and /DecodeParms untouched.

2022-05-15  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::is_long_long to test whether a string can be
	converted to a long long and back without loss of information.

2022-05-04  Jay Berkenbilt  <ejb@ql.org>

	* JSON: add a new "blob" type that takes a function to write data
	into. The blob is serialized as a base64-encoded representation of
	whatever is written to the function.

	* FileInputSource has new constructors that eliminate the need to
	call setFilename or setFile in most cases.

	* Enhance JSON by adding a write method that takes a Pipeline* and
	depth, and add several helper methods to make it easier to write
	large amounts of JSON incrementally without having to have the
	whole thing in memory.

	* json v1 output: make "pages" and "objects" consistent.
	Previously, "objects" always reflected the objects exactly as they
	appeared in the original file, while "pages" reflected objects
	after repair of the pages tree. This could be misleading. Now, if
	"pages" is specified, "objects" shows the effects of repairing the
	page tree, and if not, it doesn't. This makes no difference for
	correct PDF files that don't have problems in the pages tree. JSON
	v2 will behave in a similar way.

2022-05-03  Jay Berkenbilt  <ejb@ql.org>

	* Add new Pipeline class Pl_String which appends to a std::string&
	passed to it at construction.

	* Add new Pipeline class Pl_OStream, similar to Pl_StdioFile but
	takes a std::ostream instead of a FILE*.

	* Add new convenience methods to Pipeline: writeCStr and
	writeString. Also add a limit << operator that takes C strings and
	std::strings. Also add an overloaded version of write that takes
	"char const*".

	* API change: Pipeline::write now takes "unsigned char const *"
	instead of "unsigned char*". Callers shouldn't have to change
	anything, though can stop using writable strings or
	QUtil::unsigned_char_pointer. If you have implemented your own
	pipelines, you should change your write method to take a const
	pointer.

2022-05-01  Jay Berkenbilt  <ejb@ql.org>

	* JSON: add reactors to the JSON parser, making it possible to
	react to JSON parsing events as they occur and to block the
	results from being stored. This makes it possible to incrementally
	parse arbitrarily large JSON inputs.

2022-04-30  Jay Berkenbilt  <ejb@ql.org>

	* QPDFWriter: change encryption API calls
	  - Remove deprecated versions of setR*EncryptionParameters
	    methods from before qpdf 8.4.0
	  - Replace setR2EncryptionParameters with
	    setR2EncryptionParametersInsecure
	  - Replace setR3EncryptionParameters with
	    setR3EncryptionParametersInsecure
	  - Replace setR4EncryptionParameters with
	    setR4EncryptionParametersInsecure

	* C API: change encryption API calls to match C++ interface
	  - Remove pre-8.4.0 functions:
	    - qpdf_set_r3_encryption_parameters
	    - qpdf_set_r4_encryption_parameters
	    - qpdf_set_r5_encryption_parameters
	    - qpdf_set_r6_encryption_parameters
	  - Add "_insecure" to insecure encryption triggers:
	    - Replace void qpdf_set_r2_encryption_parameters
	      with qpdf_set_r2_encryption_parameters_insecure
	    - Replace void qpdf_set_r3_encryption_parameters2
	      with qpdf_set_r3_encryption_parameters_insecure
	    - Replace void qpdf_set_r4_encryption_parameters2
	      with qpdf_set_r4_encryption_parameters_insecure

	* Make attempting to write encrypted files that use RC4 (40-bit or
	128-bit without AES) an error rather than a warning when
	--allow-weak-crypto is not specified. Fixes #576.

2022-04-24  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: "removeAttachment" in the job JSON now takes an array
	of strings instead of a string. It should have taken an array of
	strings since the corresponding command-line argument,
	--remove-attachment, is repeatable. Fixes #693.

	* Deprecate QPDFObjectHandle::replaceOrRemoveKey -- it does and
	always has done the same thing as replaceKey.

2022-04-23  Jay Berkenbilt  <ejb@ql.org>

	* Add a new QPDF::warn method that takes the parameters of
	QPDFExc's constructor except for the filename, which is taken from
	the QPDF object. This is a shorter way to issue warnings on behalf
	of a QPDF object.

	* Add new method QUtil::is_explicit_utf8 that tests whether a
	string is explicitly marked as being UTF-8 encoded, as allowed by
	the PDF 2.0 spec. Such a string starts with the bytes 0xEF 0xBB
	0xBF, which is the UTF-8 encoding of U+FEFF.

	* Add new method QUtil::get_next_utf8_codepoint as a low-level
	helper for iterating through the UTF-8 characters in a byte
	string.

2022-04-16  Jay Berkenbilt  <ejb@ql.org>

	* Breaking CLI change: the default value for --json is now
	"latest" rather than "1". At this moment, "1" is the latest
	version, but version "2" will be added before the release of
	qpdf 11.

	* Perform code cleanup including some source-compatible but not
	binary compatible changes to function signatures, use of anonymous
	namespaces, and use of "= default" and "= delete" in declarations.

2022-04-09  Jay Berkenbilt  <ejb@ql.org>

	* Replace PointerHolder with std::shared_ptr through the QPDF API.
	A backward-compatible interface is provided and enabled by default
	with a warning that can be turned off. See "Smart Pointers" in the
	"Design and Library Notes" section of the manual for information
	including a detailed migration process to assist with migrating
	code that uses the qpdf library.

2022-04-03  Jay Berkenbilt  <ejb@ql.org>

	* Add automatic code formatting with clang-format. See "Code
	Formatting" in the "Contributing to qpdf" chapter of the manual.

2022-03-19  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.3.0cmake1: unofficial release

	* Conversion of build system to cmake. This change doesn't include
	any user-visible functional changes to the library API or CLI but
	completely replaces the build system. Details can be found in the
	manual in the "Building and Installing QPDF" and "Notes for
	Packagers" sections, especially "Converting From autoconf to
	cmake" in "Building and Installing QPDF". Highlights of the
	changes can be found in the release notes.

2022-03-08  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.3: release

	* Use Windows 2022 github runners and therefore Visual Studio 2022
	to create Windows distributions

	* Fix DLL export issue with mingw (Windows)

2022-03-07  Jay Berkenbilt  <ejb@ql.org>

	* Minor internal changes to assist with building in other
	environments: rename internal bits.icc to qpdf/bits_functions.hh
	(not part of public API), enforce reordering of header files to
	prevent jpeglib.h from interfering with other headers, remove an
	unused header that was accidentally added in 10.6.0 but never
	referenced by any code.

	* Make build work and tests work when NDEBUG is defined. This
	involved a few changes to some test files but no changes to any
	library code.

2022-02-25  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix in JSON parser: accept \/ in a string as valid input per
	JSON spec even though we don't translate / to \/ on output.

2022-02-22  Jay Berkenbilt  <ejb@ql.org>

	* Recognize PDF strings explicitly marked as UTF-8 as allowed by
	the PDF 2.0 spec. Fixes #654.

2022-02-18  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when generating appearance streams, the font size was
	substituted incorrectly from /DA if Tf was absent or the number
	preceding Tf was out of range. Fixes #655.

2022-02-16  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.2: release

2022-02-15  Jay Berkenbilt  <ejb@ql.org>

	* Fix asymmetrical logic between
	QPDFObjectHandle::newUnicodeString() and
	QPDFObjectHandle::getUTF8Val(). The asymmetrical logic didn't
	matter before fixing the PDF Doc transcoding bugs.

	* When analyzing PDF strings, recognize UTF-16LE as UTF-16. The
	PDF spec only allows UTF-16BE, but most readers seem to allow
	both. Fixes #649.

	* Bug fix: 10.6.0 inadvertently removed an unknown/undocumented
	CLI parsing feature, which has been restored in 10.6.2. Fixes #652.

	* Don't map 0x18 through 0x1f, 0x7f, 0x9f, or 0xad as fixed points
	when transcoding UTF-8 to PDFDoc. These code points have different
	meanings in those two encoding systems. Fixes #650.

2022-02-11  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.1: release

	* Fix some compilation issues from use of abs without including
	proper headers.

2022-02-09  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.0: release

	* Fix one more PDF doc encoding omission: 0xAD is also undefined.
	Fixes #637.

2022-02-08  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when splitting pages with --split-pages or selecting
	pages with --pages, set the output PDF version to the maximum of
	all the input PDF versions. This is a fix to QPDFJob. If you are
	creating output PDF files yourself from multiple inputs, you will
	need to code the same thing. The new PDFVersion object, its
	updateIfGreater() method, and the new QPDF and QPDFWriter methods
	described below make this very easy to do. Fixes #610.

	* Add new class PDFVersion for more convenient comparison of PDF
	version numbers from the %!PDF header.

	* Add QPDF::getVersionAsPDFVersion() to return the PDF version and
	extension together as a PDFVersion object instead of a string.

	* Add a QPDFWriter::setMinimumPDFVersion() that takes a PDFVersion
	object.

2022-02-06  Jay Berkenbilt  <ejb@ql.org>

	* Pl_Buffer and QPDFWriter: add getBufferSharedPointer(), which
	turns a PointerHolder<Buffer> but will return a
	std::shared_ptr<Buffer> in qpdf 11.

	* From m-holger: add getKeyIfDict(), which calls getKey for
	dictionaries and returns null if called on null. This is for
	easier access to optional, lower-level dictionaries.

2022-02-05  Jay Berkenbilt  <ejb@ql.org>

	* Add several new accessors to QPDFObjectHandle: the bool
	getValueAsX(X&) accessors allow an alternative way to retrieve
	values from QPDFObjectHandle objects and can result in more
	concise code in many situations. Thanks to m-holger for the
	contribution.

	* Add qpdf_oh_new_binary_unicode_string and
	qpdf_oh_get_binary_utf8_value to the C API. This makes it possible
	to handle UTF-8-encoded strings with embedded NUL characters. Thanks
	to m-holger for the contribution.

	* Add a global user-defined string literal "_qpdf" as a shorthand
	for QPDFObjectHandle::parse, allowing you to create
	QPDFObjectHandle objects with

	QPDFObjectHandle oh = "<</Some (PDF)>>"_qpdf;

	* Expose QPDF::emptyPDF to the C API as qpdf_empty_pdf()

	* Add comments letting people know that the version string
	returned by QPDF::QPDFVersion and qpdf_get_qpdf_version is static.

	* Add QUtil::make_unique_cstr to return a std::unique_ptr<char[]>
	as an alternative to QUtil::copy_string and
	QUtil::make_shared_cstr.

2022-02-04  Jay Berkenbilt  <ejb@ql.org>

	* New preprocessor symbols QPDF_MAJOR_VERSION, QPDF_MINOR_VERSION,
	QPDF_PATCH_VERSION as numbers and QPDF_VERSION as a string. These
	can be used for feature testing in code. These are in qpdf/DLL.h,
	which is included by every header that adds to the public API.
	Since these constants are introduced in version 10.6, it's
	important for them to be in a header that everyone already
	includes so you don't have to try to include a header that won't
	be there.

	* PointerHolder: add a get() method and a use_count() method for
	compatibility with std::shared_ptr. In qpdf 11, qpdf's APIs will
	switch to using std::shared_ptr instead of PointerHolder, though
	there will be a PointerHolder class with a backward-compatible
	API. To ease the transition, we are adding get() now with the same
	semantics as std::shared_ptr's get. Note that there is a
	difference in behavior: const PointerHolder has always behaved
	incorrectly. const PointerHolder objects only returned const
	pointers. This is wrong. If you want a const pointer, use
	PointerHolder<T const>. A const PointerHolder just shouldn't allow
	its pointer to be reassigned. The new get() method behaves
	correctly in that calling get() on a const PointerHolder to a
	non-const pointer returns a non-const pointer. This is the way
	regular pointers behave.

2022-02-01  Jay Berkenbilt  <ejb@ql.org>

	* Major refactor: all functionality from the qpdf CLI is now
	available for library users using the QPDFJob class. See comments
	in include/qpdf/QPDFJob.hh and a new chapter about QPDFJob in the
	manual. QPDFJob provides fluent interfaces for setting options
	that exactly map to command-line arguments. There are also methods
	for initializing QPDFJob from an argv array and from a JSON
	object.

	* A light C API around basic QPDFJob functionality is in
	include/qpdf/qpdfjob-c.h.p

	* Add new functions version of QUtil::call_main_from_wmain that
	takes a constant argv array.

2022-01-31  Jay Berkenbilt  <ejb@ql.org>

	* Have --json-help just output the JSON object, leaving a
	description to --help and the manual.

	* The --json flag now takes a version number as an optional
	parameter. The default will remain version 1 for compatibility
	until the release of qpdf 11, after which it will become "latest".
	At this time, there's only version 1, but a version 2 may appear
	in a future qpdf.

2022-01-28  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFUsage exception, which is thrown by QPDFJob to indicate
	command-line usage or job configuration errors.

2022-01-22  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::make_shared_cstr to return a std::shared_ptr<char>
	instead of a char* like QUtil::copy_string

	* JSON: for (qpdf-specific, not official) "schema" checking, add
	the ability to treat missing fields as optional. Also ensure that
	values in the schema are dictionary, array, or string.

	* Add convenience methods isNameAndEquals and isDictionaryOfType
	to QPDFObjectHandle with corresponding functions added to the C
	API. Thanks to m-holger for the contribution.

2022-01-17  Jay Berkenbilt  <ejb@ql.org>

	* Add JSON::parse. Now qpdf's JSON class implements a
	general-purpose JSON parser and serializer, but there are better
	options for general use. This is really designed for qpdf's
	internal use and is set up to be compatible with qpdf's existing
	API and to hook into a planned JSON-based API to the QPDFJob
	class.

	* Add isDictionary and isArray to JSON

2022-01-11  Jay Berkenbilt  <ejb@ql.org>

	* Major overhaul of documentation and help for the qpdf
	command-line tool. qpdf --help is now broken into topics rather
	than being one great wall of text, and the command-line arguments
	are indexed in the manual. The entire text of the "Running qpdf"
	chapter has been reviewed thoroughly. Many thanks once again to
	M. Holger for a detailed review and editorial assistance with the
	manual.

	* Bug fix: add missing characters from PDF doc encoding.
	Fixes #606.

2021-12-29  Jay Berkenbilt  <ejb@ql.org>

	* Add method QUtil::file_can_be_opened

2021-12-21  Jay Berkenbilt  <ejb@ql.org>

	* 10.5.0: release

	* Add documentation link to top-level README

	* Discontinue inclusion of the pre-built documentation in the
	source distribution. Consult the packaging documentation in the
	manual for details. The file README-doc.txt is installed in the
	doc directory by default and contains information that users will
	need to know to find the documentation.

2021-12-19  Jay Berkenbilt  <ejb@ql.org>

	* C API: clarify documentation around string lengths. Add two new
	methods: qpdf_oh_get_binary_string_value and
	qpdf_oh_new_binary_string to make the need to handle the length
	and data separate in more explicit in cases in which the string
	data may contain embedded null characters.

2021-12-17  Jay Berkenbilt  <ejb@ql.org>

	* C API: simplify error handling for uncaught errors (never in a
	released version) and clarify documentation in qpdf-c.h around
	error handling. See qpdf-c.h for details, including how to check
	for errors and the new function qpdf_silence_errors.

	* C API: expose getTypeCode and getTypeName from QPDFObjectHandle.
	Fixes #597.

	* C API: add functions for working with stream data. Search for
	"STREAM FUNCTIONS" in qpdf-c.h. Fixes #596.

	* QPDFObjectHandle object types have been moved from
	QPDFObject::object_type_e to qpdf_object_type_e (defined in
	Constants.h). Old values are available for backward compatibility.

	* Add Pl_Buffer::getMallocBuffer() to initialize a buffer with
	malloc in support of the C API

2021-12-16  Jay Berkenbilt  <ejb@ql.org>

	* Add several functions to the C API for working with pages. C
	wrappers around several of the "Legacy" page operations from
	QPDFObjectHandle.hh have been added. See "PAGE FUNCTIONS" in
	qpdf-c.h for details. Fixes #594.

2021-12-12  Jay Berkenbilt  <ejb@ql.org>

	* Convert documentation from docbook to reStructuredText/Sphinx.

2021-12-10  Jay Berkenbilt  <ejb@ql.org>

	* Handle bitstream overflow errors more gracefully. Fixes #581.

	* C API: add qpdf_get_object_by_id, qpdf_make_indirect_object, and
	qpdf_replace_object, exposing the corresponding methods in QPDF
	and QPDFObjectHandle. Fixes #588.

	* Add missing QPDF_DLL to QPDFObjectHandle::addTokenFilter so that
	it is actually accessible as part of the public interface as
	intended. Fixes #580.

	* C API: Overhaul how errors are handle the C API's object handle
	interfaces. Clarify documentation regarding object accessors and
	how type errors and warnings are handled. Many cases that used to
	crash code that used the C API can now be trapped and will be
	written stderr if not trapped. See qpdf-c.h for details.

	* C API: Add qpdf_oh_new_uninitialized to explicitly create
	uninitialized object handles.

	* Add new error code qpdf_e_object that is used for exceptions
	(including warnings) that are caused by using QPDFObjectHandle
	methods on object handles of the wrong type.

2021-12-02  Jay Berkenbilt  <ejb@ql.org>

	* C API: Add qpdf_oh_is_initialized.

	* C API: Add qpdf_get_last_string_length to return the length of
	the last string returned. This is necessary in order to fully
	retrieve values of strings that may contain embedded null characters.

	* C API: Add qpdf_oh_new_object to clone an object handle. Change
	implemented by m-holger in #587.

2021-11-16  Jay Berkenbilt  <ejb@ql.org>

	* 10.4.0: release

2021-11-10  Jay Berkenbilt  <ejb@ql.org>

	* Add --allow-weak-crypto option to suppress warnings about use of
	weak cryptographic algorithms. Update documentation around this
	issue. Fixes #358.

2021-11-07  Jay Berkenbilt  <ejb@ql.org>

	* Relax xref recovery logic a bit so that files whose objects are
	either missing endobj or have endobj at other than the beginning
	of a line can still be recovered. Fixes #573.

2021-11-04  Jay Berkenbilt  <ejb@ql.org>

	* Add support for OpenSSL 3. Fixes #568.

	The OpenSSL version is detected at compile-time. If you want to
	build with OpenSSL 3 on a system that has OpenSSL 1 installed, you
	can run configure like this (or similar to this depending on how
	you installed openssl3):

	pc_openssl_CFLAGS=-I/path/to/openssl3/include \
	pc_openssl_LIBS='-L/path/to/openssl3/lib64 -lssl -lcrypto' \
	./configure

	where /path/to/openssl3 is wherever your OpenSSL 3 distribution is
	installed. You may also need to set the LD_LIBRARY_PATH
	environment variable if it's not installed in a standard location.

	* Add range check in QPDFNumberTreeObjectHelper (fuzz issue 37740).

	* Add QIntC::range_check_subtract to do range checking on
	subtraction, which has different boundary conditions from
	addition.

	* Bug fix: fix crash that could occur under certain conditions
	when using --pages with files that had form fields. Fixes #548.

	* Add an extra check to the library to detect when foreign objects
	are inserted directly (instead of using
	<function>QPDF::copyForeignObject</function>) at the time of
	insertion rather than when the file is written. Catching the error
	sooner makes it much easier to locate the incorrect code.

2021-11-03  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: make overlay/underlay work on a page with no resource
	dictionary. Fixes #527.

2021-11-02  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDF::findPage to the public API. This is primarily to help
	improve the efficiency of code that wraps the qpdf library, such
	as pikepdf. Fixes #516.

	* zlib-flate: warn and exit with code 3 when there is corrupted
	input data even when decompression is possible. We do this in the
	zlib-flate CLI so that it can be more reliably used to test the
	validity of zlib streams, but we don't warn by default in qpdf
	itself because PDF files in the wild exist with this problem and
	other readers appear to tolerate it. There is a PDF in the qpdf
	test suite (form-filled-by-acrobat.pdf) that was written by a
	version of Adobe Acrobat that exhibits this problem. Fixes #562.

	* Add Pl_Flate::setWarnCallback to make it possible to be notified
	of data errors that are recoverable but still indicate invalid
	data.

	* Improve error reporting when someone forgets the -- after
	--pages. Fixes #555.

2021-05-12  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: ensure we don't overflow any string bounds while
	handling completion, even when we are given bogus input values.
	Fixes #441.

2021-05-09  Jay Berkenbilt  <ejb@ql.org>

	* Improve performance of preservation of object streams by
	avoiding unnecessary traversal of objects when there are no object
	streams.

2021-05-08  Jay Berkenbilt  <ejb@ql.org>

	* 10.3.2: release

	* Fix problem that caused the generated manual from being included
	in the Windows distributions. Fixes #521.

	* Fix 11-year-old bug of leaving unreferenced objects in preserved
	object streams. Fixes #520.

2021-04-17  Jay Berkenbilt  <ejb@ql.org>

	* Portability fix: use tm_gmtoff rather than global timezone
	variable if available to get timezone offset. This fixes
	compilation on BSD and also results in a daylight saving
	time-aware offset for Linux or other GNU systems. Fixes #515.

2021-04-05  Jay Berkenbilt  <ejb@ql.org>

	* When adding a page, if the page already exists, make a shallow
	copy of the page instead of throwing an exception. This makes the
	behavior of adding a page from the library consistent with what
	the CLI does and also with what the library does if it starts with
	a file that already has a duplicated page. Note that this means
	that, in some cases, the page you pass to addPage or addPageAt
	(either in QPDF or QPDFPageDocumentHelper) will not be the same
	object that actually gets added. (This has actually always been
	the case.) That means that, if you are going to do subsequent
	modification on the page, you should retrieve it again.

2021-03-11  Jay Berkenbilt  <ejb@ql.org>

	* 10.3.1: release

	* Bug fix: allow /DR to be direct in /AcroForm

2021-03-04  Jay Berkenbilt  <ejb@ql.org>

	* 10.3.0: release

	* The last several changes are in support of fixing more complex
	cases of keeping form fields working properly through page copying
	operations. Fixes #509.

	* Deprecated QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage
	-- use QPDFAcroFormDocumentHelper::fixCopiedAnnotations instead.
	The API for dealing with annotations and form fields around
	copying pages is extremely complex and very hard to get right. It
	is planned for a future version of qpdf to have a higher level
	interface for dealing with copying pages around and preserving
	document-level constructs.

	* Add QPDFAcroFormDocumentHelper::getFieldsWithQualifiedName for
	returning a list of fields by name.

	* Add QPDFAcroFormDocumentHelper::addAndRenameFormFields to add a
	collection of fields while ensuring that, within the collection,
	fields with the same name continue to have the same name, but that
	they don't conflict with exiting fields in the document.

	* Add QPDFAcroFormDocumentHelper::setFormFieldName for changing
	the name of a form field in a manner that preserves
	QPDFAcroFormDocumentHelper's cache.

2021-03-03  Jay Berkenbilt  <ejb@ql.org>

	* Handle /DR properly when copying form fields. This is a
	significant rework of the form field copying from 10.2.0. It
	ensures that when copy fields from different files, we resolve any
	conflicting names in resources.

	* Add QPDFMatrix::operator==

	* Add QPDFObjectHandle::makeResourcesIndirect

2021-03-02  Jay Berkenbilt  <ejb@ql.org>

	* Add an optional resource_names argument to getUniqueResourceName
	for added efficiency.

	* Add conflict detection QPDFObjectHandle::mergeResources.

2021-03-01  Jay Berkenbilt  <ejb@ql.org>

	* Improve code that finds unreferenced resources to ignore names
	in the content stream that are not fonts or XObjects. This should
	reduce the number of cases when qpdf needlessly decides not to
	remove unreferenced resources. Hopefully it doesn't create any new
	bugs where it removes unreferenced resources that it isn't
	supposed to.

	* Add QPDF::numWarnings() -- useful to tell whether any warnings
	were issued by a specific bit of code.

2021-02-26  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: QPDFFormFieldObjectHelper was mis-handling /DA, /Q, and
	/DR in ways that usually didn't matter but were still wrong. /DA
	and /Q were being found in the field hierarchy, but if not found,
	the default values in the /AcroForm dictionary were not being
	used. /DR was being treated as an inherited field in the field
	dictionary, which is wrong. It is actually supposed to come from
	the /AcroForm dictionary. We were getting away with this since
	many popular form writers seem to copy it to the field as well,
	even though the spec makes no mention of doing this. To support
	this, QPDFFormFieldObjectHelper::getDefaultResources was added.

2021-02-25  Jay Berkenbilt  <ejb@ql.org>

	* Update StreamDataProvider examples to use copyStream() when they
	want to get to the original stream data from the provider. Prior
	to 10.2.0, we had to copy the stream to another QPDF, but now we
	can just use copyStream().

	* Bug fix/behavior change: when QPDF::replaceObject or
	QPDF::swapObjects is called, existing QPDFObjectHandle instances
	will now notice the change. This removes a long-standing source of
	bugs and confusing behavior.

2021-02-23  Jay Berkenbilt  <ejb@ql.org>

	* 10.2.0: release

	* The test for the input and output files being the same wasn't
	implemented correctly for --split-pages since the specified output
	file is really a pattern, not the actual output file.

2021-02-22  Jay Berkenbilt  <ejb@ql.org>

	* From qpdf CLI, --pages and --split-pages will properly preserve
	interactive form functionality. Fixes #340.

	* Add QPDFAcroFormDocumentHelper::copyFieldsFromForeignPage to
	copy form fields from a foreign page into the current file. (This
	method didn't work and was deprecated in 10.3.0.)

	* Add QPDFFormFieldObjectHelper::getTopLevelField to get the
	top-level field for a given form field.

	* Update pdf-overlay-page example to include copying of
	annotations.

	* Add a new version of QPDFPageObjectHelper::placeFormXObject that
	initializes the transformation matrix that was used so you don't
	have to call both placeFormXObject and
	getMatrixForFormXObjectPlacement.

2021-02-21  Jay Berkenbilt  <ejb@ql.org>

	* From qpdf CLI, --overlay and --underlay will copy annotations
	and form fields from overlay/underlay file. Fixes #395.

	* Add QPDFPageObjectHelper::copyAnnotations, which copies
	annotations and, if applicable, associated form fields, from one
	page to another, possibly transforming the rectangles.

	* Bug fix: --flatten-rotation now applies the required
	transformation to annotations on the page.

	* Add QPDFAcroFormDocumentHelper::transformAnnotations to apply a
	transformation to a group of annotations.

	* Add QPDFObjGen::unparse()

	* Add QPDFObjectHandle::copyStream() for making a copy of a stream
	within the same QPDF instance.

	* Allow QPDFObjectHandle::newArray and
	QPDFObjectHandle::newFromMatrix take QPDFMatrix as well as
	QPDFObjectHandle::Matrix

	* Make member variables a--f of QPDFMatrix public

2021-02-20  Jay Berkenbilt  <ejb@ql.org>

	* Allow --rotate=0 to clear rotation from a page.

2021-02-18  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFAcroFormDocumentHelper::addFormField, which adds a new
	form field, initializing the AcroForm dictionary if needed.

	* Add QPDFPageObjectHelper::getMatrixForFormXObjectPlacement,
	which returns the transformation matrix required to map from a
	form field's coordinate system into a specific rectangle within
	the page.

	* Add QUtil::path_basename to get last element of a path.

	* Add examples/pdf-attach-file.cc to illustrate new file
	attachment method and also new parse that takes indirect objects.

2021-02-17  Jay Berkenbilt  <ejb@ql.org>

	* Allow optional numeric argument to --collate. If --collate=n is
	given, pull n pages from the first file, n pages from the second
	file, etc., until we run out of pages.

2021-02-15  Jay Berkenbilt  <ejb@ql.org>

	* Add a version of QPDFObjectHandle::parse that takes a QPDF* as
	context so that it can parse strings containing indirect object
	references.

2021-02-14  Jay Berkenbilt  <ejb@ql.org>

	* Add new versions of QPDFObjectHandle::replaceStreamData that
	take std::function objects for cases when you need something
	between a static string and a full-fledged StreamDataProvider.
	Using this with QUtil::file_provider is a very easy way to create
	a stream from the contents of a file.

2021-02-12  Jay Berkenbilt  <ejb@ql.org>

	* Move formerly internal QPDFMatrix class to the public API. This
	class provides convenience methods for working with transformation
	matrices.

	* QUtil::double_to_string: trim trailing zeroes by default, and
	add option to not trim trailing zeroes. This causes a syntactic
	but semantically preserving change in output when doubles are
	converted to strings. The library uses double_to_string in only a
	few places. In practice, output will be different (trailing zeroes
	removed) in code that creates form XObjects (mostly generation of
	appearance streams for form fields as well as overlay and
	underlay) and in the flatten rotation code that was added in qpdf
	10.1.

2021-02-10  Jay Berkenbilt  <ejb@ql.org>

	* Require a C++-14 compiler.

	* Detect loops when adding when reading outlines dictionary upon
	initialization of QPDFOutlineDocumentHelper (fuzz issue 30507).

	* Add "attachments" as an additional json key, and add some
	information about attachments to the json output.

	* Add new command-line arguments for operating on attachments:
	--list-attachments, --add-attachment, --remove-attachment,
	--copy-attachments-from. See --help and manual for details.

2021-02-09  Jay Berkenbilt  <ejb@ql.org>

	* Add methods to QUtil for working with PDF timestamp strings:
	pdf_time_to_qpdf_time, qpdf_time_to_pdf_time,
	get_current_qpdf_time.

2021-02-08  Jay Berkenbilt  <ejb@ql.org>

	* Add helper classes for file attachments:
	QPDFEmbeddedFileDocumentHelper, QPDFFileSpecObjectHelper,
	QPDFEFStreamObjectHelper. See their header files for details.

2021-02-07  Jay Berkenbilt  <ejb@ql.org>

	* Add new functions QUtil::pipe_file and QUtil::file_provider for
	sending the contents of a file through a pipeline as binary data.

2021-02-04  Jay Berkenbilt  <ejb@ql.org>

	* Add new option --password-file=file for reading the decryption
	password from a file. file may be "-" to read from standard input.
	Fixes #499.

	* By default, give an error if a user attempts to encrypt a file
	with a 256-bit key, a non-empty user password, and an empty owner
	password. Such files are insecure since they can be opened with no
	password. To allow explicit creation of files like this, pass the
	new --allow-insecure option. Thanks to github user RobK88 for a
	detailed analysis and for reporting this issue. Fixes #501.

2021-02-02  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: if a form XObject lacks a resources dictionary,
	consider any names in that form XObject to be referenced from the
	containing page. This is compliant with older PDF versions. Also
	detect if any form XObjects have any unresolved names and, if so,
	don't remove unreferenced resources from them or from the page
	that contains them. Fixes #494.

2021-01-31  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: properly handle strings if they appear in inline image
	dictionaries while externalizing inline images.

2021-01-30  Jay Berkenbilt  <ejb@ql.org>

	* Add examples/pdf-name-number-tree.cc to illustrate new
	name/number tree API and new array/dictionary iterator API.

2021-01-29  Jay Berkenbilt  <ejb@ql.org>

	* Add methods to QPDFObjectHandle that provide a C++ iterator API,
	including C++11 range-for iteration, over arrays and dictionaries.
	With this, you can do

	for (auto i: dict_oh.ditems())
	{
	    // i.first is a string, i.second is a QPDFObjectHandle
	}
	for (auto i: array_oh.aitems())
	{
	    // i is a QPDFObjectHandle
	}

	* QPDFObjectHandle::is* methods to check type now return false on
	uninitialized objects rather than crashing or throwing a logic
	error.

2021-01-24  Jay Berkenbilt  <ejb@ql.org>

	* Implement remove for name and number trees as well as exposing
	remove and insertAfter methods for iterators. With this addition,
	qpdf now has robust read/write support for name and number trees.

2021-01-23  Jay Berkenbilt  <ejb@ql.org>

	* Add an insert method to QPDFNameTreeObjectHelper and
	QPDFNumberTreeObjectHelper.

	* QPDFNameTreeObjectHelper and QPDFNumberTreeObjectHelper will
	automatically repair broken name and number trees by default. This
	behavior can be turned off.

	* Change behavior of QPDFObjectHandle::newUnicodeString so that it
	encodes ASCII or PDFDocEncoding if those encodings will support
	all the characters in the string, resorting to UTF-16 only if the
	other encodings are insufficient. This is a cleaner implementation
	of the intention of encoding strings for use outside of contents
	and results in fewer instances of ASCII strings being needlessly
	encoded as UTF-16. This change may cause qpdf to generate
	different output from the same input when form field values are
	set using methods from QPDFFormFieldObjectHelper.

2021-01-16  Jay Berkenbilt  <ejb@ql.org>

	* Add new constructors for QPDFNameTreeObjectHelper and
	QPDFNumberTreeObjectHelper that take a QPDF object so they can
	create indirect objects and issue warnings. The old constructors
	are deprecated and will be removed in qpdf 11. Just pass in the
	owning QPDF of the object handle used to initialize the helpers.

	* Re-implement QPDFNameTreeObjectHelper and
	QPDFNumberTreeObjectHelper to be much more efficient and to have
	an iterator-based API in addition to the existing one. This makes
	it possible to use "range-for" loops over these helpers and to
	iterate through name and number trees without creating a map
	containing all the keys and values, which is slow and potentially
	consumes a lot of memory.

	* Add warn() to QPDF's public API.

2021-01-11  Jay Berkenbilt  <ejb@ql.org>

	* Fix very old error in code that was finding attachment streams.
	Probably this error never mattered, but the code was still not
	exactly right.

2021-01-06  Jay Berkenbilt  <ejb@ql.org>

	* Give warnings instead of segfaulting if a QPDF operation is
	attempted after calling closeInputSource(). Fixes #495.

2021-01-05  Jay Berkenbilt  <ejb@ql.org>

	* 10.1.0: release

2021-01-04  Jay Berkenbilt  <ejb@ql.org>

	* When qpdf CLI extracts pages, it now only attempts to remove
	unreferenced resources from the pages that it is keeping. This
	change dramatically reduces the time it takes to extract a small
	number of pages from a large, complex file.

	* Move getNext()->write() calls in some pipelines to ensure that
	state gates properly reset even if the next pipeline's write
	throws an exception (fuzz issue 28262).

2021-01-03  Jay Berkenbilt  <ejb@ql.org>

	* Don't include -o nospace with zsh completion setup so file
	completion works normally. Fixes #473.

2021-01-02  Jay Berkenbilt  <ejb@ql.org>

	* Make QPDFPageObjectHelper methods pipeContents, parseContents,
	and addContentTokenFilter work with form XObjects.

	* Rename some QPDFPageObjectHelper methods and make them support
	form XObjects as well as pages. The old names will be preserved
	from compatibility.
	- pipePageContents -> pipeContents
	- parsePageContents -> parseContents

	* Add QPDFObjectHandle::parseAsContents to apply ParserCallbacks
	to a form XObject.

	* QPDFPageObjectHelper::externalizeInlineImages can be called with
	form XObjects as well as pages.

	* Bug fix: QPDFPageObjectHelper::externalizeInlineImages was not
	descending into form XObjects on a page. It now does this by
	default. In the extremely unlikely event that anyone was actually
	depending on the old behavior, it is available by passing
	shallow=true to the externalizeInlineImages call.

	* Bug fix: QPDFObjectHandle::filterPageContents was broken for
	pages with an array of content streams. This caused
	externalize-inline-images to also be broken for this case.

2021-01-01  Jay Berkenbilt  <ejb@ql.org>

	* Add methods to QPDFPageObjectHelper: forEachXObject,
	forEachImage, forEachFormXObject to call a function on each
	XObject (or image or form XObject) in a page or form XObject,
	possibly recursing into nested form XObjects.

	* Add method QPDFPageObjectHelper::getFormXObjects to return a map
	of keys to form XObjects (non-recursively) from a page or form
	XObject.

	* Add method QPDFObjectHandle::isImage to test whether an object
	is an image.

2020-12-31  Jay Berkenbilt  <ejb@ql.org>

	* QPDFPageObjectHelper::removeUnreferencedResources can now be
	called with a QPDFPageObjectHelper created from a form XObject.
	The method already recursed into form XObjects.

	* Rename some QPDFPageObjectHelper methods and make them support
	form XObjects as well as pages. The old names will be preserved
	from compatibility.
	- getPageImages -> getImages
	- filterPageContents -> filterContents

	* Add QPDFObjectHandle::isFormXObject to test whether an object is
	a form XObject.

2020-12-30  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFPageObjectHelper::flattenRotation and --flatten-rotation
	option to the qpdf CLI. The flattenRotation method removes any
	/Rotate key from a page dictionary and implements the same
	rotation by modifying the page's contents such that the various
	page boxes are altered and the page renders identically. This can
	be used to work around buggy PDF applications that don't properly
	handle page rotation. The --flatten-rotation option to the qpdf
	CLI calls flattenRotation for every page.

2020-12-26  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::setFilterOnWrite, which can be used to
	tell QPDFWriter not to filter a stream on output even if it can.
	You can use this to prevent QPDFWriter from touching a stream
	(either uncompressing or compressing) that you have optimized or
	otherwise ensured looks exactly the way you want it, even if
	decode level or stream compression would otherwise cause
	QPDFWriter to modify the stream.

	* Add ostream << for QPDFObjGen. (Don't ask why it took 7.5 years
	for me to decide to do this.)

2020-12-25  Jay Berkenbilt  <ejb@ql.org>

	* Refactor write code to eliminate an extra full traversal of
	objects in the file and to remove assumptions that preclude stream
	references from appearing in /DecodeParms of filterable streams.
	This results in an approximately 8% performance reduction in write
	times.

2020-12-23  Jay Berkenbilt  <ejb@ql.org>

	* Allow library users to provide their own decoders for stream
	filters by deriving classes from QPDFStreamFilter and registering
	them using QPDF::registerStreamFilter. Registered stream filters
	provide code to validate and interpret /DecodeParms for a specific
	/Filter and also to provide a pipeline that will decode. Note that
	it is possible to encode to a filter type that is not supported
	even without this feature. See examples/pdf-custom-filter.cc for
	an example of using custom stream filters.

2020-12-22  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::makeDirect(bool allow_streams) -- if
	allow_streams is true, preserve indirect references to streams
	rather than throwing an exception. This allows the object to be
	made as direct as possible while preserving stream references.

2020-12-20  Jay Berkenbilt  <ejb@ql.org>

	* Add qpdf_register_progress_reporter method to C API,
	corresponding to QPDFWriter::registerProgressReporter. Fixes #487.

2020-11-28  Jay Berkenbilt  <ejb@ql.org>

	* Add new functions to the C API for manipulating
	QPDFObjectHandles. The new functions allow creation and
	modification of objects, which brings a lot of additional power to
	the C API. See include/qpdf/qpdf-c.h for details and
	examples/pdf-c-objects.c for a simple example.

2020-11-21  Jay Berkenbilt  <ejb@ql.org>

	* 10.0.4: release

	* Fix QIntC::range_check to handle negative numbers properly (fuzz
	issue 26994).

2020-11-11  Jay Berkenbilt  <ejb@ql.org>

	* Treat a direct page object as a runtime error rather than a
	logic error since it is actually possible to create a file that
	has this (fuzz issue 27393).

2020-11-09  Jay Berkenbilt  <ejb@ql.org>

	* Handle "." appearing in --pages not preceded by a numeric range
	as a special case in command-line parsing code.

2020-11-04  Jay Berkenbilt  <ejb@ql.org>

	* Ignore the value of the offset/generation field in an xref entry
	for a deleted object. Also attempt file recovery on lower-level
	exceptions thrown while reading the xref table. Fixes #482.

2020-10-31  Jay Berkenbilt  <ejb@ql.org>

	* 10.0.3: release

	* Don't enter extension initialization in QPDFWriter on a direct
	object. Fixes stack overflow in pathological case of /Root being a
	direct object (fuzz issue 26761).

	* My previous fix to #449 (handling foreign streams with indirect
	objects in /Filter and/or /DecodeParms) was incorrect and caused
	other problems. There is a now a correct fix to the original
	problem. Fixes #478.

2020-10-27  Jay Berkenbilt  <ejb@ql.org>

	* 10.0.2: release

2020-10-25  Jay Berkenbilt  <ejb@ql.org>

	* When signing distribution files, generate sha256 checksums
	instead of md5, sha1, and sha512. sha256 seems to be more widely
	used, and there's no reason to use md5 or sha1 anymore.

	* Official Windows releases are now built using the openssl crypto
	provider. The native provider is still available for selection at
	runtime using the QPDF_CRYPTO_PROVIDER environment variable.

	* Bug fix: --no-warn was not suppressing some warnings that might
	be generated by --split-pages.

2020-10-23  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when concatenating content streams, insert a newline if
	needed to prevent the last token from the old stream from being
	merged with the first token of the new stream. Qpdf was mistakenly
	concatenating the streams without regard to the specification that
	content streams are to be broken on token boundaries. Fixes #444.

	* fix-qdf: handle empty streams better with ignore newline by
	treating them as empty even though, technically, a blank line
	would be required inside the Stream. This just makes it easier to
	add place-holder empty streams while editing qdf files by hand.

2020-10-22  Jay Berkenbilt  <ejb@ql.org>

	* Fix memory leak that could occur if objects in object streams
	were resolved more than once and the objects within the object
	streams contained circular references. This leak could be
	triggered when qpdf was run with --object-streams=generate on
	files that already had object streams containing circular
	references (fuzz issue 23642).

	* Add QIntC::range_check for checking to see whether adding two
	numbers together will cause an overflow.

	* Fix loop detection problem when traversing page thumbnails
	during optimization (fuzz issue 23172).

2020-10-21  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: properly handle copying foreign streams that have
	indirect /Filter or /DecodeParms keys when stream data has been
	replaced. The circumstances leading to this bug are very unusual
	but would cause qpdf to either generate an internal error or some
	other kind of warning situation if it would occur. Fixes #449.

	* Qpdf's build and CI has been migrated from Azure Pipelines
	(Azure DevOps) to GitHub Actions.

	* Remove some fuzz files that triggered Mal/PDFEx-H with some
	virus scanners. There's plenty of coverage in the fuzz corpus
	without these files, and it's a nuisance to have virus checkers
	remove them. Fixes #460.

	* Ensure that numeric conversion is not affected by the user's
	global locale setting. Fixes #459.

	* Add qpdf-<version>-linux-x86_64.zip to the list of built
	distributions. This is a simple zip file that contains just the
	qpdf executables and the dependent shared libraries that would not
	ordinarily be present on a base system. This minimal binary
	distribution works as is when used as a Lambda layer in AWS and
	could be suitable for inclusion in a docker image or other
	standalone Linux/x86_64 environment where you want minimal support
	for running the qpdf executable. Fixes #352.

2020-10-20  Jay Berkenbilt  <ejb@ql.org>

	* Add --warning-exit-0 option to the qpdf command line. When
	specified, qpdf will exit with a status of 0 rather than 3 when
	there are warnings without errors. Combine with --no-warn to
	completely ignore warnings.

	* Bug fix: fix further cases in which errors were written to
	stdout. Fixes #438.

	* Build option: add --disable-rpath option to ./configure, which
	disables passing -rpath to the linker when building shared
	libraries with libtool. Fixes #422.

2020-10-16  Jay Berkenbilt  <ejb@ql.org>

	* Accept pull request that improves how the Windows native crypto
	provider is obtained.

	* Accept pull request that improves performance in processing
	files in memory.

	* Accept pull requests that improve openssl configuration and
	error reporting.

	* Build using GitHub Actions. The intention is that this will
	replace Azure Pipelines as the official CI for qpdf for the next
	release.

2020-10-15  Jay Berkenbilt  <ejb@ql.org>

	* Make many minor improvements to the build process and code
	health, including fixing a lgtm warning and compiler warnings from
	newer version of gcc and MSVC toolchains. Add several cosmetic
	improvements to build output in CI.

	* Added LL_FMT to config.h.in. This is populated automatically by
	autoconf, but if build with your own build system, you may need to
	define it as whatever the format string needed by printf for long
	long is. Usually this is "%lld", but it can be "%I64d" for some
	older Windows-based compilers.

2020-04-29  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: qpdf --check was writing errors and warnings reported
	by checkLinearization to stdout instead of stderr. Fixes #438.

2020-04-09  Jay Berkenbilt  <ejb@ql.org>

	* 10.0.1: release

2020-04-08  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: qpdf 10.0.0 introduced a bug in which
	QPDFObjectHandle::getStreamData would return the raw data when
	called on an unfilterable stream instead of throwing an exception
	like it's supposed to. Fixes #425.

2020-04-07  Jay Berkenbilt  <ejb@ql.org>

	* Improve pdf-invert-images example to show a pattern of copying
	streams into another QPDF object to enable a stream data provider
	to access the original stream data.

	* Fix error that caused a compilation error with clang. Fixes
	#424.

2020-04-06  Jay Berkenbilt  <ejb@ql.org>

	* 10.0.0: release

	* Move random number generation into the crypto providers. The old
	os-based secure random number generation with fallback to insecure
	random number generation (only if allowed at build time) has moved
	into the native crypto provider. If using other providers
	(currently gnutls or openssl), random number generation will use
	those libraries. The old interfaces for supplying your own random
	number generator are still in place. Fixes #418.

	* Source-level incompatibility: remove QUtil::srandom. There was
	no reason to ever call this, and it didn't do anything unless
	insecure random number generation was compiled in, which it is not
	by default. If you were calling this, just remove the call because
	it wasn't doing anything anyway.

	* Add openssl crypto provider, contributed by Dean Scarff. This
	provider is implemented using OpenSSL and also works with
	BoringSSL.

2020-04-04  Jay Berkenbilt  <ejb@ql.org>

	* Add a new provideStreamData method for StreamDataProvider that
	allows a success code to be returned and that accepts the
	suppress_warnings and will_retry methods. This makes it possible
	to have a StreamDataProvider call pipeStreamData and propagate its
	results back. This change allows better error handling and
	recovery when objects are copied from other files and when
	"immediate copy from" is enabled.

	* When copying foreign streams, the same type of recovery from
	streams with filtering errors is performed as when dealing with
	streams in the original input. This could happen, for example, if
	you are using the --pages option to take pages from another file
	and that file has errors in it.

	* Add a new version of QPDFObjectHandle::pipeStreamData whose
	return value indicates overall success or failure rather than
	whether nor not filtering was attempted. It should have always
	been this way. This change was done in a backward-compatible
	fashion. Previously existing pipeStreamData methods' return values
	mean the same as always.

	* Add "objectinfo" section to json output. In this release,
	information about whether each object is a stream or not is
	provided. There's otherwise no way to tell conclusively from the
	json output. Over time, other computed information about objects
	may be added here.

	* Add new option --remove-unreferenced-resources that takes auto,
	yes, or no as options. This tells qpdf whether to attempt to
	remove unreferenced resources from pages when doing page splitting
	operations. Prior to this change, the default was to attempt to
	remove unreferenced resources, but this operation was very slow,
	especially for large and complex files. The new default is "auto",
	which tells qpdf to analyze the file for shared resources. This is
	a relatively quick test. If no shared resources are found, then we
	don't attempt to remove unreferenced resources, because
	unreferenced resources never occur in files without shared
	resources. To force qpdf to look for and remove unreferenced
	resources, use --remove-unreferenced-resources=yes. The option
	--preserve-unreferenced-resources is now a synonym for
	--remove-unreferenced-resources=no.

	* Use std::atomic for unique ID generation internally within the
	library. This eliminates the already extremely low chance of a
	collision, improves thread safety, and removes a dependency on a
	random number generator. Thanks to Dean Scarff for the
	contribution.

2020-04-03  Jay Berkenbilt  <ejb@ql.org>

	* Allow qpdf to be built on systems without wchar_t. All "normal"
	systems have wchar_t because it is part of the C++ standard, but
	there are some stripped down environments that don't have it. See
	README.md (search for wchar_t) for instructions and a discussion.
	Fixes #406.

	* Add two extra optional arguments to
	QPDFPageObjectHelper::placeFormXObject to control whether the
	placed item is allowed to be shrunk or expanded to fit within or
	maximally fill the destination rectangle. Prior to this change,
	placeFormXObject might shrink it but would never expand it.

	* When calling the C API, accept any non-zero value as TRUE rather
	than just 1. This appears to resolve issues on Windows when
	calling some versions of the DLL directly from other languages.

2020-04-02  Jay Berkenbilt  <ejb@ql.org>

	* Add method QPDFObjectHandle::unsafeShallowCopy for copying only
	top-level dictionary keys or array items. See comments in
	QPDFObjectHandle.hh for when this should be used.

	* Remove Members class indirection for QPDFObjectHandle. Those are
	copied and assigned too often, and that change caused a very
	substantial performance hit.

2020-03-31  Jay Berkenbilt  <ejb@ql.org>

	* When detecting unreferenced images during page splitting, if any
	XObjects are form XObjects, recursively descend into them and
	remove any unreferenced objects from them too. Fixes #373.

	* Add QPDFObjectHandle::filterAsContents, which filters a stream's
	data as if it were page contents. This can be useful to filter
	form XObjects the same way we would filter page contents.

	* If QPDF_EXECUTABLE is set, use it as the path to qpdf for
	purposes of completion. This variable is only read during the
	execution of `qpdf --completion-zsh` and `qpdf
	--completion-bash`. It is not used during the actual evaluation of
	completions.

2020-02-22  Jay Berkenbilt  <ejb@ql.org>

	* Update pdf-set-form-values.cc to use and mention
	generateAppearance, which hadn't been added when the example was
	originally created.

	* Detect, warn, and correct the case of /Pages in the document
	catalog incorrectly pointing to a page or intermediate node
	instead of the root of the pages tree. Fixes #398.

2020-01-26  Jay Berkenbilt  <ejb@ql.org>

	* 9.1.1: release

	* Bug fix: in qdf mode, do not write out any XRef streams that may
	have appeared in the original file. These are usually
	unreferenced, but with --preserve-unreferenced, they could be
	written out, which breaks fix-qdf's assumption that there is at
	most one XRef stream and that it appears at the end of the file.
	Fixes #386.

	* Bug fix: when externalizing inline images, a colorspace value
	that was a lookup key in the page's /Resource -> /ColorSpace
	dictionary was not properly handled. Fixes #392.

	* Add "encrypt" key to the json output. This contains largely the
	same information as given by --show-encryption but in a
	consistent, parseable format.

	* Add options --is-encrypted and --requires-password. These can be
	used with files, including encrypted files with unknown passwords,
	to determine whether or not a file is encrypted and whether a
	password is required to open the file. The --requires-password
	option can also be used to determine whether a supplied password
	is correct. Information is supplied through exit codes, making
	these options particularly useful for shell scripts. Fixes #390.

2020-01-14  Jay Berkenbilt  <ejb@ql.org>

	* Fix for Windows being unable to acquire crypt context with a new
	keyset. Thanks to Cloudmersive for the fix. Fixes #387.

	* Rewrite fix-qdf in C++. This means fix-qdf is a proper
	executable now, and there is no longer a runtime requirement on
	perl.

	* Add QUtil::call_main_from_wmain, a helper function that can be
	called in the body of wmain to convert UTF-16 arguments to UTF-8
	arguments and then call another main function.

2020-01-13  Jay Berkenbilt  <ejb@ql.org>

	* QUtil::read_lines_from_file: add new versions that use FILE*,
	use FILE* instead if std::ifstream internally to support correct
	handling of Unicode filenames in Windows, and add the option to
	preserve line endings.

2019-11-17  Jay Berkenbilt  <ejb@ql.org>

	* 9.1.0: release

	* This is the first version of qpdf that requires C++-11.

2019-11-09  Jay Berkenbilt  <ejb@ql.org>

	* 9.1.rc1: release

	* Improve behavior of wildcard expansion for msvc executable when
	run from the Windows cmd.exe shell. Unlike in UNIX environments,
	Windows leaves it up to the executable to expand its own
	wildcards. Fixes #224.

	* Allow :even or :odd to be appended to numeric ranges for
	--pages, --rotate, and other options that take page ranges.

	* When reading /P from the encryption dictionary, use static_cast
	instead of QIntC to convert the value to a signed integer. The
	value of /P is a bit field, and PDF files have been found in the
	wild where /P is represented as an unsigned integer even though
	the spec states that it is a signed 32-bit value. By using
	static_cast, we allow qpdf to compensate for writers that
	incorrectly represent the correct bit field as an unsigned value.
	Fixes #382.

2019-11-05  Jay Berkenbilt  <ejb@ql.org>

	* Add support for pluggable crypto providers, enabling multiple
	implementations of the cryptographic functions needed by qpdf.
	This feature was added by request of Red Hat, which recognized the
	use of qpdf's native crypto implementations as a potential
	security liability, preferring instead to get all crypto
	functionality from a third-party library that receives a lot of
	scrutiny. However it was also important to me to not impose any
	unnecessary third party dependencies on my users or packagers,
	some of which build qpdf for lots of environments, some of which
	may not easily support gnutls. Starting in qpdf 9.1.0, it is be
	possible to build qpdf with both the native and gnutls crypto
	providers or with either in isolation. In support of this feature,
	new classes QPDFCryptoProvider and QPDFCryptoImpl have been added
	to the public interface. See QPDFCryptoImpl.hh for details about
	adding your own crypto provider and QPDFCryptoProvider.hh for
	details about choosing which one is used. Note that selection of
	crypto providers is invisible to anyone who doesn't explicitly
	care. Neither end users nor developers have to be concerned about
	it.

	* The environment variable QPDF_CRYPTO_PROVIDER can be used to
	override qpdf's default choice of crypto provider. The
	--show-crypto flag to the qpdf CLI can be used to present a list
	of supported crypto providers with the default provider always
	listed first.

	* Add gnutls crypto provider. Thanks to Zdenek Dohnal for
	contributing the code that I ultimately used in the gnutls crypto
	provider and for engaging in an extended discussion about this
	feature. Fixes #218.

2019-10-22  Jay Berkenbilt  <ejb@ql.org>

	* Incorporate changes from Masamichi Hosoda <trueroad@trueroad.jp>
	to properly handle signature in the following ways:
	  - Always represent /Contents in a signature dictionary as a hex
	    string
	  - Do not compress signature dictionaries when generating object
	    streams
	  - Do not encrypt/decrypt the /Contents field of the signature
	    dictionary when creating or reading encrypted files

	* Incorporate changes from Masamichi Hosoda <trueroad@trueroad.jp>
	to add additional methods for making it possible to gain deeper
	insight into cross reference tables and object renumbering. These
	new API calls make it possible for applications to go into PDF
	files created by qpdf and make changes to them that go beyond
	working with the PDF at the object level. The specific use case
	for these changes was to write an external tool to perform digital
	signature, but there could be other uses as well. New methods
	include the following, all of which are described in their
	respective headers:
	  - QPDF::getXRefTable()
	  - QPDFObjectHandle::getParsedOffset()
	  - QPDFWriter::getRenumberedObjGen(QPDFObjGen)
	  - QPDFWriter::getWrittenXRefTable()

2019-10-12  Jay Berkenbilt  <ejb@ql.org>

	* 9.0.2: release

	* Change the name of the temporary file used by --replace-input to
	work with arbitrary absolute or relative paths without requiring
	path splitting logic. Fixes #365.

2019-09-20  Jay Berkenbilt  <ejb@ql.org>

	* 9.0.1: release

2019-09-19  Jay Berkenbilt  <ejb@ql.org>

	* When converting an array to a Rectangle, ensure that llx <= urx
	and lly <= ury. This prevents flatten-annotations from flipping
	fields whose coordinates are messed up in the input. Fixes #363.

	* Warn when duplicated dictionary keys are found during parsing.
	The behavior remains as before: later keys override earlier ones.
	However, this generates a warning now rather than being silently
	ignored. Fixes #345.

2019-09-17  Jay Berkenbilt  <ejb@ql.org>

	* Fix a few integer warnings for big-endian systems.

	* QIntC tests: don't assume char is signed. Fixes #361.

2019-08-31  Jay Berkenbilt  <ejb@ql.org>

	* 9.0.0: release

	* Add QPDF::anyWarnings() method to find out whether there have
	been any warnings without resetting the list.

	* Add QPDF::closeInputSource() method to release the input source
	so the input file can be deleted or renamed.

	* Add methods rename_file and remove_file to QUtil.

2019-08-24  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDF::userPasswordMatched() and QPDF::ownerPasswordMatched()
	methods so it can be determined separately whether the supplied
	password matched the user password, the owner password, or both.
	Fixes #159.

2019-08-23  Jay Berkenbilt  <ejb@ql.org>

	* Add --recompress-streams option to qpdf and
	QPDFWriter::setRecompressFlate to cause QPDFWriter to recompress
	streams that are already compressed with /FlateDecode.

	* Add option Pl_Flate::setCompressionLevel to globally set the
	zlib compression level used by all Pl_Flate pipelines.

	* Add --compression-level flag to qpdf to set the zlib compression
	level. When combined with --recompress-flate, this will cause most
	of qpdf's streams to use the maximum compression level. This
	results in only a very small amount of savings in size that comes
	at a fairly significant performance cost, but it could be useful
	for archival files or other cases where every byte counts and
	creation time doesn't matter so much. Note that using
	--object-streams=generate in combination with these options gives
	you the biggest advantage. Fixes #113.

2019-08-22  Jay Berkenbilt  <ejb@ql.org>

	* In QPDFObjectHandle::ParserCallbacks, in addition to
	handleObject(QPDFObjectHandle), allow developers to override
	handleObject(QPDFObjectHandle, size_t offset, size_t length). If
	this method appears instead, it is called with the offset of the
	object in the content stream (which may be concatenated from an
	array of streams) and the length of the object. Intervening
	whitespace and comments are not included in offset and length.

	* Add method
	QPDFObjectHandle::ParserCallbacks::contentSize(size_t). If
	defined, it is called by the content stream parser before the
	first call to handleObject, and the argument is the total size in
	bytes of the content streams.

	* Add QPDFObjectHandle::isDirectNull() -- a const method that
	allows determining whether an object is a literal null without
	attempting to resolve it.

	* Stop replacing indirect references to null with literal null in
	arrays when writing output with QPDFWriter.

2019-08-19  Jay Berkenbilt  <ejb@ql.org>

	* Accept (and warn for) extraneous whitespace preceding the xref
	table. Fixes #341.

	* Accept (and warn for) extraneous whitespace between the stream
	keyword and newline. Fixes #329.

	* Properly handle name tokens containing # not preceding two
	hexadecimal digits. Such names are invalid in PDF >= 1.2 but valid
	in PDF 1.0 and 1.1. Prior to this fix, qpdf's behavior was to
	treat such tokens as an error for PDF >= 1.2, but for older PDF
	tokens, the name was silently accepted, and when the name token
	was written out, the # was changed to #23, which is the correct
	way to represent a # character. This behavior was problematic for
	several reasons: one is that, ordinarily, content streams are not
	parsed, so this would cause things like image references whose
	names contained # to break. Also, even if the input file was 1.0
	or 1.1, there's no guarantee that the output file wouldn't be
	written at a new version, resulting in invalid name tokens. The
	new behavior is to issue a warning upon encountering such a token
	but to accept it, regardless of the PDF version. Such tokens are
	written out properly as well. Additionally, the warning message
	indicates that the tokens are invalid for PDF >= 1.2. Fixes #332.

	* Non-compatible API change: remove
	QPDFTokenizer::allowPoundAnywhereInName(). There were a lot of
	problems with this. When it was used, any name tokens read would
	always be modified on output, which is never the correct behavior.
	This method used to signal QPDFTokenizer to not treat # specially
	in name tokens, which resulted in the incorrect behavior whose fix
	is described in the preceding item.

2019-08-18  Jay Berkenbilt  <ejb@ql.org>

	* When traversing the pages tree, if an invalid /Type key is
	encountered, fix it. This is not done for all operations, but it
	will be done for any case in which getAllPages is called. This
	includes all page-based CLI operations. (Hopefully) Fixes #349.

2019-08-17  Jay Berkenbilt  <ejb@ql.org>

	* Change internal implementation of QPDF arrays to use sparse
	arrays, which results in using much less memory for arrays with
	large numbers of nulls. Various files have been encountered in the
	wild that contains thousands of arrays with millions of nulls.
	Fixes #305, #311.

2019-07-03  Jay Berkenbilt  <ejb@ql.org>

	* Non-compatible API change: change
	QPDFOutlineDocumentHelper::getTopLevelOutlines and
	QPDFOutlineObjectHelper::getKids to return a std::vector instead
	of a std::list of QPDFOutlineObjectHelper objects. This is to work
	around bugs with some compilers' STL implementations that are
	choking with list here. There's no deep reason for these to be
	lists instead of vectors. Fixes #297.

2019-06-22  Jay Berkenbilt  <ejb@ql.org>

	* Handle encrypted files with missing or invalid /Length entries
	in the encryption dictionary.

	* QPDFWriter: allow calling set*EncryptionParameters before
	calling setFilename. Fixes #336.

	* It now works to run --completion-bash and --completion-zsh when
	qpdf is started from an AppImage.

	* Provided a more useful error message when Windows can't get
	security context. Thanks to user zdenop for supplying some code.
	Fixes #286.

	* Favor PointerHolder over manual memory allocation in shippable
	code where possible. Fixes #235.

	* If pkg-config is available, use it to local libjpeg and zlib. If
	not, fall back to old behavior. Fixes #324.

	* The "make install" target explicitly sets a mode rather than
	relying the user's umask. Fixes #326.

	* When a file has linearization warnings but no errors, qpdf
	--check and --check-linearization now exit with code 3 instead
	of 2. Fixes #50.

	* Add new function QUtil::read_file_into_memory.

2019-06-21  Jay Berkenbilt  <ejb@ql.org>

	* When supported, qpdf builds with -fvisibility=hidden, which
	removes non-exported symbols from the shared library in a manner
	similar to how Windows DLLs work. This is better for performance
	and also better for safety and protection of private interfaces.
	See https://gcc.gnu.org/wiki/Visibility. *NOTE*: If you are
	getting linker errors trying to catch exceptions or derive things
	from a base class in the qpdf library, it's possible that a
	QPDF_DLL_CLASS declaration is missing somewhere. Please report
	this as a bug at https://github.com/qpdf/qpdf/issues.

	* Source-level incompatibility: remove the version
	QPDF::copyForeignObject with an unused boolean parameter. If you
	were, for some reason, calling this, just take the parameter away.

	* Source-level incompatibility: remove the version
	QPDFTokenizer::expectInlineImage with no arguments. It didn't
	produce correct inline images. This is a very low-level routine.
	There is little reason to call it outside of qpdf's lexical
	engine.

	* Source-level incompatibility: rename QUtil::strcasecmp to
	QUtil::str_compare_nocase. This is a non-compatible change, but
	QUtil::strcasecmp is hardly the most important part of qpdf's API.
	The reason for this change is that strcasecmp is a macro on some
	systems, and that was causing problems when QUtil.hh was included
	in certain circumstances. Fixes #242.

2019-06-20  Jay Berkenbilt  <ejb@ql.org>

	* Enable compilation with additional warnings for integer
	conversion and sign (-Wsign-conversion, -Wconversion for gcc and
	similar; -W3 for msvc) if supported. These warnings are on by
	default can be turned off by passing --disable-int-warnings

	* Fix all integer sign and conversion warnings. This makes all
	integer type conversions that have potential data loss explicit
	with calls that do range checks and raise an exception.

	* Change out_bufsize argument to Pl_Flate's constructor for int to
	unsigned int for compatibility with underlying zlib
	implementation.

	* Change QPDFObjectHandle::pipeStreamData's encode_flags argument
	from unsigned long to int since int is the underlying type of the
	enumerated type values that are passed to it. This change should
	be invisible to virtually all code unless you are compiling with
	strict warning flags and explicitly casting to unsigned long.

	* Add methods to QPDFObjectHandle to return the value of Integer
	objects as int and unsigned int with range checking and fallback
	behavior to avoid silent underflow/overflow conditions.

	* Add functions to QUtil to convert unsigned integers to strings,
	avoiding implicit conversion between unsigned and signed integer
	types.

	* Add QIntC.hh, containing integer type converters that do range
	checking.

2019-06-18  Jay Berkenbilt  <ejb@ql.org>

	* Remove previously submitted qpdf_read_memory_fuzzer as it is a
	small subset of qpdf_fuzzer.

2019-06-15  Jay Berkenbilt  <ejb@ql.org>

	* Update CI (Azure Pipelines) to run tests with some sanitizers.

	* Do "ideal integration" with oss-fuzz. This includes adding a
	better fuzzer with a seed corpus and adding automated tests of the
	fuzzer with the test data.

	* When parsing files, while reading an object, if there are too
	many consecutive errors without enough intervening successes, give
	up on the specific object. This reduces cases in which very badly
	damaged files send qpdf into a tail spin reading one character at
	a time and reporting warnings.

2019-06-13  Jay Berkenbilt  <ejb@ql.org>

	* Perform initial integration of Google's oss-fuzz project by
	copying the fuzzer someone from Google already did into the qpdf
	repository and adding build support. This shift in control is in
	preparation for an ideal integration with oss-fuzz.

2019-06-09  Jay Berkenbilt  <ejb@ql.org>

	* When /DecodeParms is an empty list, ignore it on read and delete
	it on write. Fixes #331.

2019-05-18  Jay Berkenbilt  <ejb@ql.org>

	* 8.4.2: release

2019-05-16  Jay Berkenbilt  <ejb@ql.org>

	* Fix memory error in Windows-only code from typo. Fixes #330.

2019-04-27  Jay Berkenbilt  <ejb@ql.org>

	* 8.4.1: release

2019-04-20  Jay Berkenbilt  <ejb@ql.org>

	* When qpdf --version is run, it will detect if the qpdf CLI was
	built with a different version of qpdf than the library. This
	usually indicates that multiple versions of qpdf are installed and
	that the library path is not set up properly. This situation
	sometimes causes confusing behavior for users who are not actually
	running the version of qpdf they think they are running.

	* Add parameter --remove-page-labels to remove page labels from
	output. In qpdf 8.3.0, the behavior changed so that page labels
	were preserved when merging and splitting files. Some users were
	relying on the fact that if you ran qpdf --empty --pages ... all
	page labels were dropped. This option makes it possible to get
	that behavior if it is explicitly desired. Fixes #317.

	* Add parameter --keep-files-open-threshold to override the
	maximum number of files that qpdf will allow to be kept open at
	once. Fixes #288.

	* Handle Unicode characters in filenames properly on Windows. The
	changes to support Unicode on the CLI in Windows broke Unicode
	filenames on that platform. Fixes #298.

	* Slightly tighten logic that determines whether an object is a
	page. The previous logic was sometimes failing to preserve
	annotations because they were passing the overly loose test for
	whether something was a page. This fix has a slight risk of
	causing some extraneous objects to be copied during page splitting
	and merging for erroneous PDF files whose page objects contain
	invalid types or are missing the /Type key entirely, both of which
	would be invalid according to the PDF specification.

	* Revert change that included preservation of outlines (bookmarks)
	in --split-pages. The way it was implemented caused a very
	significant performance penalty when splitting pages with
	outlines. We need a better solution that only copies the relevant
	items, not the whole tree.

2019-03-11  Jay Berkenbilt  <ejb@ql.org>

	* JSON serialization: add missing leading 0 to decimal values
	between -1 and 1. Fixes #308.

2019-02-01  Jay Berkenbilt  <ejb@ql.org>

	* 8.4.0: release

2019-01-31  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: do better pre-checks on images before optimizing;
	refuse to optimize images that can't be converted to JPEG because
	of colorspace or depth.

	* Add new options --externalize-inline-images, which converts
	inline images larger than a specified size to regular images, and
	--ii-min-bytes, which tweaks that size.

	* When optimizing images, inline images are now included in the
	optimization, first being converted to regular images. Use
	--keep-inline-images to exclude them from optimization. Fixes #278.

	* Add method QPDFPageObjectHelper::externalizeInlineImages, which
	converts inline images whose size is at least a specified amount
	to regular images.

	* Remove traces of acroread, which hasn't been available in Linux
	for a long time.

2019-01-30  Jay Berkenbilt  <ejb@ql.org>

	* Do not include space after ID operator in inline image data. The
	token now correctly contains the image data, the EI operator,
	and the delimiter that precedes the EI operator.

	* Improve locating of an inline image's EI operator to correctly
	handle the case of EI appearing inside the image data.

	* Very low-level QPDFTokenizer API now includes an
	expectInlineImage method that takes an input stream, enabling it
	to locate an inline image's EI operator better. When this method
	is called, the inline image token returned will not contain the EI
	operator and will contain correct image data. This is called
	automatically everywhere within the qpdf library. Most user code
	will never have to use the low-level tokenizer API. If you use
	Pl_QPDFTokenizer, this will be done automatically for you. If you
	use the low-level API and call expectInlineImage, you should call
	the new version.

2019-01-29  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when returning an inline image token, the tokenizer no
	longer includes the delimiter that follows EI. The
	QPDFObjectHandle created from the token was correct.

	* Handle files with direct page objects, which is not allowed by
	the PDF spec but has been seen in the wild. Fixes #164.

2019-01-28  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when using --stream-data=compress, object streams and
	xref streams were not compressed. They were compressed if no
	--stream-data option was specified. Fixes #271.

	* When linearizing or getting the list of all pages in a file,
	replace duplicated page objects with a shallow copy of the page
	object. Linearization and all page manipulation APIs require page
	objects to be unique. Pages that were originally duplicated will
	still share contents and any other indirect resources. Fixes #268.

2019-01-26  Jay Berkenbilt  <ejb@ql.org>

	* Add --overlay and --underlay options. Fixes #207.

	* Create examples/pdf-overlay-page.cc to demonstrate use of
	page/form XObject interaction

	* Add new methods QPDFPageObjectHelper::getFormXObjectForPage,
	which creates a form XObject equivalent to a page, and
	QPDFObjectHandle::placeFormXObject, which generates content stream
	code to placing a form XObject on a page.

2019-01-25  Jay Berkenbilt  <ejb@ql.org>

	* Add new method QPDFObjectHandle::getUniqueResourceName() to
	return an unused key available to be used in a resource
	dictionary.

	* Add new method QPDFPageObjectHelper::getAttribute() that
	properly handles inherited attributes and allows for creation of a
	copy of shared attributes. This is very useful if you are getting
	an attribute of a page dictionary with the intent to modify it
	privately for that page.

	* Fix QPDFPageObjectHelper::getPageImages (and the legacy
	QPDFObjectHandle::getPageImages()) to properly handle images in
	inherited resources dictionaries.

2019-01-20  Jay Berkenbilt  <ejb@ql.org>

	* Tweak the content code generated for variable text fields to
	better handle font sizes and multi-line text.

	* When generating appearance streams for variable text
	annotations, properly handle the cases of there being no
	appearance dictionary, no appearance stream, or an appearance
	stream with no BMC..EMC marker.

	* When flattening annotations, remove annotations from the file
	that don't have appearance streams. These were previously being
	preserved, but since they are invisible, there is no reason to
	preserve them when flattening annotations.

2019-01-19  Jay Berkenbilt  <ejb@ql.org>

	* NOTE: qpdf CLI: some non-compatible changes were made to how
	qpdf interprets password arguments that contain Unicode characters
	that fall outside of ASCII. On Windows, the non-compatibility was
	unavoidable, as explained in the release notes. On all platforms,
	it is possible to get the old behavior if desired, though the old
	behavior would almost always result in files that other
	applications were unable to open. As it stands, qpdf should now be
	able to open passwords encrypted with a wide range of passwords
	that some other viewers might not handle, though even now, qpdf's
	Unicode password handling is not 100% complete.

	* Add --password-mode option, which allows fine-grained control of
	how password arguments are treated. This is discussed fully in the
	manual. Fixes #215.

	* Add option --suppress-password-recovery to disable the behavior
	of searching for a correct password by re-encoding the provided
	password. This option can be useful if you want to ensure you know
	exactly what password is being used.

2019-01-17  Jay Berkenbilt  <ejb@ql.org>

	* When attempting to open an encrypted file with a password, if
	the password doesn't work, try alternative passwords created by
	re-interpreting the supplied password with different string
	encodings. This makes qpdf able to recover passwords with
	non-ASCII characters when either the decryption or encryption
	operation was performed with an incorrectly encoded password.

	* Fix data loss bug: qpdf was discarding referenced resources in
	the case in which a page's resource dictionary contained an
	indirect reference for either /Font or /XObject that contained
	fonts or XObjects not referenced on all pages that shared the
	resource. This was a "typo" in the code. The comment explained the
	correct behavior, and the code was clearly intended to handle this
	issue, but the implementation had an error in it. This is fixed by
	a single-line change, which can be found in git commit
	4bc434000c42a7191e705c8a38216ca6743ad9ff. That commit can be used
	as a patch that applies cleanly against qpdf 8.1.0 and forward.
	The bug was introduced in version 8.1.0. For the record, this is
	the first bug in qpdf's history that could result in silent loss
	of data when processing a correct input file. Fixes #276.

2019-01-15  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::possible_repaired_encodings which, given a string,
	generates other strings that represent re-interpretation of the
	bytes in a different coding system. This is used to help recover
	passwords if the password string was improperly encoded on a
	different system due to user error or a software bug.

2019-01-14  Jay Berkenbilt  <ejb@ql.org>

	* Add new CLI flags to 128-bit and 256-bit encryption: --assemble,
	--annotate, --form, and --modify-other to control encryption
	permissions with more granularity than was allowed with the
	--modify flag. Fixes #214.

	* Add new versions of
	QPDFWriter::setR{3,4,5,6}EncryptionParameters that allow
	individual setting of the various permission bits. The old
	interfaces are retained for backward compatibility. In the "C"
	API, add qpdf_set_r{3,4,5,6}_encryption_parameters2. The new
	interfaces use separate booleans for various permissions instead
	of the qpdf_r3_modify_e enumerated type, which set permission bits
	in predefined groups.

	* Add versions of utf8 to single-byte character transcoders that
	return a success code.

2019-01-13  Jay Berkenbilt  <ejb@ql.org>

	* Add several more string transcoding and analysis methods to
	QUtil for bidirectional conversion between PDF Doc, Win Ansi, Mac
	Roman, UTF-6, and UTF-16 along with detection of valid UTF-8 and
	UTF-16.

2019-01-12  Jay Berkenbilt  <ejb@ql.org>

	* In the --pages option, allow the same page to be specified more
	than once. You can now do "--pages A.pdf 1,1 --" or
	"--pages A.pdf 1 A.pdf 1" instead of having to use two different
	paths to specify A.pdf. Fixes #272.

	* Add QPDFPageObjectHelper::shallowCopyPage(). This method creates
	a new page object that is a "shallow copy" of the given page as
	described in the comments in QPDFPageObjectHelper. The resulting
	object has not been added anywhere but is ready to be passed to
	QPDFPageDocumentHelper::addPage of its own QPDF or another QPDF
	object.

	* Add QPDF::getUniqueId() method to return an identifier that is
	intended to be unique within the scope of all QPDF objects created
	by the calling application in a single run.

	* In --pages, allow "." as a replacement for the current input
	file, making it possible to say "qpdf A.pdf --pages . 1-3 --"
	instead of having to repeat the input filename.

2019-01-10  Jay Berkenbilt  <ejb@ql.org>

	* Add new configure option --enable-avoid-windows-handle, which
	causes the symbol AVOID_WINDOWS_HANDLE to be defined. If set, we
	avoid using Windows I/O HANDLE, which is disallowed in some
	versions of the Windows SDK, such as for Windows phones.
	QUtil::same_file will always return false in this case. Only
	applies to Windows builds.

	* Add new method QPDF::setImmediateCopyFrom. When called on a
	source QPDF object, streams can be copied FROM that object to
	other ones without having to keep the source QPDF or its input
	source around. The cost is copying the streams into RAM. See
	comments in QPDF.hh for setImmediateCopyFrom for a detailed
	explanation.

2019-01-07  Jay Berkenbilt  <ejb@ql.org>

	* 8.3.0: release

	* Add sample completion files in completions. These can be used by
	packagers to install on the system wherever bash and zsh keep
	their vendor-supplied completions.

	* Add configure flag --enable-check-autofiles, which is on by
	default. Packagers whose packaging systems automatically refresh
	autoconf or libtool files should pass --disable-check-autofiles to
	./configure to suppress warnings about automatically generated
	files being outdated.

2019-01-06  Jay Berkenbilt  <ejb@ql.org>

	* Remove the restriction in most cases that the source QPDF used
	in a copyForeignObject call has to stick around until the
	destination QPDF is written. The exceptional case is when the
	source stream gets is data using a
	QPDFObjectHandle::StreamDataProvider. For a more in-depth
	discussion, see comments around copyForeignObject in QPDF.hh.
	Fixes #219.

2019-01-05  Jay Berkenbilt  <ejb@ql.org>

	* When generating appearances, if the font uses one of the
	standard, built-in encodings, restrict the character set to that
	rather than just to ASCII. This will allow most appearances to
	contain characters from the ISO-Latin-1 range plus a few
	additional characters.

	* Add methods QUtil::utf8_to_win_ansi and
	QUtil::utf8_to_mac_roman.

	* Add method QUtil::utf8_to_utf16.

2019-01-04  Jay Berkenbilt  <ejb@ql.org>

	* Add new option --optimize-images, which recompresses every image
	using DCT (JPEG) compression as long as the image is not already
	compressed with lossy compression and recompressing the image
	reduces its size. The additional options --oi-min-width,
	--oi-min-height, and --oi-min-area prevent recompression of images
	whose width, height, or pixel area (width * height) are below a
	specified threshold.

	* Add new option --collate. When specified, the semantics of
	--pages change from concatenation to collation. See the manual for
	a more detailed discussion. Fixes #259.

	* Add new method QPDFWriter::getFinalVersion, which returns the
	PDF version that will ultimately be written to the final file. See
	comments in QPDFWriter.hh for some restrictions on its use. Fixes
	#266.

	* When unexpected errors are found while checking linearization
	data, print an error message instead of calling assert, which
	cause the program to crash. Fixes #209, #231.

	* Detect and recover from dangling references. If a PDF file
	contained an indirect reference to a non-existent object (which is
	valid), when adding a new object to the file, it was possible for
	the new object to take the object ID of the dangling reference,
	thereby causing the dangling reference to point to the new object.
	This case is now prevented. Fixes #240.

2019-01-03  Jay Berkenbilt  <ejb@ql.org>

	* Add --generate-appearances flag to the qpdf command-line tool to
	trigger generation of appearance streams.

	* Fix behavior of form field value setting to handle the following
	cases:
	  - Strings are always written as UTF-16
	  - Check boxes and radio buttons are handled properly with
	    synchronization of values and appearance states

	* Define constants in qpdf/Constants.h for interpretation of
	annotation and form field flags

	* Add QPDFAnnotationObjectHelper::getFlags

	* Add many new methods to QPDFFormFieldObjectHelper for querying
	flags and field types

	* Add new methods for appearance stream generation. See comments
	in QPDFFormFieldObjectHelper.hh for generateAppearance() for a
	description of limitations.
	  - QPDFAcroFormDocumentHelper::generateAppearancesIfNeeded
	  - QPDFFormFieldObjectHelper::generateAppearance

	* Bug fix: when writing form field values, always write string
	values encoded as UTF-16.

	* Add method QUtil::utf8_to_ascii, which returns an ASCII string
	for a UTF-8 string, replacing out-of-range characters with a
	specified substitute.

2019-01-02  Jay Berkenbilt  <ejb@ql.org>

	* Add method QPDFObjectHandle::getResourceNames that returns a set
	of strings representing all second-level keys in a dictionary
	(i.e. all keys of all direct dictionary members).

2018-12-31  Jay Berkenbilt  <ejb@ql.org>

	* Add --flatten-annotations flag to the qpdf command-line tool for
	annotation flattening.

	* Add methods for flattening form fields and annotations:
	  - QPDFPageDocumentHelper::flattenAnnotations - integrate
	    annotation appearance streams into page contents with special
	    handling for form fields: if appearance streams are up to date
	    (/NeedAppearances is false in /AcroForm), the /AcroForm key of
	    the document catalog is removed. Otherwise, a warning is
	    issued, and form fields are ignored. Non-form-field
	    annotations are always flattened if an appearance stream can
	    be found.
	  - QPDFAnnotationObjectHelper::getPageContentForAppearance -
	    generate the content stream fragment to render an appearance
	    stream in a page's content stream as a form xobject. Called by
	    flattenAnnotations.

	* Add method QPDFObjectHandle::mergeResources(), which merges
	resource dictionaries. See detailed description in
	QPDFObjectHandle.hh.

	* Add QPDFObjectHandle::Matrix, similar to
	QPDFObjectHandle::Rectangle, as a convenience class for
	six-element arrays that are used as matrices.

2018-12-23  Jay Berkenbilt  <ejb@ql.org>

	* When specifying @arg on the command line, if the file "arg" does
	not exist, just treat this is a normal argument. This makes it
	easier to deal with files whose names start with the @ character.
	Fixes #265.

	* Tweak completion so it works with zsh as well using
	bashcompinit.

2018-12-22  Jay Berkenbilt  <ejb@ql.org>

	* Add new options --json, --json-key, and --json-object to
	generate a json representation of the PDF file. This is described
	in more depth in the manual. You can also run qpdf --json-help to
	get a description of the json format.

2018-12-21  Jay Berkenbilt  <ejb@ql.org>

	* Allow --show-object=trailer for showing the document trailer.

	* You can now use eval $(qpdf --completion-bash) to enable bash
	completion for qpdf. It's not perfect, but it works pretty well.

2018-12-19  Jay Berkenbilt  <ejb@ql.org>

	* When splitting pages using --split-pages, the outlines
	dictionary and some supporting metadata are copied into the split
	files. The result is that all bookmarks from the original file
	appear, and those that point to pages that are preserved work
	while those that point to pages that are not preserved don't do
	anything. This is an interim step toward proper support for
	bookmark preservation in split files.

	* Add QPDFOutlineDocumentHelper and QPDFOutlineObjectHelper for
	handling outlines (bookmarks) including bidirectionally mapping
	between bookmarks and pages. Initially there is no support for
	modifying the outlines hierarchy.

2018-12-18  Jay Berkenbilt  <ejb@ql.org>

	* New method QPDFObjectHandle::getJSON() returns a JSON object
	with a partial representation of the object. See
	QPDFObjectHandle.hh for a detailed description.

	* Add a simple JSON serializer. This is not a complete or
	general-purpose JSON library. It allows assembly and serialization
	of JSON structures with some restrictions, which are described in
	the header file.

	* Add QPDFNameTreeObjectHelper class. This class provides useful
	methods for dealing with name trees, which are discussed in
	section 7.9.6 of the PDF spec (ISO-32000).

	* Preserve page labels when merging and splitting files. Prior
	versions of qpdf simply preserved the page label information from
	the first file, which usually wouldn't make any sense in the
	merged file. Now any page that had a page number in any original
	file will have the same page number after merging or splitting.

	* Add QPDFPageLabelDocumentHelper class. This is a document helper
	class that provides useful methods for dealing with page labels.
	It abstracts the fact that they are stored as number trees and
	deals with interpolating intermediate values that are not in the
	tree. It also has helper functions used by the qpdf command line
	tool to preserve page labels when merging and splitting files.

	* Add QPDFNumberTreeObjectHelper class. This class provides useful
	methods for dealing with number trees, which are discussed in
	section 7.9.7 of the PDF spec (ISO-32000). Page label dictionaries
	are represented as number trees.

	* New method QPDFObjectHandle::wrapInArray returns the object
	itself if it is an array. Otherwise, it returns an array
	containing the object. This is useful for dealing with PDF data
	that is sometimes expressed as a single element and sometimes
	expressed as an array, which is a somewhat common PDF idiom.

2018-10-11  Jay Berkenbilt  <ejb@ql.org>

	* Files generated by autogen.sh are now committed so that it is
	possible to build on platforms without autoconf directly from a
	clean checkout of the repository. The configure script detects if
	the files are out of date when it also determines that the tools
	are present to regenerate them.

	* Add build in Azure Pipelines, now that it is free for open
	source projects.

2018-08-18  Jay Berkenbilt  <ejb@ql.org>

	* 8.2.1: release

	* Add new option --keep-files-open=[yn] to control whether qpdf
	keeps files open when merging. Prior to version 8.1.0, qpdf always
	kept all files open, but this meant that the number of files that
	could be merged was limited by the operating system's open file
	limit. Version 8.1.0 opened files as they were referenced, but
	this caused a major performance impact. Version 8.2.0 optimized
	the performance but did so in a way that, for local file systems,
	there was a small but unavoidable performance hit, but for
	networked file systems, the performance impact could be very high.
	Starting with version 8.2.1, the default behavior is that files
	are kept open if no more than 200 files are specified, but that
	the behavior can be explicitly overridden with the
	--keep-files-open flag. If you are merging more than 200 files but
	less than the operating system's max open files limit, you may
	want to use --keep-files-open=y. If you are using a local file
	system where the overhead is low and you might sometimes merge
	more than the OS limit's number of files, you may want to specify
	--keep-files-open=n. Fixes #237.

2018-08-16  Jay Berkenbilt  <ejb@ql.org>

	* 8.2.0: release

2018-08-14  Jay Berkenbilt  <ejb@ql.org>

	* For the mingw builds, change the name of the DLL import library
	from libqpdf.a to libqpdf.dll.a to avoid confusing it with a
	static library. This potentially clears the way for supporting a
	static library in the future, though presently, the qpdf Windows
	build only builds the DLL and executables. Fixes #225.

2018-08-13  Jay Berkenbilt  <ejb@ql.org>

	* Add new class QPDFSystemError, derived from std::runtime_error,
	which is now thrown by QUtil::throw_system_error. This enables the
	triggering errno value to be retrieved. Fixes #221.

2018-08-12  Jay Berkenbilt  <ejb@ql.org>

	* qpdf command line: add --no-warn option to suppress issuing
	warning messages. If there are any conditions that would have
	caused warnings to be issued, the exit status is still 3.

	* Rewrite the internals of Pl_Buffer to be much more efficient in
	use of memory at a very slight performance cost. The old
	implementation could cause memory usage to go out of control for
	files with large images compressed using the TIFF predictor.
	Fixes #228.

2018-08-05  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: end of line characters were not properly handled inside
	strings in some cases. Fixes #226.

	* Bug fix: infinite loop on progress reporting for very small
	files. Fixes #230.

2018-08-04  Jay Berkenbilt  <ejb@ql.org>

	* Performance fix: optimize page merging operation to avoid
	unnecessary open/close calls on files being merged. Fixes #217.

	* Add ClosedFileInputSource::stayOpen method, enabling a
	ClosedFileInputSource to stay open during manually indicated
	periods of high activity, thus reducing the overhead of frequent
	open/close operations.

2018-06-23  Jay Berkenbilt  <ejb@ql.org>

	* 8.1.0: release

2018-06-22  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: properly decrypt files with 40-bit keys that use
	revision 3 of the security handler. Prior to this, qpdf was
	reporting "invalid password" in this case. Fixes #212.

	* With --verbose, print information about each input file when
	merging files.

	* Add progress reporting to QPDFWriter. Programmatically, you can
	register a progress reporter with registerProgressReporter(). From
	the command line, passing --progress will give progress indicators
	in increments of no less than 1% as output files are written.
	Fixes #200.

	* Add new method QPDF::getObjectCount(). This gives an approximate
	(upper bound) account of objects in the QPDF object.

	* Don't leave files open when merging. This makes it possible
	merge more files at once than the operating system's open file
	limit. Fixes #154.

	* Add ClosedFileInputSource class, and input source that keeps its
	input file closed when not reading it. At the expense of some
	performance, this allows you to operate on many files without
	opening too many files at the operating system level.

	* Add new option --preserve-unreferenced-resources, which
	suppresses removal of unreferenced objects from page resource
	dictionaries during page splitting operations.

2018-06-21  Jay Berkenbilt  <ejb@ql.org>

	* Add method QPDFPageObjectHelper::removeUnreferencedResources and
	also QPDFPageDocumentHelper::removeUnreferencedResources that
	calls the former on every page. This method removes any XObject or
	Font references from the page's resource dictionary if they are
	not referenced anywhere in any of the content streams. This
	significantly reduces the size of split files whose pages
	internally share resource dictionaries. Fixes #203.

	* The --rotate option to qpdf no longer requires an explicit page
	range. You can now rotate all pages of a document with
	qpdf --rotate=angle in.pdf out.pdf. Fixes #211.

	* Create examples/pdf-set-form-values.cc to illustrate use of
	interactive form helpers.

	* Added methods QPDFAcroFormDocumentHelper::setNeedAppearances and
	added methods to QPDFFormFieldObjectHelper to set a field's value,
	optionally updating the document to indicate that appearance
	streams need to be regenerated.

	* Added QPDFObject::newUnicodeString and QPDFObject::unparseBinary
	to allow for more convenient creation of strings that are
	explicitly encoded in UTF-16 BE. This is useful for creating
	Unicode strings that appear outside of content streams, such as in
	page labels, outlines, form field values, etc.

2018-06-20  Jay Berkenbilt  <ejb@ql.org>

	* Added new classes QPDFAcroFormDocumentHelper,
	QPDFFormFieldObjectHelper, and QPDFAnnotationObjectHelper to
	assist with working with interactive forms in PDF files. At
	present, API methods for reading forms, form fields, and widget
	annotations have been added. It is likely that some additional
	methods for modifying forms will be added in the future. Note that
	qpdf remains a library whose function is primarily focused around
	document structure and metadata rather than content. As such, it
	is not expected that qpdf will have higher level APIs for
	generating form contents, but qpdf will hopefully gain the
	capability to deal with the bookkeeping aspects of wiring up all
	the objects, which could make it a useful library for other
	software that works with PDF interactive forms. PDF forms are
	complex, and the terminology around them is confusing. Please see
	comments at the top of QPDFAcroFormDocumentHelper.hh for
	additional discussion.

	* Added new classes QPDFPageDocumentHelper and QPDFPageObjectHelper
	for page-level API functions. These classes introduce a new API
	pattern of document helpers and object helpers in qpdf. The helper
	classes provide a higher level API for working with certain types
	of structural features of PDF while still staying true to qpdf's
	philosophy of not isolating the user from the underlying
	structure. Please see the chapter in the documentation entitled
	"Design and Library Notes" for additional discussion. The examples
	have also been updated to use QPDFPageDocumentHelper and
	QPDFPageObjectHelper when performing page-level operations.

2018-06-19  Jay Berkenbilt  <ejb@ql.org>

	* New QPDFObject::Rectangle class will convert to and from arrays
	of four numerical values. Rectangles are used in various places
	within the PDF file format and are called out as a specific data
	type in the PDF specification.

2018-05-12  Jay Berkenbilt  <ejb@ql.org>

	* In newline before endstream mode, an extra newline was not
	inserted prior to the endstream that ends object streams.
	Fixes #205.

2018-04-15  Jay Berkenbilt  <ejb@ql.org>

	* Arbitrarily limit the depth of data structures represented by
	direct object. This is CVE-2018-9918. Fixes #202.

2018-03-06  Jay Berkenbilt  <ejb@ql.org>

	* 8.0.2: release

	* Properly handle pages with no contents. Fixes #194.

2018-03-05  Jay Berkenbilt  <ejb@ql.org>

	* Improve handling of loops while following cross reference
	tables. Fixes #192.

2018-03-04  Jay Berkenbilt  <ejb@ql.org>

	* 8.0.1: release

	* On the command line when specifying page ranges, support
	preceding a page number by "r" to indicate that it should be
	counted from the end. For example, the range r3-r1 would indicate
	the last three pages of a document.

2018-03-03  Jay Berkenbilt  <ejb@ql.org>

	* Ignore zlib data check errors while uncompressing streams. This
	is consistent with behaviors of other readers and enables handling
	of some incorrectly written zlib streams. Fixes #191.

2018-02-25  Jay Berkenbilt  <ejb@ql.org>

	* 8.0.0: release

2018-02-17  Jay Berkenbilt  <ejb@ql.org>

	* Fix QPDFObjectHandle::getUTF8Val() to properly handle strings
	that are encoded with PDF Doc Encoding. Fixes #179.

	* Add qpdf_check_pdf to the "C" API. This method just attempts to
	read the entire file and produce no output, making possible to
	assess whether the file has any errors that qpdf can detect.

	* Major enhancements to handling of type errors within the qpdf
	library. This fix is intended to eliminate those annoying cases
	where qpdf would exit with a message like "operation for
	dictionary object attempted on object of wrong type" without
	providing any context. Now qpdf keeps enough context to be able to
	issue a proper warning and to handle such conditions in a sensible
	way. This should greatly increase the number of bad files that
	qpdf can recover, and it should make it much easier to figure out
	what's broken when a file contains errors.

	* Error message fix: replace "file position" with "offset" in
	error messages that report lexical or parsing errors. Sometimes
	it's an offset in an object stream or a content stream rather than
	a file position, so this makes the error message less confusing in
	those cases. It still requires some knowledge to find the exact
	position of the error, since when it's not a file offset, it's
	probably an offset into a stream after uncompressing it.

	* Error message fix: correct some cases in which the object that
	contained a lexical error was omitted from the error message.

	* Error message fix: improve file name in the error message when
	there is a parser error inside an object stream.

2018-02-11  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::filterPageContents method to provide a
	different interface for applying token filters to page contents
	without modifying the ultimate output.

2018-02-04  Jay Berkenbilt  <ejb@ql.org>

	* Changes listed on today's date are numerous and reflect
	significant enhancements to qpdf's lexical layer. While many
	nuances are discussed and a handful of small bugs were fixed, it
	should be emphasized that none of these issues have any impact on
	any output or behavior of qpdf under "normal" operation. There are
	some changes that have an effect on content stream normalization
	as with qdf mode or on code that interacts with PDF files
	lexically using QPDFTokenizer. There are no incompatible changes
	for normal operation. There are a few changes that will affect the
	exact error messages issued on certain bad files, and there is a
	small non-compatible enhancement regarding the behavior of
	manually constructed QPDFTokenizer::Token objects. Users of the
	qpdf command line tool will see no changes other than the addition
	of a new command-line flag and possibly some improved error
	messages.

	* Significant lexer (tokenizer) enhancements. These are changes to
	the QPDFTokenizer class. These changes are of concern only to
	people who are operating with PDF files at the lexical layer using
	qpdf. They have little or no impact on most high-level interfaces
	or the command-line tool.

	New token types tt_space and tt_comment to recognize whitespace
	and comments. this makes it possible to tokenize a PDF file or
	stream and preserve everything about it.

	For backward compatibility, space and comment tokens are not
	returned by the tokenizer unless QPDFTokenizer.includeIgnorable()
	is called.

	Better handling of null bytes. These are now included in space
	tokens rather than being their own "tt_word" tokens. This should
	have no impact on any correct PDF file and has no impact on
	output, but it may change offsets in some error messages when
	trying to parse contents of bad files. Under default operation,
	qpdf does not attempt to parse content streams, so this change is
	mostly invisible.

	Bug fix to handling of bad tokens at ends of streams. Now, when
	allowEOF() has been called, these are treated as bad tokens
	(tt_bad or an exception, depending on invocation), and a
	separate tt_eof token is returned. Before the bad token
	contents were returned as the value of a tt_eof token. tt_eof
	tokens are always empty now.

	Fix a bug that would, on rare occasions, report the offset in an
	error message in the wrong space because of spaces or comments
	adjacent to a bad token.

	Clarify in comments exactly where the input source is positioned
	surrounding calls to readToken and getToken.

	* Add a new token type for inline images. This token type is only
	returned by QPDFTokenizer immediately following a call to
	expectInlineImage(). This change includes internal refactoring of
	a handful of places that all separately handled inline images, The
	logic of detecting inline images in content streams is now handled
	in one place in the code. Also we are more flexible about what
	characters may surround the EI operator that marks the end of an
	inline image.

	* New method QPDFObjectHandle::parsePageContents() to improve upon
	QPDFObjectHandle::parseContentStream(). The parseContentStream
	method used to operate on a single content stream, but was fixed
	to properly handle pages with contents split across multiple
	streams in an earlier release. The new method parsePageContents()
	can be called on the page object rather than the value of the
	page dictionary's /Contents key. This removes a few lines of
	boiler-plate code from any code that uses parseContentStream, and
	it also enables creation of more helpful error messages if
	problems are encountered as the error messages can include
	information about which page the streams come from.

	* Update content stream parsing example
	(examples/pdf-parse-content.cc) to use new
	QPDFObjectHandle::parsePageContents() method in favor of the older
	QPDFObjectHandle::parseContentStream() method.

	* Bug fix: change where the trailing newline is added to a stream
	in QDF mode when content normalization is enabled (the default for
	QDF mode). Before, the content normalizer ensured that the output
	ended with a trailing newline, but this had the undesired side
	effect of including the newline in the stream data for purposes of
	length computation. QPDFWriter already appends a newline without
	counting in length for better readability. Ordinarily this makes
	no difference, but in the rare case of a page's contents being
	split in the middle of a token, the old behavior could cause the
	extra newline to be interpreted as part of the token. This bug
	could only be triggered in qdf mode, which is a mode intended for
	manual inspection of PDF files' contents, so it is very unlikely
	to have caused any actual problems for people using qpdf for
	production use. Even if it did, it would be very unusual for a PDF
	file to actually be adversely affected by this issue.

	* Add support for coalescing a page's contents into a single
	stream if they are represented as an array of streams. This can be
	performed from the command line using the --coalesce-contents
	option. Coalescing content streams can simplify things for
	software that wants to operate on a page's content streams without
	having to handle weird edge cases like content streams split in
	the middle of tokens. Note that
	QPDFObjectHandle::parsePageContents and
	QPDFObjectHandle::parseContentStream already handled split content
	streams. This is mainly to set the stage for new methods of
	operating on page contents. The new method
	QPDFObjectHandle::pipeContentStreams will pipe all of a page's
	content streams though a single pipeline. The new method
	QPDFObjectHandle.coalesceContentStreams, when called on a page
	object, will do nothing if the page's contents are a single
	stream, but if they are an array of streams, it will replace the
	page's contents with a single stream whose contents are the
	concatenation of the original streams.

	* A few library routines throw exceptions if called on non-page
	objects. These constraints have been relaxed somewhat to make qpdf
	more tolerant of files whose page dictionaries are not properly
	marked as such. Mostly exceptions about page operations being
	called on non page objects will only be thrown in cases where the
	operation had no chance of succeeding anyway. This change has no
	impact on any default mode operations, but it could allow
	applications that use page-level APIs in QPDFObjectHandle to be
	more tolerant of certain types of damaged files.

	* Add QPDFObjectHandle::TokenFilter class and methods to use it to
	perform lexical filtering on content streams. You can call
	QPDFObjectHandle::addTokenFilter on stream object, or you can call
	the higher level QPDFObjectHandle::addContentTokenFilter on a page
	object to cause the stream's contents to passed through a token
	filter while being retrieved by QPDFWriter or any other consumer.
	For details on using TokenFilter, please see comments in
	QPDFObjectHandle.hh.

	* Enhance the string, type QPDFTokenizer::Token constructor to
	initialize a raw value in addition to a value. Tokens have a
	value, which is a canonical representation, and a raw value. For
	all tokens except strings and names, the raw value and the value
	are the same. For strings, the value excludes the outer delimiters
	and has non-printing characters normalized. For names, the value
	resolves non-printing characters. In order to better facilitate
	token filters that mostly preserve contents and to enable
	developers to be mostly unconcerned about the nuances of token
	values and raw values, creating string and name tokens now
	properly handles this subtlety of values and raw values. When
	constructing string tokens, take care to avoid passing in the
	outer delimiters. This has always been the case, but it is now
	clarified in comments in QPDFObjectHandle.hh::TokenFilter. This
	has no impact on any existing code unless there's some code
	somewhere that was relying on Token::getRawValue() returning an
	empty string for a manually constructed token. The token class's
	operator== method still only looks at type and value, not raw
	value. For example, string tokens for <41> and (A) would still be
	equal because both are representations of the string "A".

	* Add QPDFObjectHandle::isDataModified method. This method just
	returns true if addTokenFilter has been called on the stream. It
	enables a caller to determine whether it is safe to optimize away
	piping of stream data in cases where the input and output are
	expected to be the same. QPDFWriter uses this internally to skip
	the optimization of not re-compressing already compressed streams
	if addTokenFilter has been called. Most developers will not have
	to worry about this as it is used internally in the library in the
	places that need it. If you are manually retrieving stream data
	with QPDFObjectHandle::getStreamData or
	QPDFObjectHandle::pipeStreamData, you don't need to worry about
	this at all.

	* Provide heavily annotated examples/pdf-filter-tokens.cc example
	that illustrates use of some simple token filters.

	* When normalizing content streams, as in qdf mode, issue warning
	about bad tokens. Content streams are only normalized when this is
	explicitly requested, so this has no impact on normal operation.
	However, in qdf mode, if qpdf detects a bad token, it means that
	either there's a bug in qpdf's lexer, that the file is damaged, or
	that the page's contents are split in a weird way. In any of those
	cases, qpdf could potentially damage the stream's contents by
	replacing carriage returns with newlines or otherwise messing with
	spaces. The mostly likely case of this would be an inline image's
	compressed data being divided across two streams and having the
	compressed data in the second stream contain a carriage return as
	part of its binary data. If you are using qdf mode just to look at
	PDF files in text editors, this usually doesn't matter. In cases
	of contents split across multiple streams, coalescing streams
	would eliminate the problem, so the warning mentions this. Prior
	to this enhancement, the chances of qdf mode writing incorrect
	data were already very low. This change should make it nearly
	impossible for qdf mode to unknowingly write invalid data.

2018-02-04  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFWriter::setLinearizationPass1Filename method and
	--linearize-pass1 command line option to allow specification of a
	file into which QPDFWriter will write its intermediate
	linearization pass 1 file. This is useful only for debugging qpdf.
	qpdf creates linearized files by computing the output in two
	passes. Ordinarily the first pass is discarded and not written
	anywhere. This option allows it to be inspected.

2018-02-04  Jay Berkenbilt  <ejb@ql.org>

	* 7.1.1: release

	* Bug fix: properly linearize files whose /ID has a length of
	other than 16 bytes.

	* Rename some test files to avoid files with three dots in their
	names. Fixes #173.

	* Fix various build and compilation issues on some platforms and
	compilers. Fixes #176, #172, #177

	* Fix a few typos and clarify a few comments in header files.

2018-01-14  Jay Berkenbilt  <ejb@ql.org>

	* 7.1.0: release

	* Allow raw encryption key to be specified in library and command
	line with the QPDF::setPasswordIsHexKey method and
	--password-is-hex-key option. Allow encryption key to be displayed
	with --show-encryption-key option. Thanks to Didier Stevens
	<didier.stevens@gmail.com> for the idea and contribution of one
	implementation of this idea. See his blog post at
	https://blog.didierstevens.com/2017/12/28/cracking-encrypted-pdfs-part-3/
	for a discussion of using this for cracking encrypted PDFs. I hope
	that a future release of qpdf will include some additional
	recovery options that may also make use of this capability.

2018-01-13  Jay Berkenbilt  <ejb@ql.org>

	* Fix lexical error: the PDF specification allows floating point
	numbers to end with ".". Fixes #165.

	* Fix link order in the build to avoid conflicts when building
	from source while an older version of qpdf is installed. Fixes #158.

	* Add support for TIFF predictor for LZW and Flate streams. Now
	all predictor functions are supported. Fixes #171.

2017-12-25  Jay Berkenbilt  <ejb@ql.org>

	* Clarify documentation around options that control parsing but
	not output creation. Two options: --suppress-recovery and
	--ignore-xref-streams, were documented in the "Advanced
	Transformation Options" section of the manual and --help output
	even though they are not related to output. These are now
	described in a separate section called "Advanced Parsing Options."

	* Implement remaining PNG filters for decode. Prior versions could
	decode only the "up" filter. Now all PNG filters (sub, up,
	average, Paeth, optimal) are supported for decoding. Thanks to
	Tobias Hoffmann for providing a test PDF file that has images with
	all PNG filters along with different numbers of bits per sample
	and samples per pixel, and thanks to Casey Rojas for providing
	implementations of the remaining PNG filters.

	The implementation of the remaining PNG filters changed the
	interface to the private Pl_PNGFilter class, but this class's
	header file is not in the installation, and there is no public
	interface to the class. Within the library, the class is never
	allocated on the stack; it is only ever dynamically allocated. As
	such, this does not actually break binary compatibility of the
	library.

2017-09-15  Jay Berkenbilt  <ejb@ql.org>

	* 7.0.0: release

2017-09-12  Jay Berkenbilt  <ejb@ql.org>

	* Relicense qpdf under version 2.0 of the Apache License rather
	than version 2.0 of the Artistic License. Both are fine, but the
	Apache License is in more widespread use, and I like it a little
	better than Artistic-2.0. It is my intention that there be no
	change in what you can or can't do with qpdf. Versions of qpdf
	prior to version 7 were released under the terms of version 2.0 of
	the Artistic License. At your option, you may continue to consider
	qpdf to be licensed under those terms. Please see the manual for
	additional information.

	* Improve the error message that is issued when QPDFWriter
	encounters a stream that can't be decoded. In particular, mention
	that the stream will be copied without filtering to avoid data
	loss.

	* Add new methods to the C API to correspond to new additions to
	QPDFWriter:
	- qpdf_set_compress_streams
	- qpdf_set_decode_level
	- qpdf_set_preserve_unreferenced_objects
	- qpdf_set_newline_before_endstream

2017-08-25  Jay Berkenbilt  <ejb@ql.org>

	* Re-implement parser iteratively to avoid stack overflow on very
	deeply nested arrays and dictionaries. Fixes #146.

	* Detect infinite loop while finding additional xref tables. Fixes
	#149.

2017-08-22  Jay Berkenbilt  <ejb@ql.org>

	* 7.0.b1: release

	* Convert all README files to markdown. Names changed as follows:
	  - README --> README.md
	  - README.hardening --> README-hardening.md
	  - README.maintainer --> README-maintainer.md
	  - README-what-to-download.txt --> README-what-to-download.md
	  - README-windows.txt --> README-windows.md
	  The file README-windows-install.txt remains a text file.

2017-08-21  Jay Berkenbilt  <ejb@ql.org>

	* Add support for writing PCLm files. Most of the work was done by
	Sahil Arora <sahilarora.535@gmail.com> as part of a Google Summer
	of Code project in 2017. PCLm support is useful only for clients
	that specifically know how to create PCLm files. Support in qpdf
	is just for ensuring that objects are written in the correct order
	and for including some additional material in the output that is
	required by the PCLm standard.

2017-08-19  Jay Berkenbilt  <ejb@ql.org>

	* Remove --precheck-streams. This is enabled by default now
	without any efficiency cost. This feature was never released.

	* Update pdf-create example to illustrate use of additional image
	compression filters.

	* Add support for /RunLengthDecode and /DCTDecode:
	  - New pipeline types Pl_RunLength and Pl_DCT
	  - New command-line flags --compress-streams and --decode-level
	    to replace/enhance --stream-data
	  - New QPDFWriter::setCompressStreams and
	    QPDFWriter::setDecodeLevel methods
	  Please see documentation, header files, and help messages for
	  details on these new features.

2017-08-12  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::rotatePage to apply rotation to a page
	object. Add --rotate option to qpdf to specify page rotation from
	the command line.

	* Provide --verbose option that causes qpdf to print an indication
	of what files it is writing.

	* Change --single-pages to --split-pages and make it take an
	optional argument specifying the number of pages per file.

2017-08-11  Jay Berkenbilt  <ejb@ql.org>

	* Fix --newline-before-endstream to always add a newline before
	endstream even if the last character was already a newline. This
	is actually what's required by PDF/A. Fixes #133.

	* Handle encrypted files whose encryption parameters are too
	short. Fixes #96.

2017-08-10  Jay Berkenbilt  <ejb@ql.org>

	* Remove dependency on libpcre.

	* Be more forgiving of certain types of errors in the xref table
	that don't interfere with interpreting the table.

	* Remove unused "tracing" parameter from PointerHolder's
	(T*, bool) constructor. This change breaks source code
	compatibility, but since this argument to PointerHolder has not
	used for a long time and the presence of a boolean parameter in
	the primary constructor makes it too easy to use that by mistake
	when trying to use PointerHolder for arrays, it seems like it's
	finally time to take it out. If you have a compile error because
	of this change, please check to see whether you intended to use
	the (bool, T*) version of the constructor instead. If not, just
	remove the second parameter.

2017-08-09  Jay Berkenbilt  <ejb@ql.org>

	* When recovering stream length, find endobj without endstream as
	well as just looking for endstream. Be a little more lax about
	where we allow it to be found.

2017-08-05  Jay Berkenbilt  <ejb@ql.org>

	* Add --single-pages option to cause output to be written to a
	separate file for each page rather than one big file.

	* Process --pages options earlier so that certain inspection
	options, like --show-pages, can show the state after the merging
	operations.

2017-08-02  Jay Berkenbilt  <ejb@ql.org>

	* Fix off-by-one error in parsing pages options. Fixes #129.

2017-07-29  Jay Berkenbilt  <ejb@ql.org>

	* Support @filename and @- in the qpdf command-line tool to read
	command-line arguments, one per line, from the named file. @-
	reads from standard input. Fixes #16.

	* Detect when input file and output file are the same and exit to
	avoid overwriting and losing input file. Fixes #29.

	* When passing multiple inspection arguments, run --check first,
	and defer exit until after all the checks have been run. This
	makes it possible to force operations such as --show-xref to be
	delayed until after recovery attempts have been made. For example,
	if you have a file with a syntactically valid xref table that has
	some offsets that are incorrect, running qpdf --check --show-xref
	on that file will first recover the xref and the dump the
	recovered xref, while just running qpdf --show-xref will show the
	xref table as present in the file. Fixes #42.

	* When recovering stream length, indicate the recovered length.
	Fixes #44.

	* Add --newline-before-endstream command-line option and
	setNewlineBeforeEndstream method to QPDFWriter. This forces qpdf
	to always add a newline before the endstream keyword. It is a
	necessary but not sufficient condition for PDF/A compliance. Fixes
	#103.

	* Handle zlib data errors when decoding streams. Fixes #106.

	* Improve handling of files where the "stream" keyword is not
	followed by proper line terminators. Fixes #104.

	* Fix content stream parsing to handle cases of structures within
	the stream split across stream boundaries. Fixes #73.

2017-07-28  Jay Berkenbilt  <ejb@ql.org>

	* Add --preserve-unreferenced command-line option and
	setPreserveUnreferencedObjects method to QPDFWriter. This option
	causes QPDFWriter to write all objects from the input file to the
	output file regardless of whether the objects are referenced.
	Objects are written to the output file in numerical order from the
	input file. This option has no effect for linearized files.

2017-07-27  Jay Berkenbilt  <ejb@ql.org>

	* Add --precheck-streams command-line option and setStreamPrecheck
	method to QPDFWriter to tell QPDFWriter to attempt decoding a
	stream fully before deciding whether to filter it or not.

	* Recover gracefully from streams that aren't filterable because
	the filter parameters are invalid in the stream dictionary or the
	dictionary itself is invalid.

	* Significantly improve recoverability from invalid qpdf objects.
	Most conditions in basic object parsing that used to cause qpdf to
	exit are now warnings. There are still many more opportunities for
	improvements of this sort beyond just object parsing.

2017-07-26  Jay Berkenbilt  <ejb@ql.org>

	* Fixes to infinite loops below also fix problems reported in
	other issues and cover CVE-2017-11624, CVE-2017-11625,
	CVE-2017-11626, and CVE-2017-11627.

	* Don't attempt to interpret syntactic keywords (like R and
	endobj) found while parsing content streams.

	* Detect infinite loops while resolving objects. This could happen
	if something inside an object that had to be resolved during
	parsing, such as a stream length, recursively referenced the
	object being resolved.

	* CVE-2017-9208: Handle references to and appearance of object 0
	as a special case. Object 0 is not allowed, and qpdf was using it
	internally to represent direct objects.

	* CVE-2017-9209: Fix infinite loop caused by attempting to
	reconstruct the xref table while already in the process of
	reconstructing the xref table.

	* CVE-2017-9210: Fix infinite loop caused by attempting to unparse
	an object for inclusion in the text of an exception.

2015-11-10  Jay Berkenbilt  <ejb@ql.org>

	* 6.0.0: release

	* No changes from 5.2.0. The 5.2.0 release broke binary
	compatibility and was withdrawn.

2015-10-31  Jay Berkenbilt  <ejb@ql.org>

	* 5.2.0: release

	* libqpdf/QPDF.cc (read_xrefTable): Be tolerant of some malformed
	xref tables that don't have the required trailing space after each
	line.

2015-10-29  Jay Berkenbilt  <ejb@ql.org>

	* Implement QPDFWriter::setDeterministicID and --deterministic-id
	command-line flag to qpdf to request generation of a deterministic
	/ID for non-encrypted files.

2015-05-24  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.3: release

	* Bug fix: fix-qdf was not handling object streams with more than
	255 objects in them.

	* Handle Microsoft crypt provider initialization properly for case
	where no keys have been previously created, such as in a fresh
	Windows installation.

	* Include time.h in QUtil.hh for time_t

2015-02-21  Jay Berkenbilt  <ejb@ql.org>

	* Detect loops in Pages structure. Thanks to Gynvael Coldwind and
	Mateusz Jurczyk of the Google Security Team for providing a sample
	file with this problem.

	* Prevent buffer overrun when converting a password to an
	encryption key. Thanks to Gynvael Coldwind and Mateusz Jurczyk of
	the Google Security Team for providing a sample file with this
	problem.

	* Ensure that arguments to "R" when parsing the file are direct
	objects before trying to resolve them. This prevents specially
	crafted files from causing qpdf to crash with a stack overflow.
	Thanks to Gynvael Coldwind and Mateusz Jurczyk of the Google
	Security Team for providing a sample file with this problem.

2014-12-01  Jay Berkenbilt  <ejb@ql.org>

	* Some broken PDF files lack the required /Type key for /Page and
	/Pages nodes in the page dictionary. QPDF now uses other methods
	to figure out what kind of node it is looking at so that it can
	handle those files. Original reported at
	https://bugs.launchpad.net/ubuntu/+source/qpdf/+bug/1397413

2014-11-14  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: QPDFObjectHandle::getPageContents() no longer throws an
	exception when called on a page that has no /Contents key in its
	dictionary. This is allowed by the spec, and some software
	packages generate files like this for pages that are blank in the
	original.

2014-06-07  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.2: release

	* MS Visual C++ build: explicitly target Windows 5.0.1 (XP)

	* New example program: pdf-split-pages: efficiently split PDF
	files into individual pages.

	* Bug fix: don't fail on files that contain streams where /Filter
	or /DecodeParms references a stream. Before, qpdf would try to
	convert these to direct objects, which would fail because of the
	stream.

2014-02-22  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: if the last object in the first part of a linearized
	file had an offset that was below 65536 by less than the size of
	the hint stream, the xref stream was invalid and the resulting file
	is not usable.	This is now fixed.

2014-01-14  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.1: release

2013-12-26  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when copying foreign objects (which occurs during page
	splitting among other cases), avoid traversing the same object
	more than once if it appears more than once in the same direct
	object.	 This bug is performance-only and does not affect the
	actual output.

2013-12-17  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.0: release

2013-12-16  Jay Berkenbilt  <ejb@ql.org>

	* Document and make explicit that passing null to
	QUtil::setRandomDataProvider() resets the random data provider.

	* Provide QUtil::getRandomDataProvider().

2013-12-14  Jay Berkenbilt  <ejb@ql.org>

	* Allow any space rather than just newline to follow xref header.
	This allows qpdf to read a wider range of damaged files.

2013-11-30  Jay Berkenbilt  <ejb@ql.org>

	* Allow user-supplied random data provider to be used in place of
	OS-provided or insecure random number generation.  See
	documentation for 5.1.0 for details.

	* Add configure option --enable-os-secure-random (enabled by
	default).  Pass --disable-os-secure-random or define
	SKIP_OS_SECURE_RANDOM to avoid attempts to use the operating
	system-provided secure random number generation.  This can be
	especially useful on Windows if you wish to avoid any dependency
	on Microsoft's cryptography system.

2013-11-29  Jay Berkenbilt  <ejb@ql.org>

	* If NO_GET_ENVIRONMENT is #defined, for Windows only,
	QUtil::get_env will always return false.  This was added to
	support a user who needs to avoid calling GetEnvironmentVariable
	from the Windows API.  QUtil::get_env is not used for any
	functionality in qpdf and exists only to support the test suite
	including test coverage support with QTC (part of qtest).

	* Add /FS to msvc builds to allow parallel builds to work with
	Visual C++ 2013.

	* Add missing #include <algorithm> in some files that use std::min
	and std::max.

2013-11-21  Jay Berkenbilt  <ejb@ql.org>

	* Change image comparison tests, which are disabled by default, to
	use tiff files with 8 bits per sample rather than 4.  This works
	around a bug in tiffcmp but also increases time and disk space for
	image comparison tests.

2013-10-28  Jay Berkenbilt  <ejb@ql.org>

	* Fix MacOS compilation errors by adding a missing #include
	<string> in a header file.

2013-10-18  Jay Berkenbilt  <ejb@ql.org>

	* 5.0.1: release

	* Warn when -accessibility=n is specified with a modern encryption
	format (R > 3).	 Also, accept this flag (and ignore with warning)
	with 256-bit encryption.  qpdf has always ignored the
	accessibility setting with R > 3, but it previously did so
	silently.

2013-10-05  Jay Berkenbilt  <ejb@ql.org>

	* Replace operator[] in std::string and std::vector with "at" in
	order to get bounds checking.  This reduces the chances that
	incorrect code will result in data exposure or buffer overruns.
	See README.hardening for additional notes.

	* Use cryptographically secure random number generation when
	available.  See additional notes in README.

	* Replace some assert() calls with std::logic_error exceptions.
	Ideally there shouldn't be assert() calls outside of testing.
	This change may make a few more potential code errors in handling
	invalid data recoverable.

	* Security fix: In places where std::vector<T>(size_t) was used,
	either validate that the size parameter is sane or refactor code
	to avoid the need to pre-allocate the vector.  This reduces the
	likelihood of allocating a lot of memory in response to invalid
	data in linearization hint streams.

	* Security fix: sanitize /W array in cross reference stream to
	avoid a potential integer overflow in a multiplication.	 It is
	unlikely that any exploits were possible from this bug as
	additional checks were also performed.

	* Security fix: avoid buffer overrun that could be caused by bogus
	data in linearization hint streams.  The incorrect code could only
	be triggered when checking linearization data, which must be
	invoked explicitly.  qpdf does not check linearization data when
	reading or writing linearized files, but the qpdf --check command
	does check linearization data.

	* Security fix: properly handle empty strings in
	QPDF_Name::normalizeName.  The empty string is not a valid name
	and would never be parsed as a name, so there were no known
	conditions where this method could be called with an empty string.

	* Security fix: perform additional argument sanity checks when
	reading bit streams.

	* Security fix: in QUtil::toUTF8, change bounds checking to avoid
	having a pointer point temporarily outside the bounds of an
	array.	Some compiler optimizations could have made the original
	code unsafe.

2013-07-10  Jay Berkenbilt  <ejb@ql.org>

	* 5.0.0: release

	* 4.2.0 turned out to be binary incompatible on some platforms
	even though there were no changes to the public API.  Therefore
	the 4.2.0 release has been withdrawn, and is being replaced with a
	5.0.0 release that acknowledges the ABI change and also removes
	some problematic methods from the public API.

	* Remove methods from public API that were only intended to be
	used by QPDFWriter and really didn't make sense to call from
	anywhere else as they required internal knowledge that only
	QPDFWriter had:
	   - QPDF::getLinearizedParts
	   - QPDF::generateHintStream
	   - QPDF::getObjectStreamData
	   - QPDF::getCompressibleObjGens
	   - QPDF::getCompressibleObjects

2013-07-07  Jay Berkenbilt  <ejb@ql.org>

	* 4.2.0: release [withdrawn]

	* Ignore error case of a stream's decode parameters having invalid
	length when there are no stream filters.

	* qpdf: add --show-npages command-line option, which causes the
	number of pages in the input file to be printed on a line by
	itself.

	* qpdf: allow omission of range in --pages.  If range is omitted
	such that an argument that is supposed to be a range is an invalid
	range and a valid file name, the range of 1-z is assumed.  This
	makes it possible to merge a bunch of files with something like
	qpdf --empty out.pdf --pages *.pdf --

2013-06-15  Jay Berkenbilt  <ejb@ql.org>

	* Handle some additional broken files with missing /ID in trailer
	for encrypted files and with space rather than newline after xref.

2013-06-14  Jay Berkenbilt  <ejb@ql.org>

	* Detect and correct /Outlines dictionary being a direct object
	when linearizing files.	 This is not allowed by the spec but has
	been seen in the wild.	Prior to this change, such a file would
	cause an internal error in the linearization code, which assumed
	/Outlines was indirect.

	* Add /Length key to crypt filter dictionary for encrypted files.
	This key is optional, but some version of MacOS reportedly fail to
	open encrypted PDF files without this key.

	* Bug fix: properly handle object stream generation when the
	original file has some compressible objects with generation != 0.

	* Add QPDF::getCompressibleObjGens() and deprecate
	QPDF::getCompressibleObjects(), which had a flaw in its logic.

	* Add new QPDFObjectHandle::getObjGen() method and indicate in
	comments that its use is favored over getObjectID() and
	getGeneration() for most cases.

	* Add new QPDFObjGen object to represent an object ID/generation
	pair.

2013-04-14  Jay Berkenbilt  <ejb@ql.org>

	* 4.1.0: release

2013-03-25  Jay Berkenbilt  <ejb@ql.org>

	* manual/qpdf-manual.xml: Document the casting policy that is
	followed in qpdf's implementation.

2013-03-11  Jay Berkenbilt  <ejb@ql.org>

	* When creating Windows binary distributions, make sure to only
	copy DLLs of the correct type.	The ensures that the 32-bit
	distributions contain 32-bit DLLs and the 64-bit distributions
	contain 64-bit DLLs.

2013-03-07  Jay Berkenbilt  <ejb@ql.org>

	* Use ./install-sh (already present) instead of "install -c" to
	install executables to fix portability problems against different
	UNIX variants.

2013-03-03  Jay Berkenbilt  <ejb@ql.org>

	* Add protected terminateParsing method to
	QPDFObjectHandle::ParserCallbacks that implementor can call to
	terminate parsing of a content stream.

2013-02-28  Jay Berkenbilt  <ejb@ql.org>

	* Favor fopen_s and strerror_s on MSVC to avoid CRT security
	warnings.  This is useful for people who may want to use qpdf in
	an application that is Windows 8 certified.

	* New method QUtil::safe_fopen to wrap calls to fopen.	This is
	less cumbersome than calling QUtil::fopen_wrapper.

	* Remove all calls to sprintf

	* New method QUtil::int_to_string_base to convert to octal or
	hexadecimal (or decimal) strings without using sprintf

2013-02-26  Jay Berkenbilt  <ejb@ql.org>

	* Rewrite QUtil::int_to_string and QUtil::double_to_string to
	remove internal length limits but to remain backward compatible
	with the old versions for valid inputs.

2013-02-23  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: properly handle overridden compressed objects.  When
	caching objects from an object stream, only cache objects that,
	based on the xref table, would actually be resolved into this
	stream.	 Prior to this fix, if an object stream A contained an
	object B that was overridden by an appended section of the file,
	qpdf would cache the old value of B if any non-overridden member
	of A was accessed before B.  This commit fixes that bug.

2013-01-31  Jay Berkenbilt  <ejb@ql.org>

	* Do not remove libtool's .la file during the make install step.
	Note to packagers: if your distribution wants to you remove the
	.la file, you will have to do that yourself now.

2013-01-25  Jay Berkenbilt  <ejb@ql.org>

	* New method QUtil::hex_encode to encode binary data as a
	hexadecimal string

	* qpdf --check was exiting with status 0 in some rare cases even
	when errors were found.	 It now always exits with one of the
	document error codes (0 for success, 2 for errors, 3 or warnings).

2013-01-24  Jay Berkenbilt  <ejb@ql.org>

	* Make --enable-werror work for MSVC, and generally handle warning
	options better for that compiler.  Warning flags for that compiler
	were previous hard-coded into the build with /WX enabled
	unconditionally.

	* Split warning flags into WFLAGS in autoconf.mk to make them
	easier to override.  Before they were repeated in CFLAGS and
	CXXFLAGS and were commingled with other compiler flags.

	* qpdf --check now does syntactic checks all pages' content
	streams as well as checking overall document structure.	 Semantic
	errors are still not checked, and there are no plans to add
	semantic checks.

2013-01-22  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::getTypeCode().	This method returns a
	unique integer (enumerated type) value corresponding to the object
	type of the QPDFObjectHandle.  It can be used as an alternative to
	the QPDFObjectHandle::is* methods for type testing, particularly
	where there is a desire to use a switch statement or optimize for
	performance when testing object types.

	* Add QPDFObjectHandle::getTypeName().	This method returns a
	string literal describing the object type.  It is useful for
	testing and debugging.

2013-01-20  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::parseContentStream, which parses the
	objects in a content stream and calls handlers in a callback
	class.	The example pdf-parse-content illustrates it use.

	* Add QPDF_Operator and QPDF_InlineImage types along with
	appropriate wrapper methods in QPDFObjectHandle.  These new object
	types are to facilitate content stream parsing.

2013-01-17  Jay Berkenbilt  <ejb@ql.org>

	* 4.0.1: release

	* Add clarifying comment in QPDF.hh for methods that return the
	user password to state that it is no longer possible with newer
	encryption formats to recover the user password knowing the owner
	password.

	* Fix detection of binary attachments in the test suite.  This
	resolves false test failures on some platforms.	 No changes to the
	actual QPDF code were made.

2012-12-31  Jay Berkenbilt  <ejb@ql.org>

	* 4.0.0: release

	* Add new methods qpdf_get_pdf_extension_level,
	qpdf_set_r5_encryption_parameters,
	qpdf_set_r6_encryption_parameters,
	qpdf_set_minimum_pdf_version_and_extension, and
	qpdf_force_pdf_version_and_extension to support new functionality
	from the C API.

2012-12-30  Jay Berkenbilt  <ejb@ql.org>

	* Fix long-standing bug that could theoretically have resulted in
	possible misinterpretation of decode parameters in streams.  As
	far as I can tell, it is extremely unlikely that files with the
	characteristics that would have triggered the bug actually exist
	in cases that qpdf versions prior to 4.0.0 could have read.
	Unencrypted files with encrypted attachments would have triggered
	this bug, but qpdf versions prior to 4.0.0 already refused to open
	such files.

	* Fix long-standing bug in which a stream that used a crypt
	filter and was otherwise not filterable by qpdf would be decrypted
	properly but would retain the crypt filter indication in the
	file.  There are no known ways to create files like this, so it is
	unlikely that anyone ever hit this bug.

2012-12-29  Jay Berkenbilt  <ejb@ql.org>

	* Add read/write support for both the deprecated Acrobat IX
	encryption format and the Acrobat X/PDF 2.0 encryption format
	using 256-bit AES keys.	 Using the Acrobat IX format (R=5) forces
	the version of the file to 1.7 with extension level 3.	Using the
	PDF 2.0 format (R=6) forces it to 1.7 extension level 8.

	* Add new method QPDF::getEncryptionKey to return the actual
	encryption key used for encryption of data in the file.	 The key
	is returned as a std::string.

	* Non-compatible API change: change signature of
	QPDF::compute_data_key to take the R and V values from the
	encryption dictionary.	There is no reason for any application
	code to call this method since handling of encryption is done
	automatically by the qpdf library.  It is used internally by
	QPDFWriter.

	* Support reading and decryption of files whose main text is not
	encrypted but whose attachments are.  More generally, support the
	case of files and streams encrypted differently with some
	limitations, described in the documentation.  This was not
	previously supported due to lack of test files, but I created test
	files using a trial version of Acrobat XI to fully implement this
	case.

	* Incorporate sha2 code from sphlib 3.0.  See README for
	licensing.  Create private pipeline class for computing hashes
	with sha256, sha384, and sha512.

	* Allow specification of initialization vector when using AES
	filtering.  This is required to compute the hash used in /R=6 (PDF
	2.0) encryption.

2012-12-28  Jay Berkenbilt  <ejb@ql.org>

	* Add random number generation functions to QUtil.

	* Fix old bug that could cause an infinite loop if user password
	recovery methods were called and a password contained the "("
	character (which happens to be the first byte of padding used by
	older PDF encryption formats).	This bug was noticed while reading
	code and would not happen under ordinary usage patterns even if
	the password contained that character.

2012-12-27  Jay Berkenbilt  <ejb@ql.org>

	* Add awareness of extension level to PDF Version methods for both
	reading and writing.  This includes adding method
	QPDF::getExtensionLevel and new versions of
	QPDFWriter::setMinimumPDFVersion and QPDFWriter::forcePDFVersion
	that support extension levels.	The qpdf command-line tool
	interprets version numbers of the form x.y.z as version x.y at
	extension level z.

	* Update AES classes to support use of 256-bit keys.

	* Non-compatible API change: Removed public method
	QPDF::flattenScalarReferences.	Instead, just flatten the scalar
	references we actually need to flatten.	 Flattening scalar
	references was a wrong decision years ago and has occasionally
	caused other problems, among which were that it caused qpdf to
	visit otherwise unreferenced and possibly erroneous objects in the
	file when it didn't have to.  There's no reason that any
	non-internal code would have had to call this.

	* Non-compatible API change: Removed public method
	QPDF::decodeStreams which was previously used by qpdf --check but
	is no longer used.  The decodeStreams method could generate false
	positives since it would attempt to access all objects in the file
	including those that were not referenced.  There's no reason that
	any non-internal code would have had to call this.

	* Non-compatible API change: Removed public method
	QPDF::trimTrailerForWrite, which was only intended for use by
	QPDFWriter and which is no longer used.

2012-12-26  Jay Berkenbilt  <ejb@ql.org>

	* Add new fields to QPDF::EncryptionData to support newer
	encryption formats (V=5, R=5 and R=6)

	* Non-compatible API change: Change public nested class
	QPDF::EncryptionData to make all member fields private and to add
	method calls.  This is a non-compatible API change, but changing
	EncryptionData is necessary to support newer encryption formats,
	and making this change will prevent the need from making a
	non-compatible change in the future if new fields are added.  A
	public nested class should never have had public members to begin
	with.

2012-12-25  Jay Berkenbilt  <ejb@ql.org>

	* Allow PDF header to appear anywhere in the first 1024 bytes of
	the file as recommended in the implementation notes of the Adobe
	version of the PDF spec.

2012-11-20  Jay Berkenbilt  <ejb@ql.org>

	* Add zlib and libpcre to Requires.private in the pkg-config file
	to support static linking.  Thanks Tobias Hoffmann for pointing
	out the omission.

	* Ignore (with warning) non-freed objects in the xref table whose
	offset is 0.  Some PDF producers (incorrectly) do this.	 See
	https://bugs.linuxfoundation.org/show_bug.cgi?id=1081.

2012-09-23  Jay Berkenbilt  <ejb@ql.org>

	* Add public methods QPDF::processInputSource and
	QPDFWriter::setOutputPipeline to allow users to read from custom
	input sources and to write to custom pipelines.	 This allows the
	maximum flexibility in sources for reading and writing PDF files.

2012-09-06  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.2: release

	* Add new method QPDFWriter::setExtraHeaderText to add extra text,
	such as application-specific comments, to near the beginning of a
	PDF file.  For linearized files, this appears after the
	linearization parameter dictionary.  For non-linearized files, it
	appears right after the PDF header and non-ASCII comment.

	* Make it possible to write the same QPDF object with two
	different QPDFWriter objects that have both called
	setLinearization(true) by making private method
	QPDF::calculateLinearizationData() properly initialize its state.

	* Bug fix: Writing after calling QPDFWriter::setOutputMemory()
	would cause a segmentation fault because of an internal field not
	being initialized, rendering that method useless.  This has been
	corrected.

2012-08-11  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.1: release

	* Bug fix: let EOF terminate a literal token as well as
	whitespace or comments.

2012-07-31  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.0: release

2012-07-29  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.rc1: release

2012-07-25  Jay Berkenbilt  <ejb@ql.org>

	* From Tobias: add QPDFObjectHandle::replaceStreamData that takes
	a std::string analogous to the QPDFObjectHandle::newStream that
	takes a string that was added earlier.

2012-07-21  Jay Berkenbilt  <ejb@ql.org>

	* Change configure to have image comparison tests disabled by
	default.  Update README and README.maintainer with information
	about running them.

	* Add --pages command-line option to qpdf to enable page-based
	merging and splitting.

	* Add new method QPDFObjectHandle::replaceDict to replace a
	stream's dictionary.  Use with caution; see comments in
	QPDFObjectHandle.hh.

	* Add new method QPDFObjectHandle::parse for creation of
	QPDFObjectHandle objects from string representations of the
	objects.  Thanks to Tobias Hoffmann for the idea.

2012-07-15  Jay Berkenbilt  <ejb@ql.org>

	* add new QPDF::isEncrypted method that returns some additional
	information beyond other versions.

	* libqpdf/QPDFWriter.cc: fix copyEncryptionParameters to fix the
	minimum PDF version based on other file's encryption needs.  This
	is a fix to code added on 2012-07-14 and did not impact previously
	released code.

	* libqpdf/QPDFWriter.cc (copyEncryptionParameters): Bug fix: qpdf
	was not preserving whether or not AES encryption was being used
	when copying encryption parameters.  The file would still have
	been properly encrypted, but a file that started off encrypted
	with AES could have become encrypted with RC4.

2012-07-14  Jay Berkenbilt  <ejb@ql.org>

	* QPDFWriter: add public copyEncryptionParameters to allow copying
	encryption parameters from another file.

	* QPDFWriter: detect if the user has inserted an indirect object
	from another QPDF object and throw an exception directing the user
	to copyForeignObject.

2012-07-11  Jay Berkenbilt  <ejb@ql.org>

	* Added new APIs to copy objects from one QPDF to another.  This
	includes letting QPDF::addPage() (and QPDF::addPageAt()) accept a
	page object from another QPDF and adding
	QPDF::copyForeignObject().  See QPDF.hh for details.

	* Add method QPDFObjectHandle::getOwningQPDF() to return the QPDF
	object associated with an indirect QPDFObjectHandle.

	* Add convenience methods to QPDFObjectHandle: assertIndirect(),
	isPageObject(), isPagesObject()

	* Cache when QPDF::pushInheritedAttributesToPage() has been called
	to avoid traversing the pages trees multiple times.  This state is
	cleared by QPDF::updateAllPagesCache() and ignored by
	QPDF::flattenPagesTree().

2012-07-08  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::newReserved to create a reserved object
	and QPDF::replaceReserved to replace it with a real object.
	QPDFObjectHandle::newReserved reserves an object ID in a QPDF
	object and ensures that any references to it remain unresolved.
	When QPDF::replaceReserved is later called, previous references to
	the reserved object will properly resolve to the replaced object.

2012-07-07  Jay Berkenbilt  <ejb@ql.org>

	* NOTE: BREAKING API CHANGE.  Remove previously required length
	parameter from the version QPDFObjectHandle::replaceStreamData
	that uses a stream data provider.  Prior to qpdf 3.0.0, you had to
	compute the stream length in advance so that qpdf could internally
	verify that the stream data had the same length every time the
	provider was invoked.  Now this requirement is enforced a
	different way, and the length parameter is no longer required.
	Note that I take API-breaking changes very seriously and only did
	it in this case since the lack of need to know length in advance
	could significantly simplify people's code.  If you were
	previously going to a lot of trouble to compute the length of the
	new stream data in advance, you now no longer have to do that.
	You can just drop the length parameter and remove any code that
	was previously computing the length.  Thanks to Tobias Hoffmann
	for pointing out how annoying the original interface was.

2012-07-05  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFWriter methods to write to an already open stdio FILE*.
	Implementation and idea area based on contributions from Tobias
	Hoffmann.

2012-07-04  Jay Berkenbilt  <ejb@ql.org>

	* Accept changes from Tobias Hoffmann: add public method
	QPDF::pushInheritedAttributesToPage including warnings for
	non-inherited keys that may be discarded from /Pages by
	non-conformant PDF files when the /Pages tree is flattened.

2012-06-27  Jay Berkenbilt  <ejb@ql.org>

	* Add Pl_Concatenate pipeline for stream concatenation also
	implemented by Tobias Hoffmann.	 Also added test code
	(libtests/concatenate.cc).

	* Add new methods implemented by Tobias Hoffmann:
	QPDFObjectHandle::newReal(double) and
	QPDFObjectHandle::newStream(QPDF*, std::string const&).

2012-06-26  Jay Berkenbilt  <ejb@ql.org>

	* Minor changes so that support for PDF files larger than 4GB
	works well with 32-bit and 64-bit Linux and also with 32-bit and
	64-bit Windows with both MSVC and mingw.

	* Rework internal methods for doing recovery of the cross
	reference tables for much greater efficiency both in terms of time
	and memory usage.

2012-06-24  Jay Berkenbilt  <ejb@ql.org>

	* Support PDF files larger than 4 GB.  This involved many changes
	to the ABI to increase the size of integer types used in various
	places as well as increasing the amount of padding used when
	creating linearized files.  Automated tests for large files are
	disabled by default.  Run ./configure --help for information on
	enabling them.	Running the tests requires 11 GB of free disk
	space and takes several minutes.

2012-06-22  Jay Berkenbilt  <ejb@ql.org>

	* examples/pdf-create.cc: Provide an example of creating a PDF
	from scratch.  This simple PDF has a single page with some text
	and an image.

	* Add empty QPDFObjectHandle factories for array and dictionary.
	With PDF-from-scratch capability, it is useful to be able to
	create empty arrays and dictionaries and add keys to them.
	Updated pdf_from_scratch.cc to use these interfaces.

2012-06-21  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDF::emptyPDF() to create an empty QPDF object suitable for
	adding pages and other objects to.  pdf_from_scratch.cc is test
	code that exercises it.

	* make/libtool.mk: Place user-specified CPPFLAGS and LDFLAGS later
	in the compilation so that if a user installs things in a
	non-standard place that they have to tell the build about, earlier
	versions of qpdf installed there won't break the build.	 Thanks to
	Macports for reporting this.  (Fixes bug 3468860.)

	* Instead of using off_t in the public APIs, use qpdf_offset_t
	instead.  This is defined as long long in qpdf/Types.h.	 If your
	system doesn't support long long, you can redefine it.

	* Add pkg-config files

	* QPDFObjectHandle: add shallowCopy() method

	* QPDF: add new APIs for adding and removing pages.  This includes
	addPage(), addPageAt(), and removePage().  Also a method
	updateAllPagesCache() is now available to force update of the
	internal pages cache if you should modify the pages structure
	manually.

	* QPDF: new processFile method that takes an open FILE*
	instead of a filename.

2012-06-20  Jay Berkenbilt  <ejb@ql.org>

	* Add new array mutation routines to QPDFObjectHandle.
	Implemented by Tobias Hoffmann.

	* Rework APIs that use size_t, off_t, and primitive integer types
	so that size_t is used for sizes of memory and off_t is used for
	file offsets.  Also set _FILE_OFFSET_BITS so that large files can
	be supported on 32-bit UNIX/Linux platforms.  The code assumes in
	places that sizeof(off_t) >= sizeof(size_t).  This resulted in
	non-compatible ABI changes and hopefully clears the way for QPDF
	to work with files that are larger than 4 GiB in size.

	* Add support for versioned symbols on ELF platforms.

	* Various fixes for gcc 4.7

2011-04-06  Jay Berkenbilt  <ejb@ql.org>

	* Fix PCRE to stop using deprecated (and now dropped) interfaces.

2011-12-28  Jay Berkenbilt  <ejb@ql.org>

	* 2.3.1: release

	* include <stdint.h> if available to support MSVC 2010

	* Since PCRE is not necessarily thread safe, don't declare any
	PCRE objects to be static.

	* Disregard stderr output from ghostscript when using it to
	compare images in the test suite; see comments in qpdf.test for
	details.

	* Fixed a few documentation errors.

2011-08-11  Jay Berkenbilt  <ejb@ql.org>

	* 2.3.0: release

	* include/qpdf/qpdf-c.h ("C"): add new methods
	qpdf_init_write_memory, qpdf_get_buffer_length, and
	qpdf_get_buffer to support writing to memory from the C API.

	* include/qpdf/qpdf-c.h ("C"): add new methods qpdf_get_info_key
	and qpdf_set_info_key for manipulating text fields of the /Info
	dictionary.

2011-08-10  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDFWriter.cc (copyEncryptionParameters): preserve
	whether metadata is encryption.	 This fixes part of bug 3173659:
	the password becomes invalid if qpdf copies an encrypted file with
	cleartext-metadata.

	* include/qpdf/QPDFWriter.hh: add a new constructor that takes
	only a QPDF reference and leaves specification of output for
	later.	Add methods setOutputFilename() to set the output to a
	filename or stdout, and setOutputMemory() to indicate that output
	should go to a memory buffer.  Add method getBuffer() to retrieve
	the buffer used if output was saved to a memory buffer.

	* include/qpdf/QPDF.hh: add methods replaceObject() and
	swapObjects() to allow replacement of an object and swapping of
	two objects by object ID.

	* include/qpdf/QPDFObjectHandle.hh: add new methods getDictAsMap()
	and getArrayAsVector() for returning the elements of a dictionary
	or an array as a map or vector.

2011-06-25  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.4: release

2011-06-23  Jay Berkenbilt  <ejb@ql.org>

	* make/libtool.mk (install): Do not strip executables and shared
	libraries during installation.	Leave that up to the packager.

	* configure.ac: disable -Werror by default.

2011-05-07  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDF_linearization.cc (isLinearized): remove unused
	offset variable, found by a gcc 4.6 warning.

2011-04-30  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.3: release

	* libqpdf/QPDF.cc (readObjectInternal): Accept the case of the
	stream keyword being followed by carriage return by itself.  While
	this is not permitted by the specification, there are PDF files
	that do this, and other readers can read them.

	* libqpdf/Pl_QPDFTokenizer.cc (processChar): When an inline image
	is detected, suspend normalization only up to the end of the
	inline image rather than for the remainder of the content stream.
	(Fixes qpdf-Bugs 3152169.)

2011-01-31  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDF.cc (readObjectAtOffset): use -1 rather than 0 when
	reading an object at a given to indicate that no object number is
	expected.  This allows xref recovery to proceed even if a file
	uses the invalid object number 0 as a regular object.

	* libqpdf/QPDF_linearization.cc (isLinearized): use -1 rather than
	0 as a sentinel for not having found the first object in the
	file.  Since -1 can never match the regular expression, this
	prevents an infinite loop when checking a file that starts with
	(erroneous) 0 0 obj.  (Fixes qpdf-Bugs-3159950.)

2010-10-04  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.2: release

	* include/qpdf/qpdf-c.h: Add qpdf_read_memory to C API to call
	QPDF::processMemoryFile.

2010-10-01  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.1: release

	* include/qpdf/QPDF.hh: Add setOutputStreams method to allow
	redirection of library-generated output/error to alternative
	streams.

	* include/qpdf/QPDF.hh: Add processMemoryFile method for
	processing a PDF file from a memory buffer instead of a file.

2010-09-24  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDF.cc: change private "file" method to be a
	PointerHolder<InputSource> to prepare qpdf for being able to work
	with PDF files loaded into memory in addition to working with
	files on disk.

	* include/qpdf/PointerHolder.hh: add operator* and operator->
	methods so that PointerHolder objects can be used like pointers.
	This is consistent with the smart pointer objects in the next
	revision of C++.

2010-09-05  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDF.cc (readObjectInternal): Recognize empty objects
	and treat them as null.

	* libqpdf/QPDF_Stream.cc (filterable): Handle inline image filter
	abbreviations as stream filter abbreviations.  Although this is
	not technically allowed by the PDF specification, table H.1 in the
	pre-ISO spec indicates that Adobe's readers accept them.  Thanks
	to Jian Ma <stronghorse@tom.com> for bringing this to my
	attention.

2010-08-14  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.0: release

	* Rename README.windows to README-windows.txt and convert its line
	endings to Windows-style line endings.	Also mention Jian Ma's VC6
	port in the manual and README-windows.txt.

2010-08-09  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::getRawStreamData to return raw
	(unfiltered) stream data.

2010-08-08  Jay Berkenbilt  <ejb@ql.org>

	* 2.2.rc1: release

2010-08-05  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::addPageContents, a convenience routine for
	appending or prepending new streams to a page's content streams.
	The "pdf-double-page-size" example illustrates its use.

	* Add new methods to QPDFObjectHandle: replaceStreamData and
	newStream.  These methods allow users of the qpdf library to add
	new streams and to replace data of existing streams.  The
	"pdf-double-page-size" and "pdf-invert-images" examples illustrate
	their use.

2010-06-06  Jay Berkenbilt  <ejb@ql.org>

	* Fix memory leak for QPDF objects whose underlying PDF objects
	contain circular references.  Thanks to Jian Ma
	<stronghorse@tom.com> for calling my attention to the memory leak.

2010-04-25  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.5: release

	* libqpdf/QPDF_encryption.cc (compute_encryption_key): remove
	restrictions on length of file identifier string.  (Fixes
	qpdf-Bugs-2991412.)

2010-04-18  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.4: release

	* libqpdf/QPDFWriter.cc (writeLinearized): the padding calculation
	fix in 2.1.2 was applied in only one place but it was needed in
	two places since there are actually two cross reference streams in
	a linearized file.  The new padding calculation is now used for
	both streams.  Hopefully this should put an end to linearization
	padding problems.  (Fixes qpdf-Bugs-2979219.)

2010-04-10  Jay Berkenbilt  <ejb@ql.org>

	* qpdf/qpdf.cc (main): Since qpdf --check only checks syntax and
	stream encoding without doing any semantic checks, make the output
	clearer when no errors around found.  This is inspired by
	qpdf-Bugs-2983225.

2010-03-27  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.3: release

	* libqpdf/QPDF_optimization.cc (flattenScalarReferences): Flatten
	scalar references for unreferenced objects as well as those seen
	during traversal of the file.  This matters when preserving object
	streams that contain unreferenced objects with indirect scalars.
	(Fixes qpdf-Bugs-2974522.)  Updated TODO with a description of a
	possibly better fix involving removal of flattenScalarReferences.

	* libqpdf/Pl_AES_PDF.cc (finish): Don't complain if an AES input
	buffer is not a multiple of 16 bytes.  Instead, just pad with
	nulls and hope for the best.  PDF files have been encountered "in
	the wild" that contain AES buffers that aren't a multiple of 16
	bytes.

2010-01-24  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.2: release

	* libqpdf/QPDFWriter.cc: fix logic error in padding calculation.
	When writing linearized files with cross reference streams, the
	padding calculation failed to take differences in sizes of
	compressed data between pass 1 and pass 2 into consideration.

2009-12-14  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.1: release

	* qpdf/qtest/qpdf.test: improve test for acroread to make sure it
	actually works and is not just present in the path.

2009-12-13  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/qpdf/Pl_AES_PDF.hh: include <stdint.h>, if available, so
	we have valid definitions of uint32_t.

2009-10-30  Jay Berkenbilt  <ejb@ql.org>

	* 2.1: release

	* libqpdf/QPDF.cc: be more forgiving of extraneous whitespace in
	the xref table and while recovering from error conditions.

2009-10-26  Jay Berkenbilt  <ejb@ql.org>

	* Work around failure of PCRE test case; this test case exercises
	an aspect of PCRE that qpdf does not use, and the test fails with
	the version of PCRE on Red Hat Enterprise Linux 5, so we ignore
	failure on this particular test case.

	* Fix RPM .spec file to include "C" examples

2009-10-24  Jay Berkenbilt  <ejb@ql.org>

	* 2.1.rc1: release

	* Provide interfaces for getting qpdf's own version number

2009-10-19  Jay Berkenbilt  <ejb@ql.org>

	* include/qpdf/QPDF.hh (QPDF): getWarnings now returns a list of
	QPDFExc rather than a list of strings.	This way, warnings may be
	inspected in more detail.

	* Include information about the last object read in most error
	messages.  Most of the time, this will provide a good hint as to
	which object contains the error, but it's possible that the last
	object read may not necessarily be the one that has the error if
	the erroneous object was previously read and cached.

2009-10-18  Jay Berkenbilt  <ejb@ql.org>

	* If forcing version, disable object stream creation and/or
	encryption if previous specifications are incompatible with new
	version.  It is still possible that PDF content, compression
	schemes, etc., may be incompatible with the new version, but at
	least this way, older viewers will at least have a chance.

	* libqpdf/QPDFWriter.cc (unparseObject): avoid compressing
	Metadata streams if possible.

2009-10-13  Jay Berkenbilt  <ejb@ql.org>

	* Upgrade embedded qtest to version 1.4, which allows the test
	suite to be run in Windows with MSYS and ActiveState Perl rather
	than requiring Cygwin perl.

2009-10-04  Jay Berkenbilt  <ejb@ql.org>

	* Implement support AES encrypt and crypt filters.  Implementation
	is not fully tested due to lack of test data but has been tested
	for several cases.

2009-10-04  Jay Berkenbilt  <ejb@ql.org>

	* Add methods to QPDFWriter and corresponding command line
	arguments to qpdf to set the minimum output PDF version and also
	to force the version to a particular value.

	* libqpdf/QPDF.cc (processXRefStream): warn and ignore extra xref
	stream entries when stream is larger than reported size.  This
	used to be a fatal error.  (Fixes qpdf-Bugs-2872265.)

2009-09-27  Jay Berkenbilt  <ejb@ql.org>

	* Add several methods to query permissions controlled by the
	encryption dictionary.	Note that qpdf does not enforce these
	permissions even though it allows the user to query them.

	* The function QPDF::getUserPassword returned the user password
	with the required padding as specified by the PDF specification.
	This is seldom useful to users.	 This function has been replaced
	by QPDF::getPaddedUserPassword.	 Call the new
	QPDF::getTrimmedUserPassword to retrieve the user password in a
	human-readable format.

	* qpdf/qpdf.cc (main): qpdf --check now prints the PDF version
	number in addition to its other output.

2009-09-26  Jay Berkenbilt  <ejb@ql.org>

	* Removed all references to QEXC; now using std::runtime_error and
	std::logic_error and their subclasses for all exceptions.

2009-05-03  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.6: release

	* libqpdf/QPDF_Stream.cc (filterable): ignore /DecodeParms if it's
	not a type we recognize.  (Fixes qpdf-Bugs-2779746.)

2009-03-10  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.5: release

2009-03-09  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/Pl_LZWDecoder.cc: adjust LZWDecoder full table
	detection, now having been able to adequately test boundary
	conditions both and with and without early code change.	 Also
	compared implementation with other LZW decoders.

2009-03-08  Jay Berkenbilt  <ejb@ql.org>

	* qpdf/fix-qdf (write_ostream): Adjust offsets while writing
	object streams to account for changes in the length of the
	dictionary and offset tables.

	* qpdf/qpdf.cc (main): In check mode, in addition to checking
	structure of file, attempt to decode all stream data.

	* libqpdf/QPDFWriter.cc (QPDFWriter::writeObject): In QDF mode,
	write a comment to the QDF file before each object that indicates
	the object ID of the corresponding object from the original file.
	Add --no-original-object-ids flag to qpdf and
	setSuppressOriginalObjectIDs() method to QPDFWriter to turn this
	behavior off.

	* libqpdf/QPDF.cc (QPDF::pipeStreamData): Issue a warning instead
	of failing if there is a problem found while decoding stream.

	* qpdf/qpdf.cc: Exit with a status of 3 if warnings were found
	regardless of what mode we're in.

2009-02-21  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.4: release

2009-02-20  Jay Berkenbilt  <ejb@ql.org>

	* Fix many typos in comments and strings.

	* qpdf/qpdf.cc: in --check mode, if there are warnings but no
	errors, exit with a status of 3.

	* libqpdf/QPDF.cc (QPDF::insertXrefEntry): when recovering the
	cross-reference table, have objects we encounter later in the file
	supersede those we found earlier.  This improves the chances of
	being able to recover appended files with damaged cross-reference
	tables.

2009-02-19  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/Pl_LZWDecoder.cc: correct logic error for previously
	untested case of running the LZW decoder without the "early code
	change" flag.  Thanks to a bug report from "Atom Smasher", I
	finally was able to obtain an input stream compressed in this way.

2009-02-15  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.3: release

2008-12-11  Jay Berkenbilt  <ejb@ql.org>

	* qpdf/qpdf.cc (main): Accept -help and -version as well as --help
	and --version

2008-11-23  Jay Berkenbilt  <ejb@ql.org>

	* Include stdio.h in a few files for proper compilation with (yet
	to be released) gcc 4.4

	* updated embedded qtest to version 1.3

	* libqpdf/QPDF_String.cc (QPDF_String::getUTF8Val): handle
	UTF-16BE properly rather than just treating the string as a string
	of 16-bit characters.

2008-06-30  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.2: release

	* updated embedded qtest to version 1.2 (includes previous
	changes)

2008-06-07  Jay Berkenbilt  <ejb@ql.org>

	* qpdf/qtest/qpdf/diff-encrypted: change == to = so that the test
	suite passes when /bin/sh is not bash

2008-05-07  Jay Berkenbilt  <ejb@ql.org>

	* qtest/bin/qtest-driver (run_test): increase timeout for qtest to
	be more tolerant of slow machines

2008-05-06  Jay Berkenbilt  <ejb@ql.org>

	* 2.0.1: release

	* make/rules.mk: fix logic with .dep generation for .lo files so
	that dependencies work properly with libtool

2008-05-05  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/qpdf/MD5.hh: fix header to be 64-bit clean

	* configure.ac: add tests for sized integer types

2008-05-04  Jay Berkenbilt  <ejb@ql.org>

	* libqpdf/QPDF_encryption.cc: do not assume size_t is unsigned int

	* qpdf/qtest/qpdf.test: removed locale-specific tests.	These were
	really to check bugs in perl 5.8.0 and are obsolete now.  They
	also make the test suite fail in some environments that don't have
	all the locales fully configured.

	* various: updated several files for gcc 4.3 by adding missing
	includes (string.h, stdlib.h)

2008-04-26  Jay Berkenbilt  <ejb@ql.org>

	* 2.0: initial public release